AJAX Вмешательство в оператор if в цикле while? - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь загрузить свои боковые панели в цикле while, используя операторы if, которые вызывают их после определенного количества сообщений.Важно отметить, что я использую код AJAX (предоставленный ниже) для загрузки постов при прокрутке, и я считаю, что это может быть причиной проблемы.

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

Я пытался найти проблему в течение недели, но не могу заставить боковые панелизагрузка с AJAX в качестве оператора if в цикле while.

Важно отметить: Боковая панель будет загружена после количества сообщений, если она не загружена через AJAX.Так что, если он находится в начальной загрузке, боковые панели загружаются.Но когда вы продолжите прокручивать, чтобы сказать третий или четвертый столбец, он не загрузится, и AJAX загрузит только (parts/content).

. Мне нужно либо иметь возможность разрешить оператор if, чтобы он работал внутриЦикл while, который загружается через AJAX, или я открыт для альтернативного решения, если оно не удаляет AJAX.

Много работы было проделано для создания этого цикла, и помощь очень ценится!

front-page.php

 <?php
  $current_page = max( 1, get_query_var( 'paged' ) );
  $the_query = new WP_Query( array(
    'cat'            => '-21',
    'post_type'      => 'post',
    'posts_per_page' => 5,
    'paged'          => $current_page,
    'tax_query'      => array(
        array(
            'taxonomy' => 'topics',
            'operator' => 'NOT EXISTS',
            'field' => 'term_id',
            'terms' => $term_id
        )
    )
  ) );

  wp_localize_script( 'my_loadmore', 'misha_loadmore_params', array(
    'ajaxurl'      => admin_url( 'admin-ajax.php', 'relative' ),
    'posts'        => json_encode( $the_query->query_vars ),
    'current_page' => $current_page,
    'max_page'     => $the_query->max_num_pages
  ) );
?>

<div id="main" class="container-fluid">
    <?php if ($the_query->have_posts()) : ?>
      <?php $count = 0; ?>
      <?php while ($the_query->have_posts()) : $the_query->the_post(); get_template_part( 'parts/content', get_post_format() ); ?> <!-- This parts/content loads -->
      <?php $count++; ?>
 <!-- the dynamic_sidebar does not load -->
        <?php if ($count == 2 && is_active_sidebar('sidebar1') ) : ?>
          <div class="side-container first-side">

            <?php dynamic_sidebar('sidebar1'); ?>

          </div>

        <?php endif; ?>

        <?php if ($count == 10 && is_active_sidebar('sidebar2') ) : ?>
          <div class="side-container first-side">

            <?php dynamic_sidebar('sidebar2'); ?>

          </div>

        <?php endif; ?>

        <?php if ($count == 20 && is_active_sidebar('sidebar3') ) : ?>
          <div class="side-container third-side">

            <?php dynamic_sidebar('sidebar3'); ?>

          </div>
        <?php endif; ?>
      <?php endwhile; ?>
    <?php endif; ?>

  <?php wp_reset_postdata(); ?>

  <?php get_footer(); ?>
</div><!-- END CONTAINER -->

части / содержимое - загружается, как ожидается, включая код, если это полезно

<div class="row post"> <!-- Post is mentioned in the below JS to load -->
    <div class="col-sm-5">
     <h2>Text</h2>
    </div>

    <div class="col-sm-7">
      <h3>text</h3>
    </div>
</div><!-- END ROW-->

код боковой панели - работает при первоначальной загрузке, но не работает, когда AJAX вызывает этот код, например последние две боковые панели в front-page.php

<?php
     $term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) ); ?>
    <?php while( $flexible_posts->have_posts() ) : $flexible_posts->the_post(); global $post; ?>
    <div class="sidebar-area">
        //sidebar code here
    } 
endwhile;
?>

myloadmore.js - AJAX Call

jQuery(function($){
    var canBeLoaded = true,
    bottomOffset = 2000; 

    $(window).scroll(function(){
        if ( misha_loadmore_params.current_page >= misha_loadmore_params.max_page ) {
            return;
        }
        var data = {
            'action': 'loadmore',
            'query': misha_loadmore_params.posts,
            'page' : misha_loadmore_params.current_page
        };
        if( $(document).scrollTop() > ( $(document).height() - bottomOffset ) && canBeLoaded == true ){
            $.ajax({
                url : misha_loadmore_params.ajaxurl,
                data: data,
                type: 'POST',
                beforeSend: function( xhr ){
                    // AJAX call is in process, we shouldn't run it again until complete
                    canBeLoaded = false;
                },
                success:function(data){
                    if( data ) {
                        $('#main').find('div.post:last-of-type').after( data ); // where to insert posts
                        canBeLoaded = true; // the ajax is completed, now we can run it again
                        misha_loadmore_params.current_page++;
                        bottomOffset = ( $( '#main > div.post:last' ).offset() || {} ).top
                    }
                }
            });
        }
    });
});

functions.php - Добавлено для дальнейшего контекста

function misha_my_load_more_scripts() {
    wp_register_script( 'my_loadmore', get_stylesheet_directory_uri() . '/js/myloadmore.js',
        array( 'jquery' ), '', true );
    wp_enqueue_script( 'my_loadmore' );
}
add_action( 'wp_enqueue_scripts', 'misha_my_load_more_scripts' );

function misha_loadmore_ajax_handler() {
    $args = json_decode( wp_unslash( $_POST['query'] ), true );
    $args['paged'] = $_POST['page'] + 1; // load the next page

    $the_query = new WP_Query( $args );

    if ( $the_query->have_posts() ) :
        while ( $the_query->have_posts() ) : $the_query->the_post();
            get_template_part( 'parts/content', get_post_format() );
        endwhile;
    endif;

    wp_die();
}
add_action( 'wp_ajax_loadmore', 'misha_loadmore_ajax_handler' );        // Authenticated users
add_action( 'wp_ajax_nopriv_loadmore', 'misha_loadmore_ajax_handler' ); // Non-authenticated users

1 Ответ

0 голосов
/ 20 апреля 2019

Хитрость в том, чтобы добавить операторы if в обработчики AJAX. Возможно, кто-то, имеющий опыт работы с AJAX, может добавить к этому один день, чтобы объяснить, почему он работает, но все, что я знаю, это то, что он делает. Весь код из моего вопроса такой же ниже, это отличие от функции обработчика ajax functions.php.

function misha_loadmore_ajax_handler() {
    $args = json_decode( wp_unslash( $_POST['query'] ), true );
    $args['paged'] = $_POST['page'] + 1; // load the next page

    $the_query = new WP_Query( $args );

    if ( $the_query->have_posts() ) :
        while ( $the_query->have_posts() ) : $the_query->the_post();
            get_template_part( 'parts/content', get_post_format() );

    <?php if ($count == 2 && is_active_sidebar('sidebar1') ) : ?>
      <div class="side-container first-side">
        <?php dynamic_sidebar('sidebar1'); ?>
      </div>
    <?php endif; ?>

    <?php if ($count == 10 && is_active_sidebar('sidebar2') ) : ?>
      <div class="side-container first-side">
        <?php dynamic_sidebar('sidebar2'); ?>
      </div>
    <?php endif; ?>

    <?php if ($count == 20 && is_active_sidebar('sidebar3') ) : ?>
      <div class="side-container third-side">
        <?php dynamic_sidebar('sidebar3'); ?>
      </div>
    <?php endif;
        endwhile;
    endif;
    wp_die();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...