@crazyASD

Как сделать разные single.php для AJAX вывода через шорткод, и остальных страниц?

Задача:
Выводить урезанный пост на главной через AJAX-запрос при помощи шорткода, и полный пост с хидером и футером в на других страницах:
Для этого пытаюсь сделать через простой плагин переопределение сингл-темплейта:
function my_template($single_template) {
	global $post;
	if ($post) {
		$single_template = dirname( __FILE__ ) . '/my-template.php';
	}
	
	return $single_template;
}
add_filter( 'single_template', 'my_template' );

а затем делаю проверку не является ли страница главной:

function my_single_template( $single_template ) {
	if ( !is_front_page() )
		return dirname( __FILE__ ) . '/my_single_template.php';
	else
		return $single_template;
}
add_filter( 'template_include', 'my_single_template' );

Но! На главной странице всё равно выводится второй шаблон my_single_template.
Вопрос. Как сделать так, чтобы на странице где вывод осуществляется через шорткод (предполагается что это главная страница), грузился первый вариант, а во всех остальных случаях второй?
  • Вопрос задан
  • 391 просмотр
Решения вопроса 1
@crazyASD Автор вопроса
Я сделал запрос вот таким способом:
Вызываем через ссылку:
<a class="news-grid-more news-grid" href="#" data-single_url="'.get_permalink( $post->ID ).'"></a>

А дальше вот таким кодом вызываю фрагмент шаблона страницы:
jQuery(document).ready(function($){
$('.news-grid-more').on('click', function(e){
    e.preventDefault();
	var single_url = $(this).data('single_url') + ' #single-article';
	target_top = $("#news-single").offset().top-45;
	$('html, body').animate({scrollTop:target_top}, 900);

	$('#news-single').slideUp(900, function(){
			$(this).load(single_url,function(){
				$(this).slideDown(900);
			 });
 });

Всё работает, кроме вызываемых внутри single-страницы js-ов.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
cesnokov
@cesnokov
<head>&nbsp;</head>
if ( !is_front_page() || !is_home() ){ }

Попытка номер два. Предположим, что главная страница имеет в себе код выввода самой себя, а также дополнительную логику для GET запросов через AJAX:
$my_command = ''; 
$my_post_id = '';

if (!empty($_GET)) {
	foreach ($_GET as $key => $value) {
	    if ( !empty($key) && !empty($value) ) {
			$my_command = $key;
			$my_post_id = $value;
	    }
	}
}

//Не забудьте обезвредить все, что злоумышленники передадут в GET запрос

if ($my_command == 'get_post_content_by_id' && $my_post_id != '') {
	
	//Здесь выводим информацию на основе полученого GET запроса, например:
	$content_all = get_post($my_post_id);
	$content = $content_all->post_content;
	$content = apply_filters('the_content', $content);
	$content = str_replace(']]>', ']]&gt;', $content);
	echo $content;

} else if ($my_command == 'get_post_excerpt_by_id' && $my_post_id != '') {
	
	//Другой запрос
	$excerpt_all = get_excerpt($my_post_id);
	$excerpt = $excerpt_all->post_excerpt;
	echo $excerpt;
	
} else {
	//Если нет запроса, выводим обычное содержание страницы
	get_header();
	//...
	get_footer();
}

Запрос:
jQuery.get( "/_my_page_url_/", { get_post_content_by_id: "123"} );


Но я бы делал как пишет далее crazyASD: ...через wp_ajax_ и/или wp_ajax_nopriv_, как положено...
Ответ написан
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
crazyASD: вам не нужно выводить аяксом весь индекс целиком. Есть 2 пути.

Если вы используете вордпресовский аякс (через функцию, которая подключена на wp_ajax_ и/или wp_ajax_nopriv_, как положено) - тогда в этой функции получите нужный пост с помощью get_post() и отформатируйте как надо, результирующий хтмл отдайте с помощью wp_send_json_success().

Если вариант 1 непонятен (хотя он правильный и корректный), если вы аяксом дергаете непосредственно урл индекса, вспомните, что аякс-запрос позволяет получать не только страницу по урл целиком, но и ее часть, если указать #element_id то будет получен только контент этого элемента.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы