私はrock
と呼ばれるカスタム分類法と共にgenero
と呼ばれるカスタム投稿タイプを持っています。 taxonomy-genero-curiosity.php
マイページ/ロック/好奇心/
後続のページ番号付きページリンクをクリックしたとき([2]、[3]、[next]など)
マイページ/ロック/好奇心/ページ/ 2
404ページに移動します。
<?php
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
//for a given post type, return all
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'genero',
'field' => 'slug',
'terms' => 'curiosity'
)
),
'post_type'=>'', //add your post type name
'posts_per_page' => 1,
);
$my_query = null;
$my_query = new WP_Query($args);
if( $my_query->have_posts() ) {
while ($my_query->have_posts()) : $my_query->the_post(); ?>
<p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p>
<?php
endwhile;
}
wp_reset_query(); // Restore global post data stomped by the_post().
?>
<?php wp_pagenavi( array( 'query' => $my_query ) ); ?>
<?php wp_reset_postdata(); ?>
どうすればこれを修正できますか?何がおかしいのですか?
EDIT
これが私の投稿タイプの登録方法です
function my_custom_post_product() {
$labels = array(
'name' => _x( 'Rock', 'post type general name' ),
'singular_name' => _x( 'Rock', 'post type singular name' ),
'add_new' => _x( 'Add New', 'entry in rock' ),
'add_new_item' => __( 'Add New entry in rock' ),
'edit_item' => __( 'Modificar entry in rock' ),
'new_item' => __( 'New entry in rock' ),
'all_items' => __( 'all entry in rock' ),
'view_item' => __( 'see entry in rock' ),
'search_items' => __( 'search entry in rock' ),
'not_found' => __( 'Nothing entry in rock' ),
'not_found_in_trash' => __( 'Nothing entry in rock on thrash' ),
'parent_item_colon' => '',
'menu_icon' => get_bloginfo('template_directory'). '/images/my_menu_icon.png',
'menu_name' => 'Rock'
);
$args = array(
'labels' => $labels,
'description' => 'Introduzca un nueva entrada en rock',
'public' => true,
'menu_position' => 5,
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ),
'has_archive' => true,
'hierarchical' => true,
'rewrite' => array('slug' => 'Rock/%genero%', 'with_front' => false),
'query_var' => true,
//'rewrite' => true,
//'publicly_queryable' => false,
);
register_post_type( 'Rock', $args );
}
add_action( 'init', 'my_custom_post_product' );
そして今ここに私のループがあります。私はまだこのコードで404エラーが出ます
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<header>
<h2><a href="<?php the_permalink(); ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
<p><time datetime="<?php echo get_the_date(); ?>"><?php echo get_the_date(); ?></time>. <?php if ( comments_open() ) : ?><a class="comment" href="<?php the_permalink(); ?>#comments"><?php comments_number('0 Comments', '1 Comment', '% Comments'); ?></a><?php endif; ?></p>
</header>
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
<nav class="paging">
<?php if(function_exists('wp_pagenavi')) : wp_pagenavi(); else : ?>
<div class="prev"><?php next_posts_link('« Previous Posts') ?></div>
<div class="next"><?php previous_posts_link('Next Posts »') ?></div>
<?php endif; ?>
</nav>
編集2
キャメルケースの "Rock"を "rock"に変更して動作しましたが、Admin> Settings> Readingで設定を変更し、(ループ上の)posts_per_pageの数のように表示を5に設定した場合のみ他のページへの投稿数を減らすためにpost_per_page = 3([2]、[next]など)を指定すると404エラーページが表示されます。
他のページで必要に応じて番号をカスタマイズする方法はありますか?
<?php $posts=query_posts($query_string . '&orderby=asc&posts_per_page=5'); if (have_posts()) : while (have_posts()) : the_post(); ?>
<h2><a href="<?php the_permalink(); ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
<?$content = get_the_excerpt();
echo substr($content, 0, 200);
global $post;
$text = $post->post_excerpt;?>
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
あなたの問題は間違いなくあなたのカスタムクエリです。私が今は扱わないでしょうあなたのカスタムクエリに問題が1つまたは2つあります。 このページ(WP_Query
) を介して作業してください。カスタムクエリを適切に構築する方法について
あなたの本当の問題はここにあります、そしてあなたがあなた自身に尋ねなければならない質問は、カスタムクエリが必要ですか?そして正直な答えはしっかりしたNOであるべきです。ホームページ上のメインクエリとあらゆる種類のアーカイブページを優先して、カスタムクエリは常に避けるべきです。メインクエリは、要求されている特定のページに非常に固有のもので、カスタムクエリでは再現されません。
これらのカスタムクエリは機能しますが、実際に問題になったのは、現在経験しているように、ページ付けを試みたときです。
テンプレートのメインクエリの結果を表示するためのデフォルトループを含む基本的なレイアウトは、次のようになります。
if( have_posts() ) {
while( have_posts() ) {
the_post();
// CALL YOUR TEMPLATE TAGS
}
}
if
条件はsingle.phpテンプレートやアーカイブテンプレートのように常に必要というわけではありません。ご覧のとおり、NOカスタムクエリです。
メインクエリに必要な変更(カスタムクエリを実行する必要があるページテンプレートを除く)は、pre_get_posts
を介して行うことができます。これは、テンプレートに対して行われる内容を変更する正しい方法です。上記の追加情報については、 この記事をチェックしてください
それで、あなたの解決策は、あなたのカスタムクエリのすべての部分を削除して、私が上で与えたようにデフォルトのループで置き換え、ループオブジェクトとそれにHTMLマークを追加するだけです。
編集
あなたのペーストからのコードから、あなたの問い合わせは今大丈夫に見えます。それがどうあるべきかです。
これらすべての根本原因はあなたの投稿タイプRock
です。カスタム投稿タイプ名にキャメルケースを使用することはできません(これはカスタム分類法と関数名に使用されます)。カスタム投稿タイプをrock
に変更することを検討してください。
また、カスタム投稿タイプコードを更新した後に変更が有効になったことを確認するために、パーマリンクをフラッシュして更新してください。
編集2
リンクされている記事を読んでいないか、または query_posts
で自殺のショートカットを取っただけです。この回答のリンク先の記事をもう一度読んでください。あなたは決して決してquery_posts
を利用するべきではありません。
注:この機能は、プラグインやテーマで使用するためのものではありません。後で説明するように、メインクエリを変更するためのより優れた、より高性能なオプションがあります。 query_posts()は、ページのメインクエリを新しいクエリインスタンスに置き換えることによって変更する、非常に単純で問題の多い方法です。これは非効率的で(SQLクエリを再実行する)、状況によっては完全に失敗する可能性があります(特に投稿ページ付けを扱うときによくあります)。
この行を削除
$posts=query_posts($query_string . '&orderby=asc&posts_per_page=5');
この行はあなたのページのあなたの悪の根源です
これを行う正しい方法であるpre_get_posts
を使用して、ページごとにページ付けを変更できます。あなたのcuriosity
という用語のページだけで投稿数を変更する必要がある場合は、functions.php(注:これにはPHP 5.3+)が必要です。
add_action( 'pre_get_posts', function ($q ) {
if( !is_admin() && $q->is_main_query() && $q->is_tax( 'genero', 'curiosity' ) ) {
$q->set( 'posts_per_page', 3 );
$q->set( 'order', 'ASC' );
}
)};
編集3
PHP 5.3より前のバージョンでは、無名関数がPHP 5.3でのみ導入されたため、上記は機能しません。これらのバージョンでは、以下を試してください。
add_action( 'pre_get_posts', 'wpse170243_custom_ppp' );
function wpse170243_custom_ppp($q ) {
if( !is_admin() && $q->is_main_query() && $q->is_tax( 'genero', 'curiosity' ) ) {
$q->set( 'posts_per_page', 3 );
$q->set( 'order', 'ASC' );
}
}
クエリをリセットする前に、ナビゲーションを呼び出してみてください。
...
if (function_exists('wp_pagenavi')) wp_pagenavi(array('query' => $my_query));
wp_reset_query(); // Restore global post data stomped by the_post().
?>
これを試してください。
このcustom_pagination()関数をあなたのfunction.phpファイルに追加してください
function custom_pagination($numpages = '', $pagerange = '', $paged='') {
if (empty($pagerange)) {
$pagerange = 2;
}
global $paged;
if (empty($paged)) {
$paged = 1;
}
if ($numpages == '') {
global $wp_query;
$numpages = $wp_query->max_num_pages;
if(!$numpages) {
$numpages = 1;
}
}
/**
* We construct the pagination arguments to enter into our paginate_links
* function.
*/
$pagination_args = array(
'base' => get_pagenum_link(1) . '%_%',
'total' => $numpages,
'current' => $paged,
'show_all' => False,
'end_size' => 1,
'mid_size' => $pagerange,
'prev_next' => False,
'prev_text' => __('«' , 'Swift'),
'next_text' => __('»' , 'Swift'),
'type' => 'array',
'add_args' => false,
'add_fragment' => ''
);
$paginate_links = paginate_links($pagination_args);
echo '<div class="Pagination-Num"><ul>';
foreach ( $paginate_links as $paginate_link ) {
echo "<li> $paginate_link </li>";
}
echo '</ul></div>';
}
そして、あなたのPostループファイルにcustom_pagination()を呼んでください。
<?php
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
//for a given post type, return all
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'genero',
'field' => 'slug',
'terms' => 'curiosity'
)
),
'post_type'=>'', //add your post type name
'posts_per_page' => 1,
);
$my_query = null;
$my_query = new WP_Query($args);
if( $my_query->have_posts() ) {
while ($my_query->have_posts()) : $my_query->the_post(); ?>
<p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p>
<?php
endwhile;
if (function_exists(custom_pagination)) {
custom_pagination($my_query->max_num_pages,"",$paged);
}
}
wp_reset_query(); // Restore global post data stomped by the_post().
?>
<?php wp_reset_postdata(); ?>
うまくいくと思います