サポート » 使い方全般 » 3.7.1にバージョンアップ後 カスタム投稿のアーカイブが表示されない

  • 解決済 yukimaru

    (@yukimaru)


    お世話になっております。

    WordPressのバージョンアップを行なった後に
    カスタム投稿で設定したアーカイブが404となってしまいました。
    バージョン3.6.1の時には表示されており、
    そこから変更しておりません。

    functions.phpには以下の記述をいれ、

    //カスタム投稿タイプ アーカイブ----------------
    global $my_archives_post_type;
    add_filter( 'getarchives_where', 'my_getarchives_where', 10, 2 );
    function my_getarchives_where( $where, $r ) {
      global $my_archives_post_type;
      if ( isset($r['post_type']) ) {
        $my_archives_post_type = $r['post_type'];
        $where = str_replace( '\'post\'', '\'' . $r['post_type'] . '\'', $where );
      } else {
        $my_archives_post_type = '';
      }
      return $where;
    }
    add_filter( 'get_archives_link', 'my_get_archives_link' );
    function my_get_archives_link( $link_html ) {
      global $my_archives_post_type;
      if ( '' != $my_archives_post_type )
        $add_link .= '?post_type=' . $my_archives_post_type;
    	$link_html = preg_replace("/href=\'(.+)\'\s/","href='$1".$add_link."'",$link_html);
    
      return $link_html;
    }

    該当箇所へはこちらをいれています。
    <?php wp_get_archives('type=monthly&post_type=news_post&show_post_count=1'); ?>

    ご教授いただけますよう宜しくお願い致します。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • 初めまして。

    同様の現象にあい、調査中です。
    3.7.1でも、同一テーマによっては古いバージョンで正常に動作している場合もあります。

    現在までwp_get_archives呼び出し時に、my_get_archives_link関数がカスタム投稿のアーカイブへのリンク文字列を正しく返していないことまでは確認しました。
    ※var_dumpで確認

    • $my_archives_post_typeには設定したポストタイプ値が設定されている
    • $add_linkには「?post_type=設定したポストタイプ値」が設定されている
    • $link_htmlには$add_linkの値が置換されて設定されていない
    • また、my_get_archives_linkはよくある前例のコピペの様ですが、読み手の誤解釈を避けるため以下に修正しています。

      function my_get_archives_link($link_html) {
          global $my_archives_post_type;
          if ($my_archives_post_type != '') {
              $add_link = '?post_type=' . $my_archives_post_type;
              $link_html = preg_replace("/href=\'(.+)\'\s/", "href='$1" . $add_link . "'", $link_html);
          }
          return $link_html;
      }

      preg_replace関数は置換文字列にパターンがマッチしない場合、入力値をそのまま返却するようなのですが、なぜ動作しなくなったのかが不明です。

    どうやら正常動作する、しないは正規表現関係の差のようです。

    • サーバにインストールされている正規表現ライブラリ
    • WordPressのバージョンによる正規表現の扱いの差?

    置換パターンで使用している\sはPerl固有の定義済み文字クラスであり、行いたい置換パターンでは不要と思われます

    そこで、以下のコードで試したところ思う通りの動作となりました。

    function my_get_archives_link($link_html) {
        global $my_archives_post_type;
        if ($my_archives_post_type != '') {
            $add_link = '?post_type=' . $my_archives_post_type;
            $link_html = preg_replace("/href=\'(.+)\'/", "href='$1" . $add_link . "'", $link_html);
        }
        return $link_html;
    }
    トピック投稿者 yukimaru

    (@yukimaru)

    shirakobato様

    初めまして。
    お世話になっております。
    調査また、ご回答までいだだけ大変幸甚でござます。

    知識不足のところもあり、
    webより引用したものをそのまま使用しておりまして、
    どこを直せばよいか検討がつきませんでした。
    今回ご教授いただきましたことを勉強したいと思います。
    この度は本当にありがとうございます。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「3.7.1にバージョンアップ後 カスタム投稿のアーカイブが表示されない」には新たに返信することはできません。