Вопрос или проблема
Я пытаюсь создать плагин с виджетом, где я могу отмечать / проверять посты, возможно, старые посты, которые я хочу вернуть к жизни. Я хочу добавить флажок в поле перед заголовком, как я пытаюсь показать в примере ниже.
И затем, если я отмечаю флажок для поста, он будет отображаться в виджете на передней стороне моего сайта. Что-то вроде “Вы видели это?” или “Вы это помните?” С заголовком поста, представительным изображением и ссылкой на пост.
Я нашел много плагинов, которые позволяют пользователям оставлять отзывы о постах, и затем я могу показать пост с наибольшим количеством отзывов / звезд.
Это не то, что я хочу… Я хочу, чтобы администратор / редактор и т.д. помечали / проверяли посты, которые, как они думают, зрители / пользователи хотят увидеть снова.
Может быть, карусель, которая показывает 3-5 постов, которые администратор отметил, например, по 20 секунд каждый. Но это могло быть в другой версии.
Прежде всего, мне нужно найти способ сделать флажок в каждом посте в списке постов и позволить виджету на передней стороне показать пост, который я отметил.
Кто-нибудь понимает, что мне нужно и как это сделать?
Чтобы начать:
<?php
/*
Plugin Name: Плагин с флажком
Plugin URI: https://www.yourawesomedomain.de/plugins/
Description: Плагин с флажком для отметки постов.
Version: 0.0.1
Author: bjovaar
Author URI: https://www.bjovaar.maybe/
License: GPL2
License URI: https://www.bjovaar.de/disclaimer
Text Domain: bjovaar
Domain Path: /languages
*/
if(!defined('ABSPATH')) {
exit('Нет доступа');
}
// Эта переменная пути может быть использована для настройки текстового домена, игнорируйте, если не нужно
$dir = plugin_dir_path(__FILE__);
add_action('manage_post_posts_custom_column', function($column_key, $post_id) {
// $checked_post должен содержать ваш результат из базы данных
// который я не показывал, чтобы сэкономить
$checked_post = get_post_meta($post_id, 'checked_post', true);
?>
<input type="checkbox" value="true" checked>
<?php
}, 10, 2);
// Добавить заголовок в верхней и нижней частях колонки
add_filter('manage_post_posts_columns', function($columns) {
return array_merge($columns, ['verified' => __('Отмеченные посты', 'bjovaar')]);
});
Код выше создаст плагин и добавит флажок в вашу админ-панель в списке постов. Первый add_action “manage_post_posts_custom_column” вызовет функцию и создаст новый столбец. Пожалуйста, прочитайте раздел “дополнительная информация” для получения дальнейших деталей этого хуки. Этот столбец также может быть rearranged путем сортировки массива (в зависимости от того, где вы хотите его).
Теперь, на этом этапе, должен возникнуть следующий вопрос, во время разработки этой вещи (с моей точки зрения).
Какой хук вы хотите использовать на обзоре, чтобы сохранить ваше поле ввода, поскольку на этой странице нет хука “save_post”.
Единственное решение, о котором я могу сейчас подумать, – это зарегистрировать rest endpoint и вызвать ajax-запрос.
Это не полный ответ, но должно показать вам путь вперед..
Ответ или решение
Для создания плагина, который позволит администраторам отмечать посты с помощью чекбоксов в админ-панели WordPress, а затем отображать эти отмеченные посты в виджете на фронтенде, потребуется выполнить несколько шагов. Давайте разберем этот процесс подробно, чтобы достичь желаемого результата.
Шаг 1: Создание структуры плагина
Сначала создадим файл вашего плагина, например checkbox-plugin.php
, и добавим необходимые комментарии в начале:
<?php
/*
Plugin Name: The Checkbox Plugin
Plugin URI: https://www.yourawesomedomain.de/plugins/
Description: A plugin with a checkbox to mark posts.
Version: 0.0.1
Author: bjovaar
Author URI: https://www.bjovaar.maybe/
License: GPL2
License URI: https://www.bjovaar.de/disclaimer
Text Domain: bjovaar
Domain Path: /languages
*/
if (!defined('ABSPATH')) {
exit('No access');
}
Шаг 2: Добавление чекбоксов в список постов
Чтобы добавить чекбоксы перед заголовками постов, используем хук manage_posts_custom_column
и manage_posts_columns
. Мы также должны добавить соответствующие мета-поля для хранения состояния этих чекбоксов.
add_filter('manage_post_posts_columns', function($columns) {
$columns['checked_post'] = __('Checked', 'bjovaar');
return $columns;
});
add_action('manage_post_posts_custom_column', function($column_key, $post_id) {
if ($column_key === 'checked_post') {
$checked_post = get_post_meta($post_id, 'checked_post', true);
echo '<input type="checkbox" class="post_checkbox" data-postid="' . $post_id . '" ' . checked($checked_post, 'true', false) . ' />';
}
}, 10, 2);
Шаг 3: Сохранение состояния чекбоксов
Следующий шаг заключается в сохранении состояния чекбоксов. Мы создадим REST API endpoint и добавим AJAX-запрос для сохранения состояния.
add_action('rest_api_init', function () {
register_rest_route('checkbox-plugin/v1', '/toggle-check/', array(
'methods' => 'POST',
'callback' => 'toggle_post_check',
'permission_callback' => '__return_true',
));
});
function toggle_post_check(WP_REST_Request $request) {
$post_id = intval($request['postId']);
$current_status = get_post_meta($post_id, 'checked_post', true);
$new_status = $current_status === 'true' ? 'false' : 'true';
update_post_meta($post_id, 'checked_post', $new_status);
return rest_ensure_response(array('status' => $new_status));
}
Шаг 4: Интеграция JavaScript для AJAX
Теперь добавим JavaScript для обработки события нажатия на чекбокс:
add_action('admin_enqueue_scripts', function() {
wp_enqueue_script('checkbox-plugin-script', plugin_dir_url(__FILE__) . 'js/script.js', array('jquery'), null, true);
});
Файл js/script.js
:
jQuery(document).ready(function($) {
$('.post_checkbox').on('change', function() {
var postId = $(this).data('postid');
$.post('/wp-json/checkbox-plugin/v1/toggle-check/', {
postId: postId
});
});
});
Шаг 5: Создание виджета для отображения отмеченных постов
Теперь создадим виджет, который будет отображать все отмеченные посты на фронтенде. Сначала зарегистрируем виджет:
add_action('widgets_init', function() {
register_widget('Checked_Posts_Widget');
});
class Checked_Posts_Widget extends WP_Widget {
public function __construct() {
parent::__construct('checked_posts_widget', __('Checked Posts', 'bjovaar'), array('description' => __('Displays checked posts.', 'bjovaar')));
}
public function widget($args, $instance) {
echo $args['before_widget'];
$query = new WP_Query(array(
'meta_key' => 'checked_post',
'meta_value' => 'true',
'posts_per_page' => 5,
));
if ($query->have_posts()) {
echo '<div class="checked-posts-widget">';
while ($query->have_posts()) {
$query->the_post();
echo '<div class="checked-post">';
echo '<a href="' . get_the_permalink() . '">' . get_the_title() . '</a>';
echo get_the_post_thumbnail();
echo '</div>';
}
echo '</div>';
}
echo $args['after_widget'];
}
}
Шаг 6: Дополнительные улучшения
- Карусель отображения: В будущем, вы можете использовать JavaScript-библиотеки, такие как Slick или Owl Carousel, для создания карусели из отображаемых постов.
- Стилизация виджета: Добавьте CSS для стилизации внешнего вида вашего виджета.
Заключение
С помощью вышеописанных шагов вы сможете создать плагин для WordPress, который добавляет чекбоксы в админ-панели для постов и отображает отмеченные посты в виджете на фронтенде вашего сайта. Этот простой механизм позволяет администраторам легко управлять контентом, который они хотят продвигать, и улучшает взаимодействие пользователей с вашим сайтом.