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

Я разрабатываю WordPress сайт, где сообщения загружаются во всплывающем окне с помощью AJAX (с Magnific Popup). Сообщения используют шаблон single.php,

Это прекрасно работает, за исключением того, что верхний и нижний колонтитулы также загружаются во всплывающем окне (HTML-теги, навигация, скрипты и т. Д.). Я могу конечно удалить get_header() а также get_footer() из шаблона, но тогда отдельные страницы сообщений не загружаются правильно через постоянные ссылки.

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

Я думаю, что работать с разными шаблонами — вариант, хотя я видел сайты, которые работают с одним и тем же шаблоном (например, тема Zoo на themeforest). Но я не мог понять, как это работает там.

Так что я застрял здесь. Кто-нибудь?

0

Решение

Чистым решением будет использование функций 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

1

Другие решения

Я наконец узнал, что эта опция включена в Magnific Popup Плагин: «Чтобы изменить содержимое после его загрузки, или чтобы выбрать и показать только определенный элемент из загруженного файла, есть parseAjax Перезвоните».

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

1

По вопросам рекламы [email protected]