Получите данные всех сообщений запроса перед разбиением на страницы

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

(Нумеровавшие страницы сообщения отобразили бы изображение функции, выборку..., в то время как список всего сообщения сохранит только постоянную ссылку),

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

Но я не могу найти как до сих пор.

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

Вы парни когда-нибудь сталкивались с подобной проблемой? Какое-либо предложение к этой проблеме?

1
03.05.2014, 10:31
3 ответа

Если Вы хотите выполнить его в едином запросе, рычаге pre_get_posts запрашивать для всех сообщений:

function wpd_archive_all_posts( $query ){
    if( $query->is_post_type_archive( 'attractions' ) && $query->is_main_query() )
        $query->set( 'posts_per_page', -1 );
}
add_action( 'pre_get_posts', 'wpd_archive_all_posts' );

Затем нумеруйте страницы те результаты вручную в шаблоне:

if( have_posts() ){

    $posts_per_page = 10;
    $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
    $start = ( ( $paged - 1 ) * $posts_per_page ) - 1;
    $end = ( $paged * $posts_per_page ) - 1;
    $wp_query->current_post = $start;

    while( have_posts() ){
        the_post();

        // output post data here

        if( $end == $wp_query->current_post )
            break;

    }

}

Затем перемотка и вывод все они:

$wp_query->rewind_posts();
while( have_posts() ){
    the_post();
    the_title();
}

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

2
19.02.2020, 22:53
  • 1
    отличного решения, Pieter Goosen и Milo: Вы парни помогли мне много на этом!Большое спасибо! спасибо –  Daco 05.05.2014, 11:47

Вытянутый непосредственно из wordpresses кодекса:

// main loop
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_content(); ?>
<?php endwhile; endif; ?>


// rewind
<?php do something with query_posts() here to modify the loop here. ?>
<?php rewind_posts(); ?>

// new loop
<?php while (have_posts()) : the_post(); ?>
<?php the_content(); ?>
<?php endwhile; ?>

Отметьте, rewind_posts () делает просто, что, он перематывает цикл сообщения к началу, позволяя Вам циклично выполниться через него во второй раз.

Однако, если то, что Вы желаете, является 2 несколько различными списками, т.е.: первый цикл является списком 100 сообщений, и вторым является разбитый на страницы список только 10 сообщений на страницу, можно использовать query_posts () для изменения запроса перед выполнением его во второй раз. Обычно не желательно использовать query_posts (), поскольку это изменяет основной цикл, но в таких ситуациях, это будет Ваш лучший выбор.

0
19.02.2020, 22:53
  • 1
    я все еще думаю, что должен быть лучший метод, чем использовать query_posts выполнять два diffirent цикла на нормальной странице архива. Правда, query_posts решает проблему, я могу сделать точно, в чем нуждается автор вопроса. Я действительно хотел бы, чтобы кто-то придумал что-то лучше, чем query_posts. BTW, Ваш код только работает, если это - прямое никакой специальный запрос. –  Pieter Goosen 03.05.2014, 22:00
  • 2
    Хорошо, поскольку я не знаю точно, какой OP выполняет мудрый запрос, я опустил его. Однако я действительно добавлял, где Вы захотите выполнить query_posts (). Быть вопросом того по существу OP на самом деле требует 2 отдельных запросов, я не полагаю, что существует способ постараться не выполнять второй запрос. –  Hybrid Web Dev 03.05.2014, 22:18
  • 3
    Спасибо за это я сделал выполнил второй запрос в конце. Но любил бы избегать его! возможно, у кого-то будет лучшая идея... –  Daco 03.05.2014, 23:07
  • 4
    @Daco отправьте свой код, который решил Вашу проблему как ответ. Было бы хорошо видеть, как Вы сделали это. Вы могли бы также получить несколько предложений к лучше своему коду. –  Pieter Goosen 04.05.2014, 06:22
  • 5
    Glad Вы выяснили его Daco. Если бы мой ответ помог, то Вы могли бы принять его? Также как Pieter сказал, было бы замечательно при редактировании OP для включения кода, так, чтобы другие могли извлечь выгоду. –  Hybrid Web Dev 04.05.2014, 12:01

Хорошо я не уверен, что это - лучшее решение, в то время как контроль его делает меньше запросов, чем стандартная страница архива? возможно, потому что я не назвал meta как автор и дата... Если у кого-либо есть реальный anwer, сообщите мне Аплодисменты

//first the main loop paginated:
if ( have_posts() ) :
while ( have_posts() ) : the_post();
    //get permalink, title,custom metas and feature image
else :
    get_template_part( 'content', 'none' );
endif;
//then I run the second loop for all posts of the Custom Post Type
$args = array(
        'post_type'  => 'attractions',
        'post_status' =>    'publish',
        'posts_per_page'=>-1
    );
$wp_query = new WP_Query($args);
while ( $wp_query->have_posts() ) : $wp_query->the_post();
    //get datas of all posts
endwhile; wp_reset_postdata(); 
0
19.02.2020, 22:53
  • 1
    Вашим вопросом был fague. То, что Вы используете CPT полностью, изменяет целую игру с мячом. Должен был упомянуть, что в Вашем вопросе, было бы намного легче решить. –  Pieter Goosen 04.05.2014, 20:32
  • 2
    Жаль Pieter я не сделал imageine, он сделает его что намного легче! :-), Вы думаете, что решение Milo является лучшим? –  Daco 05.05.2014, 11:07
  • 3
    я определенно дал бы ему попытку. Я лично думаю, что это - принятый ответ –  Pieter Goosen 05.05.2014, 11:10