Как вывести список страниц в своем плагине

Опубликовано: 01.09.2018

видео Как вывести список страниц в своем плагине

WP-Recall: Обзор страницы "Поля профиля" (overview of the "Profile Fields" page)

Представляю вашему вниманию очередную статью цикла «custom программирования на движке WordPress».



В прошлых статьях я уже рассказывал о том, как создать свой плагин на WordPress .

В этой, я расскажу о том, как вывести список страниц вашего сайта у себя на странице вашего плагина.

Зачем вам это?

Это я рассказываю в контексте статьи « Как создать плагин для WordPress ( часть 2 ) «.

В ней было описано создание плагина, который блокирует доступ к странице незалогиненым пользователям. Но имеется один недостаток — там ID страницы прописывается в коде вручную, и он один.

Оптимизация карточки товара интернет-магазина

Что ж, исправим ситуацию!

Для начала, на странице нашего плагина в админ-панели нам нужно создать элемент, куда мы будем выводить наши страницы.

Для нашего случая, я не знаю других, более подходящих элементов, чем выпадающий список <select>, а точнее его модификация — multiple.

Зайдем в паку плагина, и откроем на редакцию файл плагина с настройками settings.php .

Полный код файла settings.php будет выглядеть так:

<div class="wrapper-list-pages"><select multiple id="my_plugin_list_pages"></select></div> <?php $path = plugin_dir_path( __FILE__ ).'/my-restrict.php'; $data = get_plugin_data($path); $message = ( get_option('no_login_message') ) ? get_option('no_login_message') : '';?> <div class="wrapper"> <p class="my_plugin_header"><?=$data['Name']?></p> <div class="wrapper-list-pages"><select multiple id="my_plugin_list_pages"></select></div> <textarea class="my_message" placeholder="Enter your message here" ><?=$message?></textarea> <button id="my_plugin_save_button" class="button">Save settings</button> </div>

Для большего удобства и красоты будем использовать отличную разработку Select2. (Погуглите их сайт)

В функцию регистрации скриптов и стилей файла plugin.php добавим подключение Select2.

function admin_add_menu(){ add_menu_page( 'Settings My Cool Plugin', 'My Cool', 'manage_options', plugin_dir_path( __FILE__ ).'settings.php', ''); wp_enqueue_script( 'my_js', plugin_dir_url( __FILE__ ) . 'my_js.js', array('jquery')); wp_enqueue_script( 'select2_js', '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/js/select2.min.js'); wp_enqueue_style( 'my_css', plugin_dir_url( __FILE__ ) . 'my_css.css'); wp_enqueue_style( 'select2_css', '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/css/select2.min.css'); }

Теперь наш multiple select будет выглядеть красиво, и главное работать с ним намного удобней чем с обычным.

Сейчас он пуст и ждет список страниц. Не будем задерживаться на этом!

Добавим выборку страниц в код нашего файла plugin.php, где создадим новую ajax функцию:

add_action('wp_ajax_get_list_pages', 'my_plugin_get_list_pages'); function my_plugin_get_list_pages(){ global $wpdb; $result = $wpdb->get_results("SELECT ID, post_title FROM $wpdb-?>posts WHERE post_status = 'publish' AND post_type='page'"); $opt=''; foreach ($result as $key) { $opt.= " <option value='".$key-?>ID."'?>".$key->post_title." </option?>"; } echo $opt; wp_die(); }

В запросе мы получаем все ID и post_title (названия) страниц, которые имеют статус опубликованых. Затем все это загоняем в переменную $opt, придавая содержимому вид строки, которую впоследствии вернем нашему js-скрипту, который вставит это в наш multiple select. Фух! В доме который построил Джек.

Встретим нашу строку с данными и вставим ее в наш multiple select .

Откроем наш файл my_js.js на редакцию и накидаем функцию:

function get_pages_list(){ var data = { action: 'get_list_pages' }; jQuery.post( ajaxurl, data, function(response) { $('#my_plugin_list_pages').html(response).change(); }); }

Немного поясню:

$(‘#my_plugin_list_pages’).html(response).change(); — мы передаем строку в наш multiple select, а change() — эмулирует изменение элемента, как-будто юзер нажал на поле и что-то там выбрал.

Если все прошло хорошо, то при нажатии на элемент у нас появится выпадающий список страниц нашего сайта.

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

Отредактируем наш файл plugin.php следующим образом, добавив функцию сохранения и поправим функцию чтения списка:

add_action('wp_ajax_save_list_pages', 'my_plugin_save_list_pages'); function my_plugin_save_list_pages(){ $lp = sanitize_text_field( serialize($_POST['pages']) ); update_option( 'my_plugin_restrict_pages', $lp , false); wp_die(); }

Добавим в наш my_js.js файл функцию, которая будет выбирать наш список страниц для последующей передачи их в опцию ‘my_plugin_restrict_pages’, для дальнейшего хранения.

function save_list_pages(){ var data = { action: 'save_list_pages', pages: $('#my_plugin_list_pages').val() }; jQuery.post( ajaxurl, data, function(response) { }); }

Все! Больше javascript править не будем и полный код нашего my_js.js файла

var $ = jQuery.noConflict(); $(document).ready(function(){ // инициация нашего селекта $('#my_plugin_list_pages').select2(); get_pages_list(); $('#my_plugin_save_button').on('click', function(){ save_list_pages(); var data = { action: 'save_settings', my_message: $('.my_message').val() }; jQuery.post( ajaxurl, data, function(response) { if( parseInt(response)===1 ) alert('Сообщение сохранено!'); if( parseInt(response)===0 ) alert('Что-то не так! Повторите попытку'); }); }); }); function get_pages_list(){ var data = { action: 'get_list_pages' }; jQuery.post( ajaxurl, data, function(response) { $('#my_plugin_list_pages').html(response).change(); }); } function save_list_pages(){ var data = { action: 'save_list_pages', pages: $('#my_plugin_list_pages').val() }; jQuery.post( ajaxurl, data, function(response) { }); }

и осталось изменить в plugin.php нашу функцию, которая отвечает за перехват контента

function no_login_message_func( $content ) { global $post; $message = ''; $out = $content; //считаем список страниц из опции и преобразуем в массив нормального вида $rp = unserialize( get_option('my_plugin_restrict_pages') ); // проверим, есть ли в массиве текущая страница // и // залогинился ли юзер if( in_array($post->ID, $rp) && !is_user_logged_in() ) { $out = "".__('Для просмотра этой страницы залогинтесь!', 'chris')." ".do_shortcode('[my_plugin_login_form]')." "; } return $out; }

Вот и все!

Довольно небольшой, но удобный плагин.

Всем спасибо за внимание!

rss