karelina-nat
@karelina-nat

Почему отладчик выдает var is not defined?

Верстка сайта натянута на вордпресс. На одной из страниц нужна подгрузка постов через ajax.
Реализовано так:
- на странице, где подгрузка
<?php


$args = array(
	'post_type' => 'celye_torty',
    'posts_per_page' => 2,
);
 
$myquery = new WP_Query($args); 


if($myquery->have_posts()): 
	while($myquery->have_posts()):
        $myquery->the_post();
        get_template_part( 'template-parts/cakes-posts', get_post_format() );
       
	endwhile;
endif;

?>

<?php if ($myquery->max_num_pages > 1): ?>
	<script id="true_loadmore">
	var ajaxurl = '<?php echo site_url() ?>/wp-admin/admin-ajax.php';
    var true_posts = '<?php echo serialize($myquery->query_vars); ?>';
    var current_page = <?php echo (get_query_var('paged')) ? get_query_var('paged') : 1; ?>;
    var max_pages = '<?php echo $myquery->max_num_pages; ?>';
	</script>
<?php endif;?>


- в functions.php
function true_load_posts(){
    
    $args = unserialize( stripslashes( $_POST['query'] ) );
	$args['paged'] = $_POST['page'] + 1; // следующая страница
    $args['post_status'] = 'publish';
    

	query_posts( $args );
	// если посты есть
	if( have_posts() ) :
 
		// запускаем цикл
		while( have_posts() ): the_post();
 
            get_template_part( 'template-parts/cakes-posts', get_post_format() );
 
		endwhile;
 
	endif;
	die();
}
 
 
add_action('wp_ajax_loadmore', 'true_load_posts');
add_action('wp_ajax_nopriv_loadmore', 'true_load_posts');


- в файле скрипта

$(window).scroll(function () {
     var bottomOffset = 1000; // отступ от нижней границы сайта, до которого должен доскроллить пользователь, чтобы подгрузились новые посты
     var data = {
         'action': 'loadmore',
         'query': true_posts,
         'page': current_page
     };
     if ($(document).scrollTop() > ($(document).height() - bottomOffset) && !$('body').hasClass('loading')) {
         $.ajax({
             url: ajaxurl,
             data: data,
             type: 'POST',
             beforeSend: function (xhr) {
                 $('body').addClass('loading');
             },
             success: function (data) {
                 if (data) {
                     $('#true_loadmore').before(data);
                     $('body').removeClass('loading');
                     current_page++;

                     openModal(); // вызов функции открытия модального окна

                     if (current_page == max_pages) $('.menu-content__preloader').remove(); // если последняя страница, удаляем кнопку
                 } else {
                     $('.menu-content__preloader').remove(); // если мы дошли до последней страницы постов, скроем кнопку
                 }
             }
         });
     }
 });


На странице, для которой эта подгрузка предназначена, всё нормально, на других страницах выдает
Uncaught ReferenceError: true_posts is not defined
.

Как исправить?
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
karelina-nat
@karelina-nat Автор вопроса
Всё очень просто оказалось .
Заключаем скрипт в JS в проверку условия на существование переменной
if (typeof true_posts !== 'undefined') {
     $(window).scroll(function () {
         var bottomOffset = 1000; // отступ от нижней границы сайта, до которого должен доскроллить пользователь, чтобы подгрузились новые посты
         var data = {
             'action': 'loadmore',
             'query': true_posts,
             'page': current_page
         };
         if ($(document).scrollTop() > ($(document).height() - bottomOffset) && !$('body').hasClass('loading')) {
             $.ajax({
                 url: ajaxurl,
                 data: data,
                 type: 'POST',
                 beforeSend: function (xhr) {
                     $('body').addClass('loading');
                 },
                 success: function (data) {
                     if (data) {
                         $('#true_loadmore').before(data);
                         $('body').removeClass('loading');
                         current_page++;

                         openModal(); // вызов функции открытия модального окна

                         if (current_page == max_pages) $('.menu-content__preloader').remove(); // если последняя страница, удаляем кнопку
                     } else {
                         $('.menu-content__preloader').remove(); // если мы дошли до последней страницы постов, скроем кнопку
                     }
                 }
             });
         }
     });
 }
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
nokimaro
@nokimaro
Либо не выполняется условие PHP (страниц не больше 1) и соотв-но переменная не определена
<?php if ($myquery->max_num_pages > 1): ?>
Либо проблемы с областью видимости, и true_posts которая всё-таки определена не доступна внутри функции.

для начала открыть исходный код страницы и посмотреть есть ли там
var true_posts = итд
Ответ написан
Ваш ответ на вопрос

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

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