Загрузите сообщение WordPress без get_header () и get_footer ()

Я разрабатываю сайт 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 ».

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