среда, 28 августа 2013 г.

Wordpress: считаем комментарии Вконтакте

Как-то раз заказчику попала вожжа под мантию и он возжелал вместо обычных комментариев Вордпресса поставить комментарии Вконтакте. И, разумеется, чтобы у постов были счётчики этих самых комментариев. ОК, поехали.

1) Допустим, мы уже убрали стандартные комментарии и поставили контактовские в том же файле comments.php. Дальше после вызова комментариев контакта ставим следующий код (я по привычке использую jQuery):

VK.Observer.subscribe("widgets.comments.new_comment", function f(num, last_comment)
{
$.ajax({
type: "post",
url: "<?=admin_url('admin-ajax.php')?>",
data: "action=vk_comments_num&nonce="+"<?=wp_create_nonce('ajax-nonce')?>"+"&num="+num+"&id=<?=get_the_ID();?>",
success: function(data){

}
});
});

VK.Observer.subscribe("widgets.comments.delete_comment", function f1(num, last_comment)
{
/* ровно то же самое, что в первом блоке */


});

2) Итак, мы повесили обработчик на добавление комментария и такой же обработчик на удаление. Число комментариев к посту (переменная num) и id этого самого поста отправляются ajax'ом на сервер, где должно произойти действие vk_comments_num. К этому действию нам надо привязать свою функцию. Для этого идём в functions.php и ставим туда следующий код:

add_action('wp_ajax_vk_comments_num', 'vk_comments_num');
add_action('wp_ajax_nopriv_vk_comments_num', 'vk_comments_num');

/* не забываем, что нашу функцию надо привязать к двум действиям - для авторизованного пользователя и гостя */

function vk_comments_num()
{
// проверка, с нашего ли сервера пришёл запрос
$nonce = $_POST['nonce'];

    if ( ! wp_verify_nonce( $nonce, 'ajax-nonce' ) )
        die ( 'Busted!');

if(isset($_POST['id']))
{
                // сохраняем количество комментарием в мета данные
update_post_meta($_POST['id'], 'vk_comments', $_POST['num'] );
echo $_POST['num'];
exit();
}

}

3) Теперь остаётся только выводить наш счётчик там, где это необходимо. Делается это просто:

<?php
$comments_num = get_post_meta( get_the_ID(), 'vk_comments', true ); // получите
echo 'Комментарии ('.$comments_num.')'; // и распишитесь
?>

среда, 7 августа 2013 г.

Тысяча первый костыль для починки чпу пользовательского типа wordpress (custom post type)

Достался мне сегодня в работу сайт аж с четырьмя пользовательскими типами постов. Плюс кучей плагинов и огромной свалкой кода в functions.php. И вот у них все страницы с кастомными типами постов (структура url - /тип поста/алиас записи/) выдают 404. И кагбэ надо это чинить. Плагины отключаю - ничего не меняется. Промудохавшись пару часов, вывела следующее:

a) flush_rewrite_rules(); упорно выдаёт бесконечную переадресацию
б) помогает вот такой костыль в functions.php

function my_parse_request($vars){

if(in_array($vars->query_vars['category_name'], array(_тут список кастомных типов записи_))) unset($vars->query_vars['category_name']);

return $vars;
}

add_action ('parse_request','my_parse_request'); 

То есть Wordpress почему-то считает, что /тип поста/ - это имя категории. Костылём мы его в этом разубеждаем, но вот докопаться, почему он так считает, у меня уже не хватило сил. Будем думать.