Кнопка загрузки Wordpress не работает. $ wp_query не возвращает запрос последнего пост-цикла - PullRequest
0 голосов
/ 21 января 2019

- Редактировать 1 -

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

Я перезапускал сценарии несколько раз. Я теперь получаю разные выводы на самом деле. Выполнение var_dump($wp_query->query); сразу после $the_query = new WP_Query($queryArgs); При первом рендеринге цикла записи мне выдаются варианты запроса на странице, на которой отображается цикл. Вызывая его с помощью ajax, он перезапускает ту же часть кода, верно? Так чем он возвращается пустым.

Мои мысли:

  • Pages вызывается, запускает funtions.php.
  • Запускает часть wp_enqueue_script('rtt_scripts');
  • В этот момент он получает текущие значения $wp_query. Какие значения страницы.
  • Чем рендерит страницу с пост-циклом.
  • В этот момент запускается цикл постов $the_query = new WP_Query($queryArgs);
  • При нажатии загрузки больше ajax, чем вызывает его, чтобы запустить цикл post. С переменными запроса, установленными с wp_enqueue_script('rtt_scripts');

Это заставило меня задуматься. Я запускаю код в неправильном порядке? Не заданы ли переменные запроса для ajax? Другие мысли. Должен ли я сосредоточиться на том, как получить переменные запроса в первом пост-цикле в переменные запроса ajax?

- Конец редактирования -

У меня проблемы с кнопкой «загрузить больше» в Wordpress. Код ниже - это основной код, который у меня есть сейчас. Насколько я вижу, это должен быть рабочий код :) Проблема, однако, в том, что это не работает.

Моя проблема в том, что я не знаю, с чего начать отладку. Самое близкое, что я знаю, где проблема заключается в следующем:

В rtt_loadmore_ajax_handler() есть переменная $queryArg Когда var_dumping var $queryArg в обоих rtt_post_grid() и rtt_loadmore_ajax_handler()

Это дает разные результаты. Здесь я бы ожидал таких же результатов. В вызове Ajax он возвращает аргументы текущей отображаемой страницы, а не запроса на этой странице.

Будет ли global $wp_query; проблемой? И как мне идти отсюда?

Основной почтовый индекс:

function rtt_post_grid()
{

    $queryArgs = Array(
        "post_type" => Array(
            'news',
            'agenda'
        ),
        'posts_per_page' => 4,
        'post_status' => 'publish',
        'paged' => 1
    );

    // post grid wrap
    echo '<div id="rtt_posts_wrap"  >';

        rtt_post_grid_query($queryArgs);

    echo '</div>';

    // load more button
    echo '<form>';
        echo '<button id="rtt_loadmore" class=" button">Load more post</button>  ';
        echo '<input type="hidden" name="action" value="loadmore" />'; // this line might be obsolete
    echo '</form>';
}

function rtt_post_grid_query($queryArgs)
{

    // The Query
    $the_query = new WP_Query($queryArgs);
    // The Loop
    if ($the_query->have_posts()) {
        echo '<ul>';
        while ($the_query->have_posts()) {
            $the_query->the_post();
            echo '<li>' . get_the_title() . '</li>';
        }
        echo '</ul>';
        /* Restore original Post Data */
        wp_reset_postdata();
    } else {
        // no posts found
        echo 'no posts found';
    }
}

Настройка JS:

if(!has_action('rtt_post_grid_script_and_styles')) {
    add_action('wp_enqueue_scripts', 'rtt_post_grid_script_and_styles', 1);

    function rtt_post_grid_script_and_styles()
    {
        global $wp_query;

        wp_register_script('rtt_scripts', plugin_dir_url( __FILE__ ) . 'js/script.js', array('jquery'), time());
        wp_enqueue_script('rtt_scripts');

        wp_localize_script('rtt_scripts', 'rtt_loadmore_params', array(
            'ajaxurl' => site_url() . '/wp-admin/admin-ajax.php', // WordPress AJAX
            'posts' => json_encode($wp_query->query_vars), // everything about your loop is here
            'current_page' => $wp_query->query_vars['paged'] ? $wp_query->query_vars['paged'] : 1,
            'max_page' => $wp_query->max_num_pages
        ));

        wp_enqueue_script('rtt_scripts');
    }
}

