Установка количества записей на страницу в query_posts
Потерпите немного...
По умолчанию количество записей на странице в админке равно 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">←</span> Старые записи', 'twentyten' ) ); ?></div>
<div class="nav-next"><?php previous_posts_link( __( 'Новые записи <span class="meta-nav">→</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')
));

Вот что я обычно использую в действии 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' );

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

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

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