https://www.lexium.ru/2016/01/nextgen-konfliktuet-s-post-in-page-reshenie/

NextGen конфликтует с Post in Page (решение)

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

В чем суть? Да в том… А давай по порядку что-ли…

Недостаток WordPress

Дело в том, что движок WordPress задумывался как простая система для блоггеров. Тут все четко, организованно и понятно. Именно из этой простоты вытекают некоторые неудобства, когда надо замутить нечто не совсем стандартное.

Вот например, хочу я выводить в конце поста или страницы какие-нибудь анонсы с других страниц (заголовок и немного текста). В функционале этого не предусмотрено.

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

Но, тут на помощь приходят многочисленные плагины, коих пруд пруди и все доступны прямо из админки. Т.е. никуда и лезть не надо, только выбрал и кнопочку нажал. Все остальное сделает сам WordPress.

Плагин Page-list

Плагин Page-list позволяет выводить анонсы подстраниц какой-нибудь страницы в любом месте поста или другой страницы. Это удобно!

Создаю себе страницу Услуги, а к ней, например, кучу подстраниц с описанием каждой услуги отдельно.

Дальше, на страницу услуги вставляю короткий шоткод, и вуаля.

pagelist

Вот как тут например. Описание услуг можно удалить, внешний вид поменять. Тут CSS тебе в помощь.

Плагин Posts in Page

Плагин Posts in Page, сам по себе, отличная финтифлюшка. Позволяет выводить анонсы постов, опять-же, внутри страницы или другого поста. Конечно в WordPress’е есть страница рубрики, куда все это добро и так валится, но что делать, если я хочу, скажем, до анонсов поставить картинку с текстом, а после них — контактную форму?

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

Еще одна финтифлюшка плагина в том, что из его папки можно перетащить один файлик (posts_loop_template.php) в Тему и хорошенько поглумиться над шаблоном вывода. Это нужно для того, чтобы  добавить свой функционал и при обновлении плагина он не затерся.

Так я добавил туда вывод превьюшки поста.

postinpage

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

В общем, все было тип-топ, пока на одну из страниц не понадобилось поставить, ко всем перечисленным вещам еще и галерею.

NextGen Gallery

С выбором все просто — NextGen Gallery. Это лучший и удобнейший, на мой вкус, плагин галереи. Описаний по интернету полно, так что мнение составить не проблема. Работать с ним одно удовольствие.

nextgen

Опять-же, все можно настроить и привести к нужному внешнему виду, если конечно вы владеете таким инструментом, как бубен.

Конфликт между плагинами

Но есть у NextGen Gallery одна неприятность. Ну не хочет он работать одновременно с Posts in Page. Хоть тресни! Тупо не разворачивает галерею на странице, радуя унылой никак не оформленной превьюшкой, от которой никакого толку. Вот и пришлось плясать с бубном особенно яро.

Столько кода перелопатил и в одном и в другом, аж в глазах зарябило. В итоге нашел! Стоит отключить в шаблоне плагина Posts in Page функцию the_excerpt();, как галерея тут же начинает работать. Вот только в анонсе поста, что логично, исчезает текст. Заголовок — есть, превьюка — тоже, а текста нет.

Ну не хочет галерея сосуществовать с вызовом the_excerpt(); Не хочет ни в какую.

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

Итак, вот тут нашел функцию, которая обрезает переменную по словам. Привожу код.

<?php
// $input_text - исходная строка
// $limit = 50 - количество слов по умолчанию
// $end_str - символ/строка завершения. Вставляется в конце обрезанной строки
function words_limit($input_text, $limit = 50, $end_str = '') {
    $input_text = strip_tags($input_text);
    $words = explode(' ', $input_text); // создаём из строки массив слов
    if ($limit < 1 || sizeof($words) <= $limit) { // если лимит указан не верно или количество слов меньше лимита, то возвращаем исходную строку
        return $input_text;
    }
    $words = array_slice($words, 0, $limit); // укорачиваем массив до нужной длины
    $out = implode(' ', $words);
    return $out.$end_str; //возвращаем строку + символ/строка завершения
}
?>

Вставил ее в конец шаблона плагина. На место the_excerpt(); поставил вот этот код.

<?php		
//the_excerpt();
$mypostout = words_limit(get_the_content());
$mypostout .= "...";
echo $mypostout;
?>

И всё. Теперь работает как надо.

Дело в том, что the_excerpt(); как раз отвечает за вывод анонса. Т.е. обрезанного поста. Я же заменил ее на get_the_content(); и получил полный текст поста, что мне, естественно, не нужно. Вот и обрезал это безобразие до 50 слов функцией.

Можно конечно обрезать по количеству букв, это и быстрее и проще, но из за того, что сайт в кодировке UTF-8, каждый символ на самом деле состоит из двух, и когда его пополамят, получается ромбик со знаком вопроса. Это очень не красиво смотрится в тексте.

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

Ответ написан 9 февраля 2016 в 14:15. · Изменить грАватар

А не проще отказаться от всех этих плагинов, заменить их просто кодом, и проблемы будут решены.

Доктор Лексиум
Ответ написан 12 февраля 2016 в 09:40. · Изменить грАватар

Нет. Не проще.

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

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

Следить за темой по RSS

Напишите комментарий