JS / Ajax:

jQuery(function($){

    $(window).ready(function() {

        $('#rtt_loadmore').click(function () {

            $.ajax({
                url: rtt_loadmore_params.ajaxurl,
                data: {
                    'action': 'loadmore', // the parameter for admin-ajax.php
                    'query': rtt_loadmore_params.posts, // loop parameters passed by wp_localize_script()
                    'page': rtt_loadmore_params.current_page, // current page
                },
                dataType: 'json',
                type: 'POST',

                beforeSend: function (xhr) {

                    $('#rtt_loadmore').text('Bezig met laden...'); // some type of preloader
                },
                success: function (data) {

                    if (data) {

                        $('#rtt_loadmore').text('More posts');

                        $('#rtt_posts_wrap').append(data.content); // insert new posts

                        rtt_loadmore_params.current_page++;

                        if (rtt_loadmore_params.current_page == rtt_loadmore_params.max_page){

                            $('#rtt_loadmore').hide(); // if last page, HIDE the button

                        }
                    } else {

                        $('#rtt_loadmore').hide(); // if no data, HIDE the button as well
                    }
                }
            });

            return false;
        });
    });
});

Обработчик Ajax:

add_action('wp_ajax_loadmore', 'rtt_loadmore_ajax_handler'); // wp_ajax_{action}
add_action('wp_ajax_nopriv_loadmore', 'rtt_loadmore_ajax_handler'); // wp_ajax_nopriv_{action}

function rtt_loadmore_ajax_handler(){

    $postData = $_POST;

    // prepare our arguments for the query
    $queryArgs = json_decode( stripslashes( $postData['query'] ), true );
    $queryArgs['paged'] = $postData['page'] + 1; // we need next page to be loaded
    $queryArgs['post_status'] = 'publish';

    ob_start();

    rtt_post_grid_query($queryArgs);

    $output = ob_get_contents();

    ob_end_clean();

    global $the_query;

    echo json_encode( array(
        'posts' => serialize( $the_query->query_vars ),
        'max_page' => $the_query->max_num_pages,
        'found_posts' => $the_query->found_posts,
        'content' => $output
    ) );

    die;
}

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Итак, я понял это.Я объясню, что это может быть полезно для кого-то еще.

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

Я переместил код ниже в шорткод.Сразу после нового WP_query:

// The Query
$the_query = new WP_Query($queryArgs);

// The Loop
if ($the_query->have_posts()) {

    wp_enqueue_script_ajax_vars($the_query);

Чем прошел новый запрос

function wp_enqueue_script_ajax_vars($the_query)
{
wp_register_script('rtt_scripts', plugin_dir_url(__FILE__) . 'js/script.js', array('jquery'), time());

wp_localize_script('rtt_scripts', 'rtt_loadmore_params', array(
    'ajaxurl' => site_url() . '/wp-admin/admin-ajax.php', // WordPress AJAX
    'posts' => json_encode($the_query->query_vars), // everything about your loop is here
    'query_vars' => json_encode($the_query->query),
    'current_page' => $the_query->query_vars['paged'] ? $the_query->query_vars['paged'] : 1,
    'max_page' => $the_query->max_num_pages,
));

wp_enqueue_script('rtt_scripts', '', '', '', true); // note the last 'true' this sets it inside the footer
}

В результате wp_localize_script() создает переменную в нижнем колонтитуле.Это было в шапке раньше.Но, получив его в шорткоде, отправив новые аргументы запроса и поместив их в нижний колонтитул (поскольку к тому времени заголовок уже отрисован), я установил JS-переменную для Ajax.

0 голосов
/ 21 января 2019

Добавьте два аргумента заказа в $ queryArgs.

// prepare our arguments for the query
$queryArgs = json_decode( stripslashes( $postData['query'] ), true );
$queryArgs['paged'] = $postData['page'] + 1; // we need next page to be loaded
$queryArgs['post_status'] = 'publish';

$queryArgs['orderby'] = 'date'; // add this to order by date
$queryArgs['order'] = 'DESC'; // add this to display the most recent
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...