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

Представляю вашему вниманию очередную статью цикла «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() — эмулирует изменение элемента, как-будто юзер нажал на поле и что-то там выбрал.

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

как вывести список страниц wordpress

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

Отредактируем наш файл 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;
}

Вот и все!
Довольно небольшой, но удобный плагин.
Всем спасибо за внимание!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *