Я разрабатываю сайт wordpress, где сообщения загружаются в всплывающее окно с помощью ajax (с помощью Magnific Popup ). Посты используют шаблон single.php
.
Это прекрасно работает, за исключением того, что верхний и нижний колонтитулы также загружаются во всплывающие окна (html-теги, навигация, скрипты, …). Я могу, конечно, удалить get_header()
и get_footer()
из шаблона, но затем отдельные страницы сообщений загружаются неправильно с помощью permalinks.
Я пробовал условные теги, но когда шаблон загружен с помощью Ajax, он не видит, что он загружен на главной странице.
Я думаю, что работа с разными шаблонами – это вариант, хотя я видел сайты, которые работают с одним и тем же шаблоном (например, тема Zoo на темуforest). Но я не мог понять, как это работает.
Поэтому я застрял здесь. Кто-нибудь?
Чистым решением будет использование функций WordPress AJAX.
Темы в настоящее время обычно разделяются на несколько частей для повторного использования блоков в разных местах. Например, тема twentysixteen использует get_template_part( 'template-parts/content', 'single' );
в single.php
включить файл шаблона, который показывает фактическое содержимое файла. Вы можете использовать это легко, чтобы получить содержание своего сообщения без заголовка, нижнего колонтитула и т. Д.
Во-первых, настройте часть PHP, вы можете просто добавить это в functions.php вашей темы или непосредственно в свой плагин, в зависимости от того, что вы разрабатываете.
<?php // for the admin area add_action( 'wp_ajax_my_action', 'my_action_callback' ); // for the public area add_action( 'wp_ajax_nopriv_my_action', 'my_action_callback' ); function my_action_callback() { $postid = intval( $_POST['postid'] ); $post = get_post( $postid ); setup_postdata( $post ); get_template_part( 'template-parts/content', 'single' ); wp_die(); // this is required to terminate immediately and return a proper response }
Соответствующая часть JavaScript:
var data = { 'action': 'my_action', 'postid': 1234 }; // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php // on the frontend you have to set it yourself var ajaxurl = '<?=admin_url( 'admin-ajax.php' )?>'; jQuery.post(ajaxurl, data, function(response) { // alert('Got this from the server: ' + response); // response will now contain your post, without header, footer, sidebars etc. });
my_action
является идентификатором для всего процесса и должен быть согласован между двумя частями.
Документация для поддержки WordPress AJAX: https://codex.wordpress.org/AJAX_in_Plugins
Наконец, я узнал, что этот параметр включен в плагин Magnific Popup : «Чтобы изменить содержимое после его загрузки или выбрать и показать только определенный элемент из загруженного файла, есть parseAjax
вызов parseAjax
».
Но я соглашусь с приведенным выше ответом, поскольку я считаю, что это элегантный способ, вместо того, чтобы загружать всю страницу и показывать только нужную часть.