サポート » 使い方全般 » indexページのカスタム投稿のページングでnot found

  • 解決済 studiooak

    (@studiooak)


    初めてのWordPressサイトで困っています。カスタム投稿タイプでページネーションの2ページ目がのnot foundになるというよくあるらしいパターンです。ページ送りができないのはトップページで、index.phpで全てのカスタム投稿タイプの最新の投稿を抜粋記事で掲載してあります。記事は既に15件あります。URLは〜/page/2になっています。
    ローカルでは3.3で制作、最後に確認したときには、ちゃんと表示されていたような気がします。(気のせいかも)サーバーにアップする時に3.4のWPを新たにダウンロード、オリジナルテーマは、その中に入れました。他の部分には問題はなさそうです。

    当サイトは、6つのカスタム投稿タイプをブログのジャンルとして、構成してあります。
    1ページに管理画面で記事8件指定。posts_per_pageも同じにしてあります。
    似たような事例はかなりあるようで、いろいろ試してみましたが解決しません。状況も微妙に違います。
    query_postsのコードは以下の通り。参考書にあった通りです。参考書にはposts_per_pageの指定はなかったので、最初は入れてありませんでしたが、これがないからか?と思っていれましたが、変わりなしです。

    <?php $args = array(
     'post_type' => array('antiaging','house','marriage','family','town','try'),
    'paged' => $paged,
    'posts_per_page'=>8
    ); ?>
    <?php query_posts($args); ?>

    やってみたページネーションの部分は以下の通り。
    (プラグイン「WP-Pagenavi」を使いたいのですが、試してもnot foundの状況は変わりなかったので、とりあえず停止にしてあります。)ページ内及びfooterでループの変更はないのでresetはしていません。

    <?php endwhile; endif; ?>
    
    <div id="pagenation">
        <p class="oldpage"><?php next_posts_link('&laquo;古い記事'); ?></p>
        <p class="newpage"><?php previous_posts_link('新しい記事 &raquo;'); ?></p>
    </div>

    やってみたこと
    1.解決したという声の多かった「Custom Post Type Category Pagination Fix」というプラグイン→効果なし。3.4に対応していない?
    2.管理画面の表示投稿数を1、posts_per_pageをそれ以上にする。→管理画面に指定した通りの数の表示になってしまう。(管理画面の表示投稿数より、posts_per_pageの値が大きいと404になるという記事があり、1にしたら直ったという記事があったため)
    3,まだ、各投稿タイプの記事が少なく最多で4件だったため、その数に合わせて表示を2にもしてみましたが、効果なし。
    4.<?php endwhile; endif; ?>を分けて、<?php endif; ?>の前にpagenationを入れる。
    5.プラグインを停止してみる
    (といっても、今のところベーシックなものだけで、Akismet Contact Form 7 WP Multibyte Patch )

    ネット上では、さまざまなコードの提案が書いてありましたが、タクソノミーのアーカイブだったり、固定ページだったりなどと状況が違うので、PHP無知の私には正しくアレンジできないと思い、試していません。アメリカのフォーラムでこの問題について、リライトルールが関係していることなどが指摘されていましたが、どうも理解できないのです。どなたか、助けて下さると嬉しいです。

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • studiooakさん。はじめまして

    <?php $args = array(
     'post_type' => array('antiaging','house','marriage','family','town','try'),
    'paged' => $paged,
    'posts_per_page'=>8
    ); ?>
    <?php query_posts($args); ?>

    こちらのコードですが3行目の$pagedというのはちゃんと取得できていますか?
    echoなりで表示させてみて下さい。
    その上でもしちゃんととれていない場合は
    <?php $paged = (get_query_var('page'))?get_query_var('page'):1; ?>
    を$argsへの代入前に入れると動くかもしれません。
    WP-Pagenaviの場合は引数にこの取得したpostを渡してやる必要があったと思います。

    また、余談ですがもし今後色々とカスタマイズをしていくのであれば
    本来とは違う動き(アーカイブページでアーカイブ以外のものを表示等)の場合は
    get_post等を使う方が色々といいようです。

    モデレーター jim912

    (@jim912)

    studiooakさん、jdbbさん

    WordPressのデフォルトでは、通常投稿(post)のアーカイブ表示となります。
    この場合、query_postsを行う前は、このデフォルトのロジックで動作するため、投稿の公開記事の全数が2ページ目を表示するほどないと、404になってしまいます。

    対処法としては、フロントページの設定で、トップヘージを固定ページを割り当てるか、3.3の新しい関数 is_main_query を使おうを参考に、is_homeだったら、post_typeとposts_per_pageをsetすればよいかと思います。

    モデレーター gatespace

    (@gatespace)

    こんばんは。
    jim912さんの方法を試してみてください。
    私もis_main_queryを使うのがお勧めです。

    それに加えて

    記事は既に15件あります。URLは〜/page/2になっています。

    もしかしてパーマリンクをデフォルト以外にしていますか?
    そうであれば、パーマリンクをデフォルトに戻してみてください。
    それでも動かないのであれば .htaccessを確認してみてください。
    (これが「アメリカのフォーラムでこの問題について、リライトルールが関係していることなどが指摘されていましたが〜」の部分の確認方法です。

    jdbbさん、gatespaceさん、お返事ありがとうございます。
    jim912さん、何度も助けて下さって感謝しています。

    お返事いただいた内容で具体的にどうしていいかわからなかったため、それぞれ理解するためにネットで調べているうちに、また別のみっともない不具合が発生してしまいました。そちらを早急に直さなければいけないので、また後ほどアドバイスの結果をご報告(また質問になってしまうかもしれませんが)いたします。とりあえず、お返事とお礼だけでもと思って投稿しました。

    またよろしくお願いいたします。

    jim912さんgatespaceさん訂正ありがとうございます。
    通常のクエリを変更する簡単な方法があったんですね
    リンク先を拝見した所この方法なら表示件数が変わるようなもの
    (アーカイブに依って10件表示だったり5件表示だったり)でも管理画面の
    表示設定を1件にしてすべてのクエリにposts_par_pageを指定しなければいけない
    という面倒な事をしてましたがそちらの方でも便利になりそうです。

    教えて頂いたように、試しにローカルMAMP内でいろいろ試してみました。パーマリンクは投稿名からデフォルトに。が、残念ながら、状況は変わりませんでした。いろいろ調べてis_main_queryをいれてみました。以前と同じような状況なのですが、今度はトップページから、表示がおかしくなってしまいます。not foundは出ないのですが、一見、index.phpを読み込んでいるようにみえて、ところどころレイアウトが崩れた状態。古い記事、新しい記事は読み込んでおり、paged=2、paged=3となっていますが、sidebarとheaderの一部のCSSが効いていない状態です。

    全て足した数ではなく、各投稿タイプの記事件数がそれぞれ指定の数量を満たしていないとダメなのかと思い、表示数を4にし、ダミーテキストで各投稿タイプ記事が5件以上あるようにしましたが、トップページは変わらず、です。タクソノミーで作ったカテゴリーアーカイブページでは、正しく表示されています。
    以下のようなコードをfunction.phpに記述しました。index.phpの元のquery_postsのコードは削除しています。どこかがまちがってるのでしょうね。

    add_action( 'pre_get_posts', 'mycpts_display_eight_articles' );
    function mycpts_display_eight_articles( $wp_query ) {
        if ( $wp_query->is_main_query() && $wp_query->is_home()) {
             $wp_query->set( 'posts_per_page', 4 );
            $wp_query->set( 'post_type','antiaging' && 'house'&&'marriage'&& 'family'&& 'town'&&'try');
       }
    }

    gatespaceさん
    デフォルトの.htaccessを確認してみました。以下の通りです。

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /wordpress/index.php [L]
    </IfModule>
    
    # END WordPress

    多分関係無いと思いますが、function,php内、register_taxonomyの指定の最後に
    ‘rewrite’ => array ( ‘slug’ => ‘try/tag’)と
    以下のリライトルールの指定があります。参考書のコード通りです。

    $mycpts = get_post_types(array('builtin' => false));
    foreach ($mycpts as $mycpt) {
         add_rewrite_rule($mycpt.'/cat/([^/]+)/?$',
         'index.php?'.$mycpt.'_cat=$matches[1]', 'top');
    
         add_rewrite_rule($mycpt.'/tag/([^/]+)/?$',
         'index.php?'.$mycpt.'_tag=$matches[1]', 'top');
    }
    モデレーター jim912

    (@jim912)

    studiooakさん

    $wp_query->set( 'post_type',array('antiaging','house','marriage','family','town','try') );

    は試しましたか?

    モデレーター gatespace

    (@gatespace)

    studiooakさん
    .htaccessは問題ないと思います。

    真っ白になるのは jim912さんの指摘通りです。
    パラメーターの指定の仕方は WP_Query を参照してください。
    (post_typeの指定は(string / array)なんで、複数ある場合は配列で指定です。)

    お手数をおかけしています。
    arrayでやってみたのですが、うまくいきません。トップページ、2ページ以降共に、一部CSSが効いていません。
    post_typeが複数あるので、arrayだろうと思い、最初はそれでやってみましたが、表示は変わらず、Notice: Array to string conversion in /Applications/MAMP/htdocs/wordpress/wp-includes/post-template.php on line 387 class=”blog logged-in admin-bar Array”>というメッセージがでてしまいました。&&に変えてみたところ、メッセージが消えたので、あれでいいのかと思って。今日、もう一度jim912さんのコードをコピペしてやってみましたが、やはり、メッセージがでます。

    トップページを固定ページに変更もやってみました。index.pageを削除。home.phpを作り、フロントページの設定で固定ページを設定。最初のコードに戻しましたが、状況は変わりませんでした。今度は2ページ目は、notfoundになります。
    どこか、根本的なところに間違いがあるのでしょうか。

    モデレーター gatespace

    (@gatespace)

    studiooak さん。
    問題の切り分けを行ってみましょう。

    まずはプラグインを全部オフ。
    パーマリンクもデフォルトに戻す。
    トップの表示設定は固定ページではなくしてみる。
    テーマもデフォルトのTwenty Elevenにしてみる。

    そして、Twenty Elevenの(本当は子テーマを作った方が良いですけど)functions.phpにコードを追加

    add_action( 'pre_get_posts', 'mycpts_display_eight_articles' );
    function mycpts_display_eight_articles( $wp_query ) {
      if ( $wp_query->is_main_query() && $wp_query->is_home() ) {
        $wp_query->set( 'posts_per_page', 4 );
        $wp_query->set( 'post_type', array( 'antiaging', 'house', 'marriage', 'family', 'town', 'try' ) );
      }
    }

    これで表示件数や表示される内容、ページ送りが意図した通りになっているのなら、
    今使っているプラグインまたはテーマの問題です。
    意図した通りに表示できていなければ、追加したコードの問題となります。

    gatespaceさん
    ありがとうございます。やってみます。

    gatespaceさん

    アドバイス頂いた通りにtwentyelevenの子テーマを作って確認してみました。
    カスタム投稿で作成した記事が8本はいり、ページングもできています。
    やはり、オリジナルテーマのどこかがおかしいのですね。

    もう少し、確認してみる事にして、twentyelevenのfunctionに同名の関数がないのを確認、子テーマのfunctionにregister_post_typeの指定を入れてみると、以前のようにダッシュボードにカスタム投稿名が表示されません。
    sidebar.phpのコードも、怪しい。試しにコピーして子テーマに入れてみると、各カスタム投稿タイプごとの
    <?php wp_list_categories(‘taxonomy=antiaging_cat&title_li=’); ?>
    の部分が表示されていません。

    どこをどうすればよいのか見当がつかないのですが、まず
    ①functionにコード指定する代わりにCustum Post Type Uiを使ってみた方がよいでしょうか?
    ②sidebarのコードに問題があるかどうか、教えて頂けるでしょうか?

    <div id="sidebar">
     <div id="joinus">
      <a href="<?php echo home_url(); ?>/?page_id=2/">
            <?php dynamic_sidebar(); //ウィジェットのテキスト使用 ?>
      </a>
     </div>
    
    <div id="genremenu">
      <h3 class="antiaging">アンチエイジング
      </h3>
      <!-- #sidebar h3で背景画像の位置とfont-size指定 クラスで画像指定 -->
      <div class="genreterm">
           <?php wp_list_categories('taxonomy=antiaging_cat&title_li=');
    //カスタム投稿タイプのタクソノミーで作ったカテゴリーのリスト ?>
      </div>

    <h3>のカスタム投稿タイプ名と<div class=”genreterm”>のカテゴリーリストのセットで、6つのカスタム投稿が並ぶつくりです。
    本当にお手数ばかりで恐縮ですが、どうぞよろしくおねがいいたします。

    モデレーター gatespace

    (@gatespace)

    こういうときは優先順位をつけて作業しないとどこに問題があるか分からなくなりますよ。

    まずはカスタム投稿タイプとカスタム分類をダッシュボードから使えるようにしてみましょう。

    子テーマのfunctionにregister_post_typeの指定を入れてみると、以前のようにダッシュボードにカスタム投稿名が表示されません。

    コードを提示してもらわないとどこに問題があるのか誰も分かりません。

    functionにコード指定する代わりにCustum Post Type Uiを使ってみた方がよいでしょうか?

    プラグインを使った方がテーマを変えても運用できるので、
    特別な理由が無い限りはそうした方が良いと思います。

    ※一応、このスレッドのタイトルが
    「indexページのカスタム投稿のページングでnot found」ですので、この部分の問題が解決したならいったんスレッドを閉じて、新規スレッドを立ててください。
    その際、関連する事項であれば、このスレッドにリンクを張ってください。

    そうですね。私の中ではつながっている問題でしたので、うっかりしていました。終了いたします。

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • トピック「indexページのカスタム投稿のページングでnot found」には新たに返信することはできません。