WordPress: как назначить идентификатор виджета в разделе формы виджета? - PullRequest
0 голосов
/ 07 октября 2018

Я столкнулся с препятствием на пути к пользовательскому виджету, который я пишу для темы WP.Виджет извлекает список постов из пользовательского типа поста и использует расширенные настраиваемые поля для этого.Затем я вызываю get_template для отображения сообщения внутри виджета.

ACF требует, чтобы идентификатор виджета был включен в запрос поля, чтобы получить данные поля.То, что я пытаюсь сделать, это использовать имя сообщения, полученное из запроса ACF, чтобы изменить заголовок виджета на имя этого сообщения в серверной части WP.К сожалению, я не могу заставить его работать, потому что я не могу передать переменную ID в раздел формы виджета.Я прочитал Кодекс, искал стек и искал reddit.Это самый близкий к ответу ответ: https://wordpress.stackexchange.com/questions/42955/how-can-i-get-id-variable-in-widgets-form-function

Вот мой код:

<?php
// Creating the widget 
class theme_form_widget extends WP_Widget
{
    //Register widget with WordPress
    function __construct()
    {
        parent::__construct('theme_form_widget', // Base ID
            esc_html__('Theme Form Widget', 'text_domain'), // Name
            array(
            'description' => esc_html__('A Theme Form Widget', 'text_domain')
        ) // Args
            );
    }
    // Creating widget front-end
    // This is where the action happens
    public function widget($args, $instance)
    {
        //store the options in variables
        $option1 = $instance['option1']; // Option1 centers widget text
        $option2 = $instance['option2']; // Option2 enables widget drop shadow
        if (!empty($instance['option1']) && $instance['option2'] == null) {
            // class that centers widget text
            $class_to_add          = 'widget theme-form-widget-center';
            $class_to_add          = 'class="' . $class_to_add . '"';
            $args['before_widget'] = str_replace('class="widget widget_theme_form_widget"', $class_to_add, $args['before_widget']);
        } elseif ($instance['option1'] == null && !empty($instance['option2'])) {
            // class that enables widget drop shadow
            $class_to_add          = 'widget theme-form-widget-shadow';
            $class_to_add          = 'class="' . $class_to_add . '"';
            $args['before_widget'] = str_replace('class="widget widget_theme_form_widget"', $class_to_add, $args['before_widget']);
        } elseif (!empty($instance['option1']) && !empty($instance['option2'])) {
            // class that enables both centered text and drop shadow
            $class_to_add          = 'widget theme-form-widget-centershadow';
            $class_to_add          = 'class="' . $class_to_add . '"';
            $args['before_widget'] = str_replace('class="widget widget_theme_form_widget"', $class_to_add, $args['before_widget']);
        } else {
            // class for widget default style
            $class_to_add          = 'widget theme-form-widget-default';
            $class_to_add          = 'class="' . $class_to_add . '"';
            $args['before_widget'] = str_replace('class="widget widget_theme_form_widget"', $class_to_add, $args['before_widget']);
        }
        // before widget (defined by theme)
        echo $args['before_widget'];
        // declare variables for advanced custom fields
        $post_object                = get_field('widget_form_type', 'widget_' . $this->id); // gets array of post data
        $instance['post_object_id'] = $post_object->ID; // assigns post id to variable
        $instance['title']          = $post_object->post_title; //assigns post title to variable
        $page_template              = get_page_template_slug($post_object); // assigns post page template to variable
        $template_slug              = substr($page_template, 0, -4); // assigns template name to variable after stripping file type from name
        $instance['template_slug']  = $template_slug; //assigns stripped template name to variable
        if (!empty($instance['title'])) {
            echo $args['before_title'] . $instance['title'] . $args['after_title'];
        }
        get_template_part($instance['template_slug']); //retrieves post template for display in the widget
        // after widget (defined by theme)
        echo $args['after_widget'];
    }
    // Widget Backend 
    public function form($instance)
    {
        // Option 1 and option 2 are checkboxes to change the state of widget drop shadow and text alignment
        //Check if option1 exists, if its null, put "new option1" for use in the form
        if (isset($instance['option1'])) {
            $option1 = $instance['option1'];
        } else {
            $option1 = __('new option1', 'text_domain');
        }
        //Repeat for option2
        if (isset($instance['option2'])) {
            $option1 = $instance['option2'];
        } else {
            $option1 = __('new option2', 'text_domain');
        }
?>
//Widget checkboxes for text alignment and drop shadow on form
<p>
<input <?php checked((bool) $instance['option1'], true); ?> id="<?php echo esc_attr($this->get_field_id('option1')); ?>" name="<?php echo esc_attr($this->get_field_name('option1')); ?>" type="checkbox" />
<label for="<?php echo esc_attr($this->get_field_id('option1')); ?>">Center Justify Widget Content</label>
</p>

<p>
<input <?php checked((bool) $instance['option2'], true); ?> id="<?php echo esc_attr($this->get_field_id('option2')) ?>" name="<?php echo esc_attr($this->get_field_name('option2')); ?>" type="checkbox" />
<label for="<?php echo esc_attr($this->get_field_id('option2')); ?>">Turn On Widget Drop Shadow</label>
</p>

<?php
        if (!empty($instance['title'])) {
            $title = $posty_title;
        }
?>
//Attempting to assign post name to widget name here. It's not working, though.
<p>
<input  id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="hidden" value="<?php echo $posty_title; ?>">
</p>
<?php
    }
    // Updating widget replacing old instances with new
    public function update($new_instance, $old_instance)
    {
        $instance                   = array();
        $instance['option1']        = (!empty($new_instance['option1'])) ? strip_tags($new_instance['option1']) : '';
        $instance['option2']        = (!empty($new_instance['option2'])) ? strip_tags($new_instance['option2']) : '';
        $instance['post_object_id'] = (!empty($new_instance['post_object_id'])) ? strip_tags($new_instance['post_object_id']) : '';
        $instance['title']          = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : '';
        return $instance;
    }
} // Class theme_form_widget ends here
// Register and load the widget
add_action('widgets_init', function()
{
    register_widget('theme_form_widget');
});
?>

Я был бы признателен, если бы кто-то указал мне на мою ошибку, поэтому я мог бы извлечь уроки из нее.Заранее спасибо.

...