CanVas
@CanVas
Веб-мастер

Как сделать свою функцию вывода виджетов в wordpress?

Цель:
Сделать свой вывод виджетов, таким образом:

<ul>
<li>Widget 1 title</li>
<li>Widget 2 title</li>
</ul>
<div>
<div>Widget 1 content</div>
<div>Widget 2 content</div>
</div>


Допустим я скопировал функцию dynamic_sidebar в functions.php своей темы. Что дальше?

function tab_dynamic_sidebar($index = 1) {
    global $wp_registered_sidebars, $wp_registered_widgets;

    if ( is_int($index) ) {
        $index = "sidebar-$index";
    } else {
        $index = sanitize_title($index);
        foreach ( (array) $wp_registered_sidebars as $key => $value ) {
            if ( sanitize_title($value['name']) == $index ) {
                $index = $key;
                break;
            }
        }
    }

    $sidebars_widgets = wp_get_sidebars_widgets();
    if ( empty( $wp_registered_sidebars[ $index ] ) || empty( $sidebars_widgets[ $index ] ) || ! is_array( $sidebars_widgets[ $index ] ) ) {
        /** This action is documented in wp-includes/widgets.php */
        do_action( 'dynamic_sidebar_before', $index, false );
        /** This action is documented in wp-includes/widgets.php */
        do_action( 'dynamic_sidebar_after',  $index, false );
        /** This filter is documented in wp-includes/widgets.php */
        return apply_filters( 'dynamic_sidebar_has_widgets', false, $index );
    }

    /**
     * Fires before widgets are rendered in a dynamic sidebar.
     *
     * Note: The action also fires for empty sidebars, and on both the front-end
     * and back-end, including the Inactive Widgets sidebar on the Widgets screen.
     *
     * @since 3.9.0
     *
     * @param int|string $index       Index, name, or ID of the dynamic sidebar.
     * @param bool       $has_widgets Whether the sidebar is populated with widgets.
     *                                Default true.
     */
    do_action( 'dynamic_sidebar_before', $index, true );
    $sidebar = $wp_registered_sidebars[$index];

    $did_one = false;

foreach ( (array) $sidebars_widgets[$index] as $id ) {
        if ( !isset($wp_registered_widgets[$id]) ) continue;

        $params = array_merge(
            array( array_merge( $sidebar, array('widget_id' => $id, 'widget_name' => $wp_registered_widgets[$id]['name']) ) ),
            (array) $wp_registered_widgets[$id]['params']
        );

        $params = apply_filters( 'dynamic_sidebar_params', $params );

        $alloptions = get_option( 'widget_'.$wp_registered_widgets[$id]['callback'][0]->widget_id);
        $options = $alloptions[$wp_registered_widgets[$id]['params'][0]['number']];
        echo '<pre>';

        //var_dump($wp_registered_widgets[$id]);
        //var_dump($options);
        var_dump($options);
        echo '</pre>';
        /**/
    }

    foreach ( (array) $sidebars_widgets[$index] as $id ) {

        if ( !isset($wp_registered_widgets[$id]) ) continue;

        $params = array_merge(
            array( array_merge( $sidebar, array('widget_id' => $id, 'widget_name' => $wp_registered_widgets[$id]['name']) ) ),
            (array) $wp_registered_widgets[$id]['params']
        );

        // Substitute HTML id and class attributes into before_widget
        $classname_ = '';
        foreach ( (array) $wp_registered_widgets[$id]['classname'] as $cn ) {
            if ( is_string($cn) )
                $classname_ .= '_' . $cn;
            elseif ( is_object($cn) )
                $classname_ .= '_' . get_class($cn);
        }
        $classname_ = ltrim($classname_, '_');
        $params[0]['before_widget'] = sprintf($params[0]['before_widget'], $id, $classname_);

        /**
         * Filter the parameters passed to a widget's display callback.
         *
         * Note: The filter is evaluated on both the front-end and back-end,
         * including for the Inactive Widgets sidebar on the Widgets screen.
         *
         * @since 2.5.0
         *
         * @see register_sidebar()
         *
         * @param array $params {
         *     @type array $args  {
         *         An array of widget display arguments.
         *
         *         @type string $name          Name of the sidebar the widget is assigned to.
         *         @type string $id            ID of the sidebar the widget is assigned to.
         *         @type string $description   The sidebar description.
         *         @type string $class         CSS class applied to the sidebar container.
         *         @type string $before_widget HTML markup to prepend to each widget in the sidebar.
         *         @type string $after_widget  HTML markup to append to each widget in the sidebar.
         *         @type string $before_title  HTML markup to prepend to the widget title when displayed.
         *         @type string $after_title   HTML markup to append to the widget title when displayed.
         *         @type string $widget_id     ID of the widget.
         *         @type string $widget_name   Name of the widget.
         *     }
         *     @type array $widget_args {
         *         An array of multi-widget arguments.
         *
         *         @type int $number Number increment used for multiples of the same widget.
         *     }
         * }
         */
        $params = apply_filters( 'dynamic_sidebar_params', $params );

        $callback = $wp_registered_widgets[$id]['callback'];

        /**
         * Fires before a widget's display callback is called.
         *
         * Note: The action fires on both the front-end and back-end, including
         * for widgets in the Inactive Widgets sidebar on the Widgets screen.
         *
         * The action is not fired for empty sidebars.
         *
         * @since 3.0.0
         *
         * @param array $widget_id {
         *     An associative array of widget arguments.
         *
         *     @type string $name                Name of the widget.
         *     @type string $id                  Widget ID.
         *     @type array|callback $callback    When the hook is fired on the front-end, $callback is an array
         *                                       containing the widget object. Fired on the back-end, $callback
         *                                       is 'wp_widget_control', see $_callback.
         *     @type array          $params      An associative array of multi-widget arguments.
         *     @type string         $classname   CSS class applied to the widget container.
         *     @type string         $description The widget description.
         *     @type array          $_callback   When the hook is fired on the back-end, $_callback is populated
         *                                       with an array containing the widget object, see $callback.
         * }
         */
        do_action( 'tab_dynamic_sidebar', $wp_registered_widgets[ $id ] );

        if ( is_callable($callback) ) {
            call_user_func_array($callback, $params);
            $did_one = true;
        }
    }

    /**
     * Fires after widgets are rendered in a dynamic sidebar.
     *
     * Note: The action also fires for empty sidebars, and on both the front-end
     * and back-end, including the Inactive Widgets sidebar on the Widgets screen.
     *
     * @since 3.9.0
     *
     * @param int|string $index       Index, name, or ID of the dynamic sidebar.
     * @param bool       $has_widgets Whether the sidebar is populated with widgets.
     *                                Default true.
     */
    do_action( 'dynamic_sidebar_after', $index, true );

    /**
     * Filter whether a sidebar has widgets.
     *
     * Note: The filter is also evaluated for empty sidebars, and on both the front-end
     * and back-end, including the Inactive Widgets sidebar on the Widgets screen.
     *
     * @since 3.9.0
     *
     * @param bool       $did_one Whether at least one widget was rendered in the sidebar.
     *                            Default false.
     * @param int|string $index   Index, name, or ID of the dynamic sidebar.
     */

    $did_one = apply_filters( 'dynamic_sidebar_has_widgets', $did_one, $index );

    return $did_one;
}

Получилось вытащить title виджетов.
Осталось в первом цикле проверить - выводится ли виджет, и убрать из второго цикла вывод title.
  • Вопрос задан
  • 998 просмотров
Пригласить эксперта
Ответы на вопрос 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Намекаю - виджеты и их данные хранятся в таблице wp_options. По умолчанию виджеты сохранены с опцией autoload = yes, то есть, когда он вам нужен, он уже загружен из БД в runtime. Забирайте данные с помощью функции get_option( 'widget_X' ), где Х - название вашего виджета. Хранятся данные в сериализованном виде, функция get_option прогонит их через maybe_unserialize(), так что на выходе получите массив.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы