Вступление:
В вордпресс есть ссылки в виде ЧПУ и обычные (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
Буду рад если вы поделитесь применением данного метода на вашем сайте и озвучите свои метрики "до" и "после" применения его.
Владимир, спасибо, обязательно применю такой подход на практике. Отличное решение 8)
Ага я подобное применил недавно сформировав короткую ссылку у дополнения notes frontage (прям сейчас в моей подписи она). Ну и новый доп что пишу - тот выводит ссылки на комментарии в потоке и +20 запросов к бд - меня жаба задушила. Нашел старый тикет и странно что сообщество это отвергло. Там и обоснование было - не получать 404-е ссылки когда меняются типы чпу. Чтобы всегда был адрес комментария как в постах
Кстати если подобное будет у плагина WP-Recall, то и мне не нужно будет повторять этот фрагмент кода - как минимум у меня 2 дополнения используют ссылки на комментарии.
Я пробовал вторую функцию вешать на хук pre_get_posts - тоже работает. Но тут тонкости какую использовать - я в этом не разбирался. Работает на хуке template_redirect срабатывающим чуть позже pre_get_posts https://wp-kama.ru/hooks/actions-order
Плагин wp-recall не ориентирован на работу с комментариями, поэтому вносить этот код в код плагина наверное смысла нет, но использовать его в различных дополнениях к плагину или даже отдельных плагинах будет очень полезно.
ок. Уточнил этот момент. Логично