Как показать содержимое поста, записи в всплывающем окне WordPress
Віталий
Доброго времени суток
Недавно возникла задача - выводить информацию в окне из записей. Если бы надо было вывести просто одной записи, то можно без подгрузки, сразу. То бишь при загрузке сайта содержимое страницы грузилось бы тоже, а при появлении окна уже было в нем. Но у меня была задача подгружать корнтент из нескольких десятков постов в одном окне. Грузить все сразу, включая картинки и тексты - не очень хорошая идея. Это замедлит загрузку страницы и увеличит нагрузку на БД. Вот в этом случаи и поможет материал из сегодняшней статьи.
Суть идеи, при нажатии на кнопку/ссылку - открывать окно, внутри которого будет загружаться посредством Ajax текст нужной записи. При нажатии на другую кнопку/ссылку в том же окне будет уже другое содержимое и тд.
Как упомянул выше, делать будем с помощью - Ajax. Для начала надо на нужной вам странице разместить код окна и самой кнопки. Начнем с кнопки.
<?php
//На выбор. Можете иначе получить ID записи. Главное чтобы у вас в переменной она была.
$post_ID = '123';
$post_ID = url_to_postid('Тут ссылка на пост');
?>
<a id="<?php echo $post_ID ?>" class="ajax-post">Нажми меня</a>
Тут обычная ссылка которой присвоен класс - ajax-post. Не упустите этот момент. Так же есть ID. Тут надо правильно его указать. Вы можете добавлять бесконечное количество таких ссылок и каждой присваивать ID, который должен содержать ID записи. ID записи можно посмотреть в админке в списке записей наведя на нее.
Так же можно получить ID указав ссылку на пост в функции - url_to_postid('Тут ссылка на пост'). Можете еще как-то, как вам удобно, главное, чтобы в итоге id ссылки был равен ID нужной записи. Думаю, тут понятно.
Далее, на этой же странице надо добавить HTML код окна, внутри которого и будет подгружаться содержимое нужных постов.
Тут просто. Основной блок окна с классом popup, внутренний контейнер с классом container_popup, внутри которого кнопка закрытия окна с классом close и блок для загрузки в него содержимого записи с id - ajax-response
Ссылке/кнопке - стили CSS сами придумаете как хотите, а окну вот минимальные. Добавьте их в свой файл стилей.
Расписывать подробно смысла нет. Кто разбирается с JavaScript поймет, сложного ничего нет. Обычная функция закрытия окна, которая с помощью slideUp() прячет и контейнер окна и родительский блок. Вторая при нажатии на ссылку с нужным классом показываем окно, получаем id атрибут ссылки и уже с помощью ajax получаем содержимое нашего поста подставляя его в наш специальный блок внутри окна. Время для получения установлено 8 секунд(8000 миллисекунд). Если за это время окно не загрузит пост, то появится ошибка. Можете добавить beforeSend: и например показывать слово Загрузка или анимацию какую добавить, чтобы пока шла загрузка, посетитель понимал, что надо подождать секунду. В моем случаи происходило моментально, ибо я подгружал лишь первые 100слов и название записи, так что мне это не нужно было. Если вы не понимаете что такое beforeSend, можете написать мне я за чашечку кофе помогу вам разобраться 😉
После этого, надо открыть файл пользовательских функций function.php. Добавляете код в самый конец перед закрывающим тегом PHP ?>. Если его нет, то просто в самый конец.
Перед изменением function.php, обязательно сохраните его копию, чтобы в дальнейшем, в случаи ошибки, вернуть все как было. Так же, можете использовать дочернюю тему. Если вы не знаете что это такое, то ознакомьтесь со статьей - Дочерние темы WordPress.
Добавить надо 2 функции. Подключение файла нашего ajaxload.js к Ajax WordPress и функция что выводит нужный пост и части его содержимого.
Наше событие wp_enqueue_scripts, подключает функцию - enqueue_my_scripts, внутри которой мы подключаем наш файл и вешаем его на Ajax WordPress, чтобы функция $.ajax могла работать в нашем файле.
Тут тоже просто. 2 события, чтобы эта функция дружила с Ajax WordPress, а далее сама функция. В начале получаем параметры для WP_Query , которая и выведет нужное содержимое в цикле.
Нас интересует 10-13 строка. Вот тут и задаете параметры что выводить. У меня в примере это ссылка на основной пост, внутри которой заголовок записи и функция что выводит первые 100 слов записи. Можете подключить полный вывод контента через функцию - the_content(), или миниатюру - the_post_thumbnail() и тд. Все что вам нужно можете вызывать внутри цикла.
Если все сделали правильно, то можно проверить сами. Метод проверенный и 100% рабочий, выручит вас, если вы столкнулись с той же задачей что и я.