Я разрабатываю WordPress сайт, где сообщения загружаются во всплывающем окне с помощью AJAX (с Magnific Popup). Сообщения используют шаблон single.php
,
Это прекрасно работает, за исключением того, что верхний и нижний колонтитулы также загружаются во всплывающем окне (HTML-теги, навигация, скрипты и т. Д.). Я могу конечно удалить get_header()
а также get_footer()
из шаблона, но тогда отдельные страницы сообщений не загружаются правильно через постоянные ссылки.
Я пробовал использовать условные теги, но когда шаблон загружается с помощью Ajax, он не видит, загружен ли он на домашней странице.
Я думаю, что работать с разными шаблонами — вариант, хотя я видел сайты, которые работают с одним и тем же шаблоном (например, тема Zoo на themeforest). Но я не мог понять, как это работает там.
Так что я застрял здесь. Кто-нибудь?
Чистым решением будет использование функций 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
Перезвоните».
Но я приму приведенный выше ответ, так как считаю, что это элегантный способ, вместо загрузки всей страницы и отображения только необходимой части.