質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • PHP

    21269questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    7640questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

カスタム投稿のカテゴリー別の一覧ページを表示させたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 195

mochiko

score 5

wordpressのカスタム投稿でお知らせページを作成しています。
一覧ページから記事のカテゴリーをクリックすると、カテゴリー別の一覧ページを表示させるようにしたいのですが、
どのようなやり方を試しても404 Not Foundになり苦戦しております。

taxonomy.phpのやり方が良いのかなと試したのですが、こちらも上手くいかず…。

もしかしたら一覧のページとカスタム投稿の設定に何か不備があるのかも?と調べたのですが、
力不足のため見つかりませんでした。

下記、お知らせの一覧ページ(archive-news.php)と、カスタム投稿用のfunction.phpのコードになります。

■archive-news.php

<?php
$sdu = get_stylesheet_directory_uri();
$gbi = get_bloginfo('url');

get_header();
?>

<main role="main">
  <section class="pageTtlSec">
    <div class="pageTtlBox">
      <h2 class="pageTtl"><span>News</span>お知らせ</h2>
    </div>
  </section>

  <ul class="breadcrumb">
    <li><a href="/"><span>ホーム</span></a></li>
    <li><span>お知らせ</span></li>
  </ul>

  <section class="pageSec">
    <div class="inner">
      <?php // 年別アーカイブリストを表示
        $year=NULL; // 年の初期化
        $args = array(
          'post_type' => 'news',
          'orderby' => 'date',
          'posts_per_page' => -1
        );
        $the_query = new WP_Query($args); if($the_query->have_posts()){ // 投稿があれば表示
          echo '<ul class="newsChangeBtnList">';
          while ($the_query->have_posts()): $the_query->the_post(); // ループの開始
          if ( $year != get_the_date('Y')){
            $year = get_the_date('Y');
            echo '<li class="newsChangeBtn"><a href="'.home_url( '/', 'http' ).'news/'.$year.'">'.$year.'</a></li>'; // 年別アーカイブリストの表示
          }
          endwhile;
          echo '</ul>';
          wp_reset_postdata();
        }
      ?>
      <div class="newsBlockList">
        <?php
          $newsTerms = get_terms('news_cat');
          if (!empty($newsTerms)):
        ?>
        <ul class="newsCategoryList">
          <li class="newsCatItem"><a class="catCurrent" href="<?= $gbi; ?>/news/">すべて</a></li>
          <?php foreach( $newsTerms as $term ): ?>
          <li class="newsCatItem"><a href="<?= $gbi . '/news/' . $term->slug; ?>/"><?= $term->name; ?></a></li>
          <?php endforeach; ?>
        </ul>
        <?php endif; ?>
        <section class="newsBlock">
          <ol class="newsList">
            <?php
            $args = array(
              'post_type' => 'news',
              'posts_per_page' => 10
            );
            $my_query = new WP_Query($args);
            if ($my_query->have_posts()) : while ($my_query->have_posts()) : $my_query->the_post();
            ?>
            <li class="newsItem">
              <a class="newsLinkBox" href="<?php the_permalink(); ?>">
                <span class="newsCategory">
                  <?php
                  if ($terms = get_the_terms($post->ID, 'news_cat')) {
                    foreach ( $terms as $term ) {
                      echo esc_html($term->name);
                    }
                  }
                  ?>
                </span>
                <time class="newsData" datetime="<?php the_time('c'); ?>"><?php the_time('Y.m.d'); ?></time>
                <p class="newsContent"><?php the_title(); ?></p>
              </a>
            </li>
            <?php endwhile; endif; wp_reset_postdata();?>
          </ol>

        </section>
      </div>
    </div>
  </section>

</main>


<?php get_sidebar(); ?>

<?php get_footer();

■function.php

