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

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

ただいまの
回答率

89.07%

wordpressのカスタム投稿タイプ(+カスタムタクソノミーも)をプラグインに頼らず表示したい

受付中

回答 1

投稿 編集

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

nukoro

score 4

wordpressのカスタム投稿タイプ(+カスタムタクソノミーも)をプラグインに頼らず利用したいと思い書き込みいたしました。※テーマは _s(underscores)をカスタマイズして利用しています

試したこと ※追記あり

すでに解決済みのこちらのページを参考にし、カスタム投稿一覧・記事ページで本文の表示はできました。しかしそのままでは日付が表示できなかったため、修正して日付は表示できるようになりました。
しかしどうしてもカスタムタクソノミーの情報(カテゴリーやタグ)の情報を出すことができず四苦八苦しております。

※その後いろいろ試行錯誤し、ターム(カテゴリーやタグ)の情報を出すことができるようになりました
しかし今度はタームをクリックした際に表示される一覧ページで、本文とターム情報が表示できず悩んでおります。
どうかお知恵をお貸しください・・・

//function.phpに書いたコード ※抜粋

add_action('init', 'blog_post_type');
function blog_post_type() {
    $params = array(
      'labels' => array(
        'name' => 'ブログ',
        'singular_name' => 'ブログ',
        'add_new' => '新規追加',
        'add_new_item' => 'ブログを新規追加',
        'edit_item' => 'ブログを編集する',
        'new_item' => '新規ブログ',
        'all_items' => 'ブログ一覧',
        'view_item' => 'ブログの説明を見る',
      ),
      'menu_position' => 5,
      'public' => true,
      'has_archive' => true,
      'exclude_from_search' => true,
      'rewrite' => array(
      'slug' => 'blog',
      'with_front' => false
    ),
      'supports' => array(
            'title', //(タイトル)
            'editor', //(内容の編集)
            'author', //(作成者)
            'thumbnail', //(アイキャッチ画像)
      ),
      'taxonomies' => array('blog_category','blog_tag')
    );
    register_post_type('blog', $params);
}
// カスタム投稿タイプ(blog)用のカテゴリ&タグを作成する
add_action('init', 'create_blog_taxonomies');
function create_blog_taxonomies() {
  // カテゴリを作成
  $labels = array(
      'name'                => 'カテゴリ',
      'singular_name'       => 'カテゴリ', 
      'search_items'        => 'カテゴリを検索',
      'all_items'           => '全てのカテゴリ',
      'parent_item'         => '親カテゴリ',
      'parent_item_colon'   => '親カテゴリ:',
      'edit_item'           => 'カテゴリを編集',
      'update_item'         => 'カテゴリを更新',
      'add_new_item'        => '新規カテゴリを追加',
      'new_item_name'       => '新規カテゴリ',
      'menu_name'           => 'カテゴリ'
  );
  $args = array(
    'hierarchical'        => true,
    'labels'              => $labels,
    'rewrite'             => array( 'slug' => 'blog_category' )
  );
  register_taxonomy( 'blog_category', 'blog', $args );

  // タグを作成
  $labels = array(
    'name'                => 'タグ',
    'singular_name'       => 'タグ',
    'search_items'        => 'タグを検索',
    'all_items'           => '全てのタグ',
    'parent_item'         => null,
    'parent_item_colon'   => null,
    'edit_item'           => 'タグを編集',
    'update_item'         => 'タグを更新',
    'add_new_item'        => '新規タグを追加',
    'new_item_name'       => '新規タグ',
    'separate_items_with_commas'   => 'タグが複数ある場合はコンマで区切ってください',
    'add_or_remove_items'          => 'タグを追加or削除する',
    'choose_from_most_used'        => 'よく使われているタグから選択',
    'not_found'                    => 'アイテムは見つかりませんでした',
    'menu_name'                    => 'タグ'
  );
  $args = array(
    'hierarchical'            => false,
    'labels'                  => $labels,
    'update_count_callback'   => '_update_post_term_count',
    'rewrite'                 => array( 'slug' => 'blog_tag' )
  );

  register_taxonomy( 'blog_tag', 'blog', $args );
}
//一覧ページなどに書いたコード
<?php the_terms($post->ID,'blog'); ?>
////archive.php ※抜粋 ※追記あり
<main>
<div id="box_main" class="col-sm-9 site-main" role="main">

<div id="entry_box">
        <?php
         <?php if ( have_posts() || is_tax() ) : ?><!-- ※ここを修正しました -->

            <header class="page-header">
                <?php
                    the_archive_title( '<h2 class="page-title">', '</h2>' );
                    the_archive_description( '<div class="taxonomy-description">', '</div>' );
                ?>
            </header><!-- .page-header -->

            <?php
            /* Start the Loop */
            while ( have_posts() ) : the_post();

                /*
                 * Include the Post-Format-specific template for the content.
                 */
                get_template_part( 'template-parts/content', get_post_format() );

            endwhile;

            the_posts_navigation();

        else :

            get_template_part( 'template-parts/content', 'none' );

        endif; ?>
</div>

</div>
</main>
//content.php ※追記あり
<?php ?>

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    <div class="entry-header">
        <?php
        if ( is_single() ) :
            the_title( '<h2 class="entry-title">', '</h2>' );
        else :
            the_title( '<h2 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h2>' );
        endif;

//カスタム投稿を追加
wp_list_categories('title_li=&taxonomy=blog_category,blog_tag');

        if ( 'post' === get_post_type() || 'blog' === get_post_type() ) : ?><!-- ※ここを修正しました -->
        <div class="entry-meta">
            <?php underscores_posted_on(); ?>
        </div><!-- .entry-meta -->
        <?php endif; ?>
    </div><!-- .entry-header -->


    <div class="entry-content clearfix">
        <?php
            the_content( sprintf(
                /* translators: %s: Name of current post. */
                wp_kses( __( '続きを読む', 'underscores' ), array( 'span' => array( 'class' => array() ) ) ),
                the_title( '<span class="screen-reader-text">"', '"</span>', false )
            ) );

            wp_link_pages( array(
                'before' => '<div class="page-links">' . esc_html__( 'Pages:', 'underscores' ),
                'after'  => '</div>',
            ) );
        ?>
    </div><!-- .entry-content -->

    <div class="entry-footer">
        <?php underscores_entry_footer(); ?>
    </div><!-- .entry-footer -->
</article><!-- #post-## -->

ファイルの構造

archive.php は content.php を読込み、content.php は template-tags.php を読込む構造になっているようです。
template-tags.php で共通表示される部分(本文やその他情報)を管理しているようです。

※色々試した結果「if ( 'blog' === get_post_type() ~」を追加して、タームの情報が表示できるようになりました

//template-tags.php ※追記あり
<?php

if ( ! function_exists( 'underscores_posted_on' ) ) :
/**
 * Prints HTML with meta information for the current post-date/time and author.
 */
function underscores_posted_on() {
    $time_string = '<time class="entry-date published updated" datetime="%1$s">%2$s</time>';
    if ( get_the_time( 'U' ) !== get_the_modified_time( 'U' ) ) {
        $time_string = '<time class="entry-date published" datetime="%1$s">%2$s</time><time class="updated" datetime="%3$s">%4$s</time>';
    }

    $time_string = sprintf( $time_string,
        esc_attr( get_the_date( 'c' ) ),
        esc_html( get_the_date() ),
        esc_attr( get_the_modified_date( 'c' ) ),
        esc_html( get_the_modified_date() )
    );

    $posted_on = sprintf(
        esc_html_x( '投稿日:%s', 'post date', 'underscores' ),
        '<a href="' . esc_url( get_permalink() ) . '" rel="bookmark">' . $time_string . '</a>'
    );

    $byline = sprintf(
        esc_html_x( 'by %s', 'post author', 'underscores' ),
        '<span class="author vcard"><a class="url fn n" href="' . esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ) . '">' . esc_html( get_the_author() ) . '</a></span>'
    );

    echo '<span class="posted-on">' . $posted_on . '</span>'; // WPCS: XSS OK.
}
endif;

if ( ! function_exists( 'underscores_entry_footer' ) ) :
/**
 * Prints HTML with meta information for the categories, tags and comments.
 */

