Я столкнулся с препятствием на пути к пользовательскому виджету, который я пишу для темы 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');
});
?>
Я был бы признателен, если бы кто-то указал мне на мою ошибку, поэтому я мог бы извлечь уроки из нее.Заранее спасибо.