Создание плагина для WordPress Избранные записи. Урок 7

Создание плагина для WordPress Избранные записи

От автора: в этом уроке мы продолжим создание плагина для WordPress «Избранные записи». В прошлом уроке мы занимались сохранением статей в метаданных пользователя и увидели, насколько просто позволяет WordPress работать с метаданными. Теперь продолжим эту тему и в этом уроке научимся удалять информацию из метаданных пользователя.

автор

Автор: Андрей Кудлай

Зовут меня Андрей Кудлай. Родом я из Украины, живу в Днепропетровске. Веб-программированию учился сам. Неплохо знаю HTML, CSS, PHP, JavaScript.

скачать исходникискачать урок

Итак, перед нами стоит задача удалить запись из списка Избранного. Сделать это нужно, как и в случае с добавлением, без перезагрузки страницы, т.е. мы будем использовать AJAX в WordPress.

Вы помните, как легко работать с AJAX в WordPress?

Как вы помните, в файле wfm-favorites-scripts.js есть функция, отправляющая ajax запрос для добавления статьи в Избранное. Благодаря параметру action WordPress понимает, в какую именно функцию отправить запрос ajax. Сейчас этот параметр статичен, т.е. связан с конкретной функцией. Почему бы нам не сделать этот параметр динамичным? Давайте попробуем сделать, тогда одна и та же функция в JS будет иметь возможность отправлять запросы к различным функциям в WordPress.

Для реализации задуманного немного изменим функцию wfm_favorites_content, сделав одинаковую структуру ссылок:

function wfm_favorites_content($content){
	if( !is_single() || !is_user_logged_in() ) return $content;
	$img_src = plugins_url( '/img/loader.gif', __FILE__ );

	global $post;
	if( wfm_is_favorites($post->ID) ){
		return '<p class="wfm-favorites-link"><span class="wfm-favorites-hidden"><img src="' . $img_src . '" alt=""></span><a data-action="del" href="#">Удалить из Избранного</a></p>' . $content;
	}

	return '<p class="wfm-favorites-link"><span class="wfm-favorites-hidden"><img src="' . $img_src . '" alt=""></span><a data-action="add" href="#">Добавить в Избранное</a></p>' . $content;
}

Как видим, к каждой из ссылок мы добавили новый атрибут data-action с различным значением для добавления и удаления избранной статьи: add — для добавления, del — удаления. Теперь получим значение атрибута в JavaScript и используем его при формировании запроса AJAX:

$('.wfm-favorites-link a').click(function(e){
	var action = $(this).data('action'); // получаем значение атрибута
	$.ajax({
		type: 'POST',
		url: wfmFavorites.url, 
		data: {
			security: wfmFavorites.nonce,
			action: 'wfm_' + action, // добавляем значение атрибута
			postId: wfmFavorites.postId
		},
		beforeSend: function(){
			$('.wfm-favorites-link a').fadeOut(300, function(){
				$('.wfm-favorites-hidden').fadeIn();
			});
		},
		success: function(res){
			$('.wfm-favorites-hidden').fadeOut(300, function(){
				$('.wfm-favorites-link').html(res);
			});
		},
		error: function(){
			alert('Ошибка!');
		}
	});
	e.preventDefault();
});

Теперь наш запрос ajax действительно динамичен и может работать уже с двумя различными функциями PHP.

Далее, для того, чтобы WordPress принял новый AJAX запрос, нам нужно добавить соответствующий хук в главном файле плагина WordPress. Также переименум прежний хук и функцию, работающую с ним — ранее это было wp_ajax_wfm_test, теперь — wp_ajax_wfm_add:

add_action( 'wp_ajax_wfm_add', 'wp_ajax_wfm_add' );
add_action( 'wp_ajax_wfm_del', 'wp_ajax_wfm_del' );

Осталось написать функцию, которая будет обрабатывать запрос ajax и удалять избранную статью:

function wp_ajax_wfm_del(){
	if( !wp_verify_nonce( $_POST['security'], 'wfm-favorites' ) ){
		wp_die('Ошибка безопасности!');
	}
	$post_id = (int)$_POST['postId'];
	$user = wp_get_current_user();

	if( !wfm_is_favorites($post_id) ) wp_die();

	if( delete_user_meta( $user->ID, 'wfm_favorites', $post_id ) ){
		wp_die('Удалено');
	}

	wp_die('Ошибка удаления');
}

Если все сделано верно, то теперь наш плагин WordPress Избранные записи обзавелся новым функционалом — теперь мы можем удалять из пользовательских метаданных избранные статьи.

На этом текущий урок завершен. Удачи и до новых встреч!

Хотите быстро научиться создавать сайты и блоги на WordPress с уникальным дизайном?

Получите самую полную в Рунете бесплатную систему обучения создания сайтов на WordPress “Уникальный сайт с нуля”

Получить

Метки: ,

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (10)

  1. Людмила

    Здравствуйте.

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

    • Андрей Кудлай

      Здравствуйте, Людмила.
      Скоро выйдет очередной урок, в котором будет показан вывод Избранного в виджете консоли. Лучше подписаться дополнительно на наш канал YouTube, там уроки выкладываются недели на 2-3 раньше.

  2. Людмила

    Спасибо, подписалась.

    Жду продолжение, надеюсь оно не задержится — очень нужен ваш плагин :) .

    • Андрей Кудлай

      Следующий урок на канале появится скорее всего в конце недели, дождитесь :)

  3. Людмила

    Если не сложно, расскажите, пожалуйста, в вашем уроке, как вывести записи в сайдбаре.

    • Андрей Кудлай

      Не сложно) Сделать это можно, зарегистрировав в плагине собственный виджет. После того, как создадим основную часть плагина, уделю время на виджет и покажу.

      • Людмила

        Скажите. а можно вывести список записей не виджетом, а функцией?

        Зачем лишний код в плагине?

        • Андрей Кудлай

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

          • Людмила

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

          • Андрей Кудлай

            Впервые слышу о том, что виджет — это костыль. В любом случае, Вам никто не мешает взять содержимое функции widget, обернуть в нужную функцию и выводить ее в своем шаблоне, если не хотите использовать виджет. К слову, вот это, на мой взгляд, и будет костылем, поскольку рядовому пользователю придется лезть в код, от чего он избавлен в случае с виджетом. Также придется повторно лезть в код в случае изменения темы. В общем, не универсальный вариант получается.

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

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

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree