AJAX подгрузка постов в WP Query

16 авг. 2017 г., 21:24:12
Просмотры: 15K
Голосов: 3

Я пытаюсь реализовать AJAX подгрузку постов в WP Query, чтобы сначала выводилось 2 поста, а затем по кнопке "Загрузить еще" подгружались следующие. Какой лучший подход для решения этой проблемы, так как текущий код не работает?

JavaScript

  var ajaxRequest=function(){
  var filter = $('#filter');
  var page = 1; // Текущая страница
  var ppp = 3; // Количество постов на странице
        $.ajax({
            url: filter.attr('action'),
            data: filter.serialize(),
            type: 'POST',
            dataType: 'json',
            offset: (page * ppp) + 1,
            ppp: ppp,
            success: function(response) {
              page++;
              $(".card-wrap").append(response); // Класс контейнера для постов
              $("#more_posts").attr("disabled",false);
            }
        });
    };

PHP

<?php
    header("Content-type: application/json"); // Отправляем ответ в формате JSON
    $offset = $_POST["offset"];
    $ppp = $_POST["ppp"];    
    $args = array(
        'order' => $_POST['date'],
        'post_type' => 'custom',
        'posts_per_page' => 2,
        'offset' => $offset,        
    );
    [Остальная часть запроса]
?>

HTML

<a id="more_posts" href="#">Загрузить еще</a>
1
Комментарии

Ознакомьтесь с https://codex.wordpress.org/AJAX_in_Plugins

Swen Swen
16 авг. 2017 г. 21:51:40
Все ответы на вопрос 1
1

Если вы хотите использовать AJAX в WordPress, вам необходимо выполнить следующие шаги: 1) Сначала создайте ваш JS-файл, например, main.js.

2) Локализуйте его в functions.php с помощью wp_localize_script().

wp_enqueue_script( 'main.js', get_template_directory_uri().'/js/main.js', array( 'jquery'  ) );
    wp_localize_script( 'main.js', 'ajax_object', array('ajax_url' => admin_url('admin-ajax.php')) );

3) Создайте ваш JavaScript или jQuery код для выполнения запроса через AJAX, и в объекте данных AJAX добавьте свойство action, например, action: 'load_more_posts'. Это свойство action вызовет функцию с таким же именем для выполнения нашего кода.

jQuery(function($){
    $('#load_more_posts').on('click', function(e){
        console.log('hi');
        e.preventDefault();
         var $offset = $(this).data('offset');
         console.log('var'+$offset);
        $.ajax({
            method: 'POST',
            url: ajax_object.ajax_url,
            type: 'JSON',
            data: {
                offset: $offset,
                action: 'load_more_posts'
            },
            success:function(response){
                console.log(response);
                $('#load_more_posts').data('offset', parseInt(response.data.offset));

            }
        }); 
    })
});

4) В functions.php

 add_action( 'wp_ajax_load_more_posts', 'load_more_posts' );
    add_action( 'wp_ajax_nopriv_load_more_posts', 'load_more_posts' );
    function load_more_posts(){
        global $post;
        $args = array('post_type'=>'post', 'posts_per_page'=> 2, 'offset'=> $_POST['offset']);
        $rst=[];
        $query = new WP_Query($args);
        if($query->have_posts()):
            while($query->have_posts()):$query->the_post();
                $rst[] = $post;
            endwhile;
            wp_reset_postdata();
            $offset = $_POST['offset']+2;
        endif;
        wp_send_json_success(array('post'=>$rst, 'offset'=>$offset));
    }

wp_ajax_nopriv_(action) выполняется для пользователей, которые не авторизованы. wp_ajax_(action) выполняется для пользователей, которые авторизованы.

Вы можете использовать ответ запроса как вам угодно. Надеюсь, это поможет!

17 авг. 2017 г. 00:46:09
Комментарии

Спасибо! Очень полезно, попробую адаптировать это под свою функцию.

scopeak scopeak
17 авг. 2017 г. 04:57:36