Пользовательский архив типов записей, не относящийся к "записям на странице" => -1


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

$args = array(
    'post_type' => array(
        'cpt_sports',
    ),
    'posts_per_page' => -1,
    'orderby' => 'menu_order',
    'order' => 'desc',
    'max_num_pages' => 1
);

$all_sports = new WP_Query($args);

Что я здесь делаю не так?

Author: Anriëtte Myburgh, 2014-10-07

1 answers

WP_Query предназначен для вторичных циклов. Это означает, что он полностью независим от страницы по умолчанию $wp_query. Я подозреваю, что это не работает, потому что вы не ссылаетесь на свой новый объект WP_Query в цикле. Чтобы сделать это, вы должны сделать следующее:

if( $all_sports->have_posts() ) : while( $all_sports->have_posts() ) : $all_sports->the_post();
    // do stuff
endwhile; endif;

ОДНАКО вам не следует этого делать!

Вместо этого это идеальное использование pre_get_posts действие. Это действие можно использовать для изменения запроса по умолчанию на любой странице без каких-либо изменений на странице шаблон. Видя, что вы просто хотите изменить запрос архива пользовательского типа записи по умолчанию, это то, что вам нужно. Вот несколько непроверенных кодов, которые, вероятно, должны сработать:

add_action( 'pre_get_posts', 'wpse163734_pre_get_post' );
function wpse163734_pre_get_post( $query ) {

    if( is_post_type_archive( 'cpt_sports' ) && !is_admin() && $query->is_main_query() ) {
        $query->set( 'posts_per_page', -1 );
        $query->set( 'orderby', 'menu_order' );
    }

}

Все остальные аргументы, которые вы приводите WP_Query, являются значениями по умолчанию для запроса страницы архива пользовательского типа записи, поэтому вам не нужно их изменять.

 6
Author: mrwweb, 2014-10-07 21:51:44