function underscores_entry_footer() {
    // Hide category and tag text for pages.
    if ( 'post'||'blog' === get_post_type() ) {
        /* translators: used between list items, there is a space after the comma */
        $categories_list = get_the_category_list( esc_html__( ', ', 'underscores' ) );
        if ( $categories_list && underscores_categorized_blog() ) {
            printf( '<p class="cat-links">' . esc_html__( 'カテゴリー:%1$s', 'underscores' ) . '</p>', $categories_list ); // WPCS: XSS OK.
        }

        /* translators: used between list items, there is a space after the comma */
        $tags_list = get_the_tag_list( '', esc_html__( ', ', 'underscores' ) );
        if ( $tags_list ) {
            printf( '<p class="tags-links">' . esc_html__( 'タグ:%1$s', 'underscores' ) . '</p>', $tags_list ); // WPCS: XSS OK.
        }
    }
//カスタム投稿タイプのアーカイブ ※追加しました
if ( 'blog' === get_post_type() ) {
    the_taxonomies( $args );
}
    if ( ! is_single() && ! post_password_required() && ( comments_open() || get_comments_number() ) ) {
        echo '<span class="comments-link">';
        /* translators: %s: post title */
        comments_popup_link( sprintf( wp_kses( __( 'Leave a Comment<span class="screen-reader-text"> on %s</span>', 'underscores' ), array( 'span' => array( 'class' => array() ) ) ), get_the_title() ) );
        echo '</span>';
    }

}
endif;

/**
 * Returns true if a blog has more than 1 category.
 */
function underscores_categorized_blog() {
    if ( false === ( $all_the_cool_cats = get_transient( 'underscores_categories' ) ) ) {
        // Create an array of all the categories that are attached to posts.
        $all_the_cool_cats = get_categories( array(
            'fields'     => 'ids',
            'hide_empty' => 1,
            // We only need to know if there is more than one category.
            'number'     => 2,
        ) );

        // Count the number of categories that are attached to the posts.
        $all_the_cool_cats = count( $all_the_cool_cats );

        set_transient( 'underscores_categories', $all_the_cool_cats );
    }

    if ( $all_the_cool_cats > 1 ) {
        // This blog has more than 1 category so underscores_categorized_blog should return true.
        return true;
    } else {
        // This blog has only 1 category so underscores_categorized_blog should return false.
        return false;
    }
}

/**
 * Flush out the transients used in underscores_categorized_blog.
 */
function underscores_category_transient_flusher() {
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }
    // Like, beat it. Dig?
    delete_transient( 'underscores_categories' );
}
add_action( 'edit_category', 'underscores_category_transient_flusher' );
add_action( 'save_post',     'underscores_category_transient_flusher' );
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

+2

どの部分で問題が起きているかが読み取れませんでしたが、とりあえず下記部分は間違っていると思います。

// if ( 'post'||'blog' === get_post_type() ) // 'post'がtrueと判定されて必ず通過する
   if ( 'post' === get_post_type() || 'blog' === get_post_type() )

【PHP: 論理型 (boolean) - Manual】
https://www.php.net/manual/ja/language.types.boolean.php#language.types.boolean.casting

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/18 10:18

    その部分は分岐条件の書き方を調べて自分で追加した部分なのですが、
    書き方が間違っていたのですね・・・正しい書き方を教えて頂き助かります!
    該当部分を直してみて表示内容に変化はありませんでしたが、ご指摘ありがとうございました

    キャンセル

  • 2020/01/18 12:10

    どこでタームを表示しているかが提示のコードからは読み取れませんでした。そこの問題では?

    キャンセル

  • 2020/01/31 19:27

    お返事遅くなりましてすみません>< 時間がかかってしまいましたが、いろいろ調べて試行錯誤し、タームの情報は表示できるようになりました! ただ今度はタームをクリックした際に表示される一覧ページで、本文とターム情報が表示できず悩んでおります・・・

    キャンセル

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

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

関連した質問

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

  • トップ
  • PHPに関する質問
  • wordpressのカスタム投稿タイプ(+カスタムタクソノミーも)をプラグインに頼らず表示したい