Как создать виджет, который использует параметры в глобальном масштабе и для каждого поста? - PullRequest
3 голосов
/ 21 сентября 2011

Я создал виджет, и пока он отображается только на главной странице.Однако я хочу, чтобы он отображался на странице сообщения, и только если пользователь ввел параметр.

class My_Widget extends WP_Widget {
    function __construct() {
        $widget_ops = array ('description' => __ ( 'Lorem ipsum' ) );
        parent::__construct ( 'exampl', __ ( 'Example' ), $widget_ops );
    }
    function widget($args, $instance) {
        extract ( $args );
        $title = apply_filters ( 'widget_title', empty ( $instance ['title'] ) ? ' ' : $instance ['title'] );
        # Before the widget
        echo $before_widget;

        # The title
        if ($title)
            echo $before_title . $title . $after_title;

        # Make the Hello World Example widget
        echo isset($instance['foo'])?$instance['foo']:'foo';
        echo isset($instance['bar'])?$instance['bar']:'bar';

        # After the widget
        echo $after_widget;

    }
    //The global widget options
    function form($instance){
        /* Set up some default widget settings. */
        $defaults = array( 'foo' => 'oof', 'bar' => 'rab');
        $instance = wp_parse_args( (array) $instance, $defaults ); ?>
        <p>
            <label for="<?php echo $this->get_field_id( 'foo' ); ?>"><!--shortened... -->
        </p>
        <?php 
    }
}

function my_init() {
    register_widget ( 'My_Widget' );
}
add_action ( "widgets_init", "my_init" );

Теперь виджет отображается на главной странице справа, параметры по умолчанию обрабатываются правильно.

Однако на странице сообщения оно не отображается.(«Привет, мир! Добро пожаловать в WordPress. Это ваш первый пост ...») A) Как сделать так, чтобы он отображался только на странице поста B) Как я могу управлять параметрами на уровне поста

Пример: Глобальная настройка «цвет» должна быть «зеленой», управляемой на странице виджетов.однако на странице поста я хочу текстовое поле "poemoftheday", если оно не пустое, оно должно отображаться на боковой панели, используя глобальный "color" 'green', но в зависимости от поста, "poemoftheday" будет другим или отсутствует

Мои проблемы Все термины и версии WordPress очень затруднили поиск правильного текущего решения.Я работаю над этим уже 7 часов, и я действительно застрял.Я не прошу людей писать мне код, но мне нужно знать правильные термины и методы, которые я должен использовать.Указатели на учебные пособия / документацию, которые решают, соответствуют моим требованиям, мы очень ценим (существует множество обучающих программ, но все они ведут себя не так, как я ищу)

Визуально
This is where the global configuration is, great
^ Вот где глобальная конфигурация, отлично


This is where I'd like to have the per post configuration
^ Здесь я бы хотел получитьза пост конфигурации


This is where it's appearing right now, no good
^ Это то место, где оно появляется прямо сейчас - отображается хорошее, плохое положение


This is where I'd like it to appear ^ Вот где я хотел бы, чтобы оно появилось

1 Ответ

1 голос
/ 26 сентября 2011

Итак, вот как я решил это через 5 дней.

Для записи в магазин per_post я должен был использовать функцию

  • В своем конструкторе класса я добавил хук add_action ( 'add_my_meta_box', array (__CLASS__, 'add_my_meta_box') );
  • создать функцию обратного вызова add_my_meta_box($page) в моем классе
  • В этом обратном вызове среди прочего add_meta_box ( 'My Widget', 'My box', array (__CLASS__, 'render_meta_box' ), $page);

Все значения считываются и сохраняются с global $post; и функциями wordpress get_post_meta ($post->ID, 'my_var',true ) и update_post_meta ($post->ID, 'my_var', $value )

Чтобы убедиться, что мой виджет появляется только на одной странице поста, я использовал чек if(is_single()) перед отображением виджета

...