Установка количества записей на страницу в 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 работает. Есть идеи, почему?
Niko Nyman
Добавляя к существующим переменным запроса, мы ничего не перезаписываем. Это как сказать: "Дай мне твои настройки, я изменю одно значение, а затем сброшу их." перед выполнением запроса.
Kevinleary.net
На форуме поддержки Wordpress.org идёт обсуждение именно этой проблемы. Автор той темы нашёл решение, но пока не опубликовал его.
Всё равно спасибо за помощь.