Публикация в группе: Otshelnik-Fm - мои работы (код, плагины, дополнения, статьи и руководства)

Категории группы: Функции WordPress

Вступление:

В вордпресс есть ссылки в виде ЧПУ и обычные (ugly). Обычные это вида: ваш-сайт/?p=post_id - где post_id - id записи.

Плюс у таких ссылок очевиден - указывая ее внутри записи мне не нужно бояться, что если я сменю чпу на другой вид - то буду получать 404-ю ошибку. По этой ссылке вордпресс мне редиректом направит куда нужно. Плюс к этому - я всегда указываю данный тип ссылок - когда пишу новое дополнение - мне не нужно функцией get_permalink получать урл до записи
(один запрос в бд точно будет на запрос типа ссылок: get_option('permalink_structure'))

Подобное и с личным кабинетом - я могу указать: ваш-сайт/?author=1 и попаду в свой кабинет (даже при включенном чпу)

А вот с ссылкой на комментарий все сложней - у вордпресса нет механизма, который приведет нас к нужному кабинету, учитывая постраничную навигацию комментариев. Нет такого: ваш-сайт/?comment=comment_id - чтобы указав в урл или в html вашего плагина id комментария и только по факту перехода высчитывался урл для этого одного конкретного комментария.

Тикет двухгодичной давности никто не поддержал. Вместо этого они советуют использовать для получения ссылки на комментарий функцию get_comment_link, а она, как я выяснил, довольно прожорлива. На получение ссылки на один комментарий она делает два запроса к базе данных. Теперь представим что мы выводим 10 последних комментариев - это +20 запросов к базе данных! Представляете - на каждую загрузку страницы 20 запросов к бд, и не факт же что этими ссылками воспользуются и перейдут на страницу комментария. Мы таким образом наш сайт вхолостую грузим.

В этой записи я покажу, как сделать подобный урл для вашего плагина или дополнения к WP-Recall

Решение:

Для начала покажем вордпрессу что у нас есть новая переменная запроса (мог бы и GET применить - но захотелось по кодексу ВП)

// добавим в массив новую переменную запроса
function otfm_add_query_vars($vars){
	$vars[] = 'comment_id';
	return $vars;
}
add_filter('query_vars', 'otfm_add_query_vars');

- здесь мы в массив переменных запроса ВП добавили свое новое значение.

А кодом ниже отловим его и произведем редирект на нужный нам комментарий:

// ловим ссылку на комментарий вида ваш-сайт/?comment_id=16 (16 - id комментария)
function otfm_catch_comment_link(){
    if(!empty( get_query_var('comment_id') )){
        $comment_link = get_comment_link( intval(get_query_var('comment_id')) );

        wp_redirect($comment_link);
        exit;
    }
}
add_action('template_redirect', 'otfm_catch_comment_link');

- теперь перейдя по урл: ваш-сайт/?comment_id=16 - мы 302 редиректом перейдем на нужную страницу (учитывается пагинация) к комментарию. Ведь именно по факту перехода и работает этот код.

Как использовать для своих плагинов и дополнений:

// вот так сформируется урл до комментария
$link = '<a href="/?comment_id='.$comment_id.'" rel="nofollow">Комментарий</a>';

- просто в html указываем Id комментария и переменная $link будет содержать урл до комментария.

Итак метрики этого метода:
Было 10 комментариев и функция get_comment_link давала мне +20 запросов к бд. Когда применил этот запросов не стало - т.к. по сути это html+php

Буду рад если вы поделитесь применением данного метода на вашем сайте и озвучите свои метрики "до" и "после" применения его.

3

Автор публикации

не в сети 2 часа

Вова (Otshelnik-Fm)

4 503
Живой, бодрый, полон идей!
Комментарии: 2252Публикации: 250Регистрация: 27-01-2013Продаж/Покупок: 0/0