В чем ошибка функции (динамический вывод постов wordpress)?

Пытаюсь совместить infinity-scroll и описанный в этой статье вывод динамического архива записей.

Входные условия:
0. Wordpress + Open Server (т. е. всё крутится у меня на компьютере)
1. Создан произвольный тип контента "work"
2. Для этого типа контента создана таксономия "view" (по сути - теги).

Задача следующая:
1. На страницу site.name/portfolio/ выводить все термины таксономии view (к примеру "все", "только а" и "только б"). Термины могут добавляться, удаляться, меняться и т.д. (всё в админке)
2. Загружать первые n постов, относящихся к термину "все"
3. Если в базе больше постов, чем загружены, отображать кнопку "загрузить ещё"
4. После загрузки очередной порции постов - проверять, остались ли ещё посты в базе. Если нет - скрывать кнопку.
5. При нажатии на другой термин - убирать то что загружено ранее и загружать первые n постов, относящихся к этому термину. Ну и далее тот же принцип работы кнопки "загрузить ещё".

Как решал задачу:
1. Вывод терминов:
$terms = get_terms('view');
$term_count = count($terms);
if($term_count > 0){
    foreach ($terms as $term) {
        $term_info = get_term_by( 'slug', $term->slug, 'view');
        $count = $term_info->count;
        echo '<input type="radio" name="type" id="'.$term->slug.'" value="'.$term->name.'" data-count="'.$count.'"><label for="'.$term->slug.'">'.$term->name.'</label>';
    }
}

Выводу все термины в виде radio-input'ов (тут думаю не принципиально, можно и обычными кнопками было сделать, например). Каждому input'у присваиваю id и value по слагу термина. (далее использовать значение value)
Сразу получаю количество постов с данным термином и записываю его в дата-атрибут.

На данном этапе загружается пустая страница с полоской radio-input'ов.

Сама страница:
<div id="test">
    <div id="archive_browser">
        тут термины
    </div>
    <ul id='archive_pot'>
        сюда загружаются работы
    </ul>
    <div style="text-align:center; padding:30px; display: none;" id="loader"><img src="/ajax-loader.gif"></div>
    <input type="button" value="ещё" id="more" style="display: none;">
</div>


2. Загрузка постов (комментарии в коде)
$(document).ready(function() {
        $("#archive_browser input[type='radio']:eq(0)").attr('checked', true);
        gater();
    });


3. Сама функция
function gater() {
    $('#archive_pot').empty();

    var busy = false;
    var offset = 0;
    var number = 1;
    var type = $("#archive_browser input[type='radio']:checked").attr("value");
    var max_count = $("#archive_browser input[type='radio']:checked").attr("data-count");

    function getData() {

        busy = true;

        $.ajax({
            type: 'POST',
            url: 'путь до archive_getter.php',
            data: 'type=' + type + '&number=' + number + '&offset=' + offset,
            cache: false,
            beforeSend: function(xhr){
                $('#loader').show();
            },
            success: function(data){
                $('#archive_pot').append(data);
                if(number+offset < max_count) {
                    $('#more').show();
                }
                else {
                    $('#more').hide();
                }
                offset = offset+number;
                busy = false;
            },
            complete: function(){
                $('#loader').hide();
            }
        });
    }

    getData();

    $('#more').click(function() {
        if(busy == false) {
            busy = true;
            getData();
        }
    });
}


4. archive_getter.php
require($_SERVER['DOCUMENT_ROOT'].'/wp-load.php');
$type = htmlspecialchars(trim($_POST['type']));
$number = htmlspecialchars(trim($_POST['number']));
$offset = htmlspecialchars(trim($_POST['offset']));

global $post;
$args = array(
    'post_type' => 'work',
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'view',
            'field' => 'slug',
            'terms' => $type
        ),
    ),
    'posts_per_page' => $number,
    'offset' => $offset,
);
$posts = get_posts($args);
foreach( $posts as $post ){ setup_postdata($post);
    echo '<li">';
    echo the_post_thumbnail();
    echo the_permalink();
    echo '</li>';
}
wp_reset_postdata();


5. Выполнение функции при переключении radio-inputa
$('#archive_browser').change(function() {
        gater();
    });


Результат
1. Оно работает!
2. Оно работает криво:
- Сразу после загрузки, на первом термине, всё срабатывает как задумано
- Если переходить с термина на термин, загружая каждый раз все работы до конца, то первые 2-3 круга всё работает как задумано, но с каждым разом растёт скорость загрузки
- Если пройтись по терминам, не загружая на каждом все посты (2-3 круга), а потом, к примеру, на первом термине нажать кнопку "загрузить ещё" - он загрузить все вторые посты каждого термина, такое количество раз, сколько кругов было проделано.

Прошу помощи!
Где ошибка? Что не учёл?
  • Вопрос задан
  • 3414 просмотров
Пригласить эксперта
Ответы на вопрос 1
очень много букв, начнем по порядку - type является зарезервированной таксономией, необходимо переименовать. Пару раз ловил глюки, создавая таксономию order.

codex.wordpress.org/Function_Reference/register_ta...
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
22 нояб. 2024, в 22:26
3500 руб./за проект
22 нояб. 2024, в 21:47
3000 руб./за проект
22 нояб. 2024, в 21:44
50000 руб./за проект