add_action('init', 'register_post_type_and_taxonomy');
function register_post_type_and_taxonomy() {
  register_post_type( //
    'news', // 
    array(
      'labels' => array(
        'name' => 'お知らせ', 
        'add_new_item' => 'お知らせを新規追加', 
        'edit_item' => 'お知らせの編集',
      ),
      'public' => true,
      'hierarchical' => true,
      'has_archive' => true, 
      'supports' => array( 
        'title',
        'editor',
        'custom-fields' 
      ),
      'menu_position' => 5, 
      'rewrite' => array('with_front' => false), 
    )
  );

  /* カテゴリタクソノミー */
  register_taxonomy(
    'news_cat', /* タクソノミーの名前 */
    'news', /* 使用するカスタム投稿タイプ名 */
    array(
      'hierarchical' => true,
      'update_count_callback' => '_update_post_term_count',
      'label' => 'カテゴリー',
      'singular_label' => 'カテゴリー',
      'public' => true,
      'show_ui' => true
    )
  );

ご指摘いただけますでしょうか。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

ざっと見た感じ register_post_type に taxonomies が設定されていませんね。

【関数リファレンス/register post type - WordPress Codex 日本語版】
https://wpdocs.osdn.jp/関数リファレンス/register_post_type

【カスタムタクソノミーを追加できるWordPressの関数「register_taxonomy」の使い方まとめ フラップイズム】
https://www.flapism.jp/wordpress/242/

あと、呼び出し側で new WP_Query を使用していますが、デフォルトのループで処理できる内容ではないのでしょうか。

もうひとつ、タームのリンクを文字列連結で組み立てていますが、関数があるのでそれを利用してみては。

【get_term_link() - タクソノミーのURLを取得する】
https://syncer.jp/Web/WordPress/Reference/Function/get_term_link/

【get_term_link – WordPress私的マニュアル】
https://elearn.jp/wpman/function/get_term_link.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/14 19:15

    ご回答ありがとうございます!
    taxonomies、教えていただいたページを参考に下記のように設定してみましたが
    やはり404のままでした…

    'taxonomies' => array('news_cat')

    また、他の部分についてもご指摘をいただきありがとうございました!
    参考に組み直してみようかと思います。

    キャンセル

  • 2018/06/14 19:23

    慣れないうちはプラグインを使うのがよいと思います。下記記事で紹介されているプラグインは、「ツール」というメニュー項目から出力用のコードを書き出す機能もあります。

    【Custom Post Type UIの使い方[WordPress]】
    http://kotori-blog.com/wordpress/custom_post_type_ui/

    キャンセル

  • 2018/06/14 19:29

    重ね重ねありがとうございます。
    Custom Post Type UI、良さそうなプラグインですね!
    しかし、今回は既にAdvanced Custom Fieldsで組んでいますのでこちら使うのは難しそうです…。
    次の機会に試してみたいと思います。

    キャンセル

  • 2018/06/14 21:25

    Advanced Custom Fields はカスタムフィールドを作るプラグインです。提示したのはカスタムポストタイプおよびカスタムタクソノミーを作成する物です。機能の重複はありませんよ。

    キャンセル

  • 2018/06/15 01:41

    初歩的な質問で申し訳ないですけど、現状「お知らせ」には作成したカスタムタクソノミーが表示され、選択した上で公開してるんですよね?

    であれば通常のテーマならカスタム投稿タイプのhas_archiveがtrueになっていると何も加工しなくても問題なく一覧表示されると思うんですけど・・・。

    キャンセル

  • 2018/06/15 11:29

    早とちりをしていたようで申し訳ないです。

    お知らせの全記事の一覧のページ(アーカイブ?)は表示されるのですが、タクソノミーで設定したカテゴリー毎の一覧ページが表示されないのです…。例えば/news/product など。

    wordpress初心者で至らぬ点が多々あり申し訳ございません…。

    キャンセル

  • 2018/06/15 13:37

    お使いのテーマでは「archive.php」が過去記事一覧ページ作成用のファイルなのですよね?でしたら一度「archive-news.php」を「xxarchive-news.php」などへリネームして動かないようにして、表示を試してみてはどうでしょう??(理由は前のコメントの通りです)

    キャンセル

  • 2018/06/15 16:07

    Kei1344様とmomosiri様からのアドバイスを参考に、1つずつカスタム投稿の設定をやり直していったところ表示がされるようになりました!
    原因が何かは結局最後まで分からなかったのですが…… 確認を怠ってはいけませんね。

    ご丁寧にアドバイスをくださり誠にありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    21269questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    7640questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。