Установка количества записей на страницу в query_posts

8 февр. 2011 г., 18:25:11
Просмотры: 24.2K
Голосов: 1

Потерпите немного...

По умолчанию количество записей на странице в админке равно 10. Во время тестирования я хотел изменить количество записей на странице для архива пользовательских записей на 2 (в WP 3.1).

Проблема в том, что у меня всего 4 записи, поэтому должно быть 2 страницы с 2 записями на каждой, но поскольку по умолчанию установлено 10, переход на /page/2 возвращает ошибку-404 (предположительно потому, что при 10 записях на странице второй страницы не существует)

Единственный способ обойти это - установить значение по умолчанию в админке на 1, но это не идеальное решение, так как теперь мне нужно делать пользовательский query_posts для всех архивов типов записей, чтобы установить количество записей на странице.

Есть ли у кого-нибудь лучший способ сделать это или какие-либо идеи? Спасибо.

archive-project.php:

<?php get_header(); ?>

    <?php
        global $wp_query;
        query_posts(array_merge($wp_query->query, array(
            'paged'          => get_query_var('paged'),
            'posts_per_page' => 2
        )));
    ?>

    <h1 class="title"><?php _e('Предыдущие работы', 'fullycharged'); ?></h1>

    <?php if (have_posts()): while(have_posts()): the_post();?>
        <a href="<?php the_permalink(); ?>" id="post-<?php the_ID(); ?>" <?php post_class('launch col col-' . $i); ?>>
            <span class="project-title"><?php the_title(); ?></span>
            <?php the_content(); ?>
        </a>
    <?php endwhile; endif; ?>

    <?php if ($wp_query->max_num_pages > 1): ?>
        <div id="nav-below" class="navigation">
            <div class="nav-previous"><?php next_posts_link( __( '<span class="meta-nav">&larr;</span> Старые записи', 'twentyten' ) ); ?></div>
            <div class="nav-next"><?php previous_posts_link( __( 'Новые записи <span class="meta-nav">&rarr;</span>', 'twentyten' ) ); ?></div>
        </div>
    <?php endif; ?>

<?php get_footer(); ?>

регистрация типа записи:

register_post_type('project', array(
    'capability_type' => 'post',
    'has_archive' => true,
    'hierarchical' => false,
    'labels' => array(
        'name' => __('Проекты', 'fullycharged'),
        'singular_name' => __('Проект', 'fullycharged'),
        'all_items' => __('Все проекты', 'fullycharged'),
        'add_new_item' => __('Добавить новый проект', 'fullycharged'),
        'edit_item' => __('Редактировать проект', 'fullycharged'),
        'update_item' => __('Обновить проект', 'fullycharged')
    ),
    'menu_icon' => get_stylesheet_directory_uri() . '/images/monitor-off.png',
    'menu_position' => 5,
    'public' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'rewrite'  => array('slug' => 'work', 'with_front' => false),
    'supports' => array('title', 'editor', 'thumbnail', 'custom-fields')
));
7
Комментарии

Могу ли я увидеть код, который вы используете? Вы вызываете get_query_var( 'page' );?

designpx designpx
8 февр. 2011 г. 18:40:23

@Designpx

global $paged; query_posts(array_merge($wp_query->query, array( 'paged' => $paged, 'posts_per_page' => 2 ))); Это все изменения в запросе, которые я внес, без использования get_query_var( 'page' );, но я использовал глобальную переменную $paged, потому что пагинация архивов использует $paged вместо $page

Извините за плохое форматирование

Andrew Lawson Andrew Lawson
8 февр. 2011 г. 19:14:33

@Andre Lawson, У вас есть обычная страница и пользовательский тип записи с одинаковым слагом? Например, у вас есть страница под названием "Рецепты" с слагом "/recipes", а затем у вас есть тип записи "Рецепты", где правило перезаписи установлено как 'rewrite' => 'recipes'? Если да, то вы запутываете WordPress своими ссылками

eileencodes eileencodes
8 февр. 2011 г. 20:26:46

Нет обычной страницы по адресу /recipes, только зарегистрированный пользовательский тип записи в файле functions.php.

Я могу получить первую страницу архива рецептов по адресу /recipes, но когда я изменяю posts_per_page в файле archive-recipes.php на значение, отличное от указанного в WP-Admin -> Настройки -> Чтение, возникает ошибка "страница 'n' не должна существовать (хотя на самом деле должна, согласно моему изменённому posts_per_page)".

Не думаю, что проблема в моём коде в archive-recipes.php, потому что добавление exit; в начало файла ничего не меняет.

Andrew Lawson Andrew Lawson
8 февр. 2011 г. 20:41:15

@eileen @designpx Иными словами, запрос к /recipes показывает первую страницу архива, а /recipes/page/2 не достигает файла шаблона archive-recipes.php, потому что страница 2 не должна существовать согласно настройкам в WP-Admin -> Настройки -> Чтение.

Andrew Lawson Andrew Lawson
8 февр. 2011 г. 21:07:30

@Andrew Lawson - Не знаю, в чём проблема, настройки в wp-admin не должны иметь значения, если заданы posts_per_page и $paged. Попробуйте заменить 'paged' => $paged на 'paged' => get_query_var('paged') и посмотреть, поможет ли это. В противном случае опубликуйте весь код из archives-recipes.php.

eileencodes eileencodes
8 февр. 2011 г. 21:21:00

@eileen get_query_var('paged') не делает никакой разницы, поэтому я добавил свой код в исходный вопрос, но не думаю, что это поможет, так как запрос work/page/2 даже не доходит до файла шаблона

Andrew Lawson Andrew Lawson
8 февр. 2011 г. 21:36:31
Показать остальные 2 комментариев
Все ответы на вопрос 2
3

Вот что я обычно использую в действии pre_get_posts для изменения одного параметра запроса на странице таксономии или категории:

/**
 * Управление количеством результатов поиска
 */
function custom_posts_per_page( $query ) {
    if ( $query->is_tax('mytaxonomy') || $query->is_category('mycategory') ) {
        set_query_var('posts_per_page', 9);
    }
}
add_action( 'pre_get_posts', 'custom_posts_per_page' );
6 июл. 2011 г. 16:46:06
Комментарии

Документация здесь http://codex.wordpress.org/Function_Reference/query_posts создаёт впечатление, что можно просто "обновить" одну переменную запроса с помощью функции query_posts(). У меня это не сработало, а ваш пример с использованием $wp_query->query_vars работает. Есть идеи, почему?

Niko Nyman Niko Nyman
8 сент. 2011 г. 11:15:53

Добавляя к существующим переменным запроса, мы ничего не перезаписываем. Это как сказать: "Дай мне твои настройки, я изменю одно значение, а затем сброшу их." перед выполнением запроса.

Kevinleary.net Kevinleary.net
31 июл. 2012 г. 21:51:27

Мне просто интересно, почему query_posts() не позволяет изменить одно значение, хотя в документации говорится обратное?

Niko Nyman Niko Nyman
24 сент. 2012 г. 13:08:41
0

На форуме поддержки Wordpress.org идёт обсуждение именно этой проблемы. Автор той темы нашёл решение, но пока не опубликовал его.

http://wordpress.org/support/topic/error-404-on-pagination-when-changing-posts_per_page-on-query_posts

Всё равно спасибо за помощь.

8 февр. 2011 г. 23:18:07