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

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

ただいまの
回答率

89.99%

カスタム投稿タイプで「いま表示中のページのカテゴリID」を取得するためには?

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,434
退会済みユーザー

退会済みユーザー

■目的

WP-PostViewsというプラグインを使って、「現在表示中の記事のカテゴリ内の、人気記事」を表示したいです。(ただしカスタム投稿タイプになります。)

■現状

下記のように書いているのですが、h3タグの部分しか表示されません。

single-example.php

<!-- 関連記事ランキング表示 -->
<div class="wp-postviews">
    <h3>関連記事</h3>
    <ol>
        <?php
        //現在のカテゴリIDを配列で取得
$now_id = get_queried_object_id($post->ID,'fields=ids');?>
    </ol>
<?php
global $post;
$args = array(
    'post_type' => $now_id,
    'posts_per_page' => 5,
    'terms_in' => $now_id,
    'meta_key' => 'views',
    'orderby' => 'meta_value_num'
);
$posts = get_posts( $args );
foreach( $posts as $post ) {
    setup_postdata($post);
    ?>
    <li><?php the_post_thumbnail( array(100, 100), array('alt'=>get_the_title()) ); ?><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php
    }
wp_reset_postdata();
?>
</div>

■質問

①カテゴリIDを取得する部分↓が間違っているのかなって思います。
get_queried_object_id($post->ID,'fields=ids');
現状はこう書いておりますけれど、違うようです。
どうすれば、カスタム投稿タイプで「いま表示中のページのカテゴリID」を取得できるのでしょうか?

②それとも別のところでしょうか?

以上です。①か②か、お分かりになる方、よろしくお願いいたします。m(__)m

■ちなみに

これはあっていると思いますが念のため。
functions.phpではこのように書いてカスタム投稿タイプにカテゴリを設定しています。

// カスタム投稿タイプの追加
add_action( 'init', 'custum_post_type' );
function custum_post_type() {
    //test1の投稿タイプ追加
    register_post_type( 'test1',
        array('labels' =>
                array(
                'name' => __( 'test1' ),
                'singular_name' => __( 'test1' )
                ),
            //投稿タイプの設定
            'public' => true,
            'menu_position' => 5,
            'hierarchicla' => false,
            'has_archive' => true,
            //パーマリンクを /test1/投稿名/ にします。
            'rewrite' => array(
            'slug' => 'wp-test1'
            ),
            //投稿編集ページの設定
            'supports' => array('title','editor','thumbnail',   //タイトル,編集,アイキャッチ
            'custom-fields','excerpt','author','trackbacks',    //カスタムフィールド,抜粋文&作成者,トラックバック
            'comments','revisions','page-attributes')           //コメント,リビジョン,作成者,表示順のボックス
        )
    );
    //test1のカテゴリー追加
register_taxonomy(
  'test1-category',  /* タクソノミーのslug */
  'test1',           /* 属する投稿タイプ */
  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

+1

試行錯誤された結果だとは思うのですが、タグの順序がおかしかったり、
関数名が誤っていたり、少し散らかってしまっているようです。

まず、functions.phpの内容をもとに状況を整理します。

  • test1というカスタム投稿タイプがある
  • test1に所属する、test1-categoryというカスタムタクソノミーがある
  • 今表示している記事と同じタームがついた記事を、カスタムフィールドViewsの順番で5件表示したい

単語の意味については、以下のサイトさんなどを参考にされてください。
KANTENA.com | 投稿タイプ、タクソノミー、タームについて

通常のカテゴリーとカスタム投稿タイプと紐づく
カスタムタクソノミー(として宣言したカテゴリー)では記述も大きく変わります。

質問文に記載頂いていた内容だと、カスタムタクソノミーに対応できていなかったので、
カスタムタクソノミーの内容を取得~記事を検索する流れを紹介します。

 1.表示中の記事が所属しているタームを取得する

シングルページでget_queried_object_idを取得すると、
タームIDではなく、記事IDが返ってきてしまいます。

タームIDは、所属する全てのタームを取得できるthe_termsを使って取得すると良いです。

<?php
//配列$term_idsに、表示中の記事が所属している、カスタムタクソノミー「test1-category」のタームIDを格納します
$terms = the_terms(get_the_ID(),'test1-category');
$term_ids = array();
foreach($terms as $term){
    $term_ids[] = $term->term_id;
}
?>

 2.同じタームに所属している記事を検索する

タームIDを指定してget_postsで取得するには以下の様にします。

<?php
//タームIDが含まれている記事を取得して$postsに格納します
$args = array(
    'post_type' => 'test1', //ここにはカスタム投稿タイプ名を入れます
    'posts_per_page' => 5,
    'meta_key' => 'views',
    'orderby' => 'meta_value_num',
    'tax_query' => array( //タームを検索する場合の表記はここから……
        array(
            'taxonomy' => 'test1-category', //ここにはカスタムタクソノミー名を入れます
            'field'    => 'term_id', //今回はタームIDで検索するのでterm_idを入れます
            'terms'    => $term_ids, //IDが格納された配列を指定します
            'operator' => 'IN' //格納されているいずれかに一致した記事を見つける場合の表記です(全てに一致とする場合はANDにします)
        ),
    ), //……ここまで
);
$posts = get_posts($args);
?>

 サンプル

viewsなどのカスタムフィールドを準備するのが手間だったので
動作の確認は行っていませんが、この様な感じで上手く動くのではと思います。

<?php
$terms = the_terms(get_the_ID(),'test1-category');
$term_ids = array();
foreach($terms as $term){
    $term_ids[] = $term->term_id;
}
$args = array(
    'post_type' => 'test1',
    'posts_per_page' => 5,
    'meta_key' => 'views',
    'orderby' => 'meta_value_num',
    'tax_query' => array(
        array(
            'taxonomy' => 'test1-category',
            'field'    => 'term_id',
            'terms'    => $term_ids,
            'operator' => 'IN'
        ),
    ),
);
$posts = get_posts($args); ?>

<div class="wp-postviews">
    <h3>関連記事</h3>
    <ol>
    <?php foreach($posts as $post): setup_postdata($post); ?>
        <li>...表示の内容...</li>
    <?php wp_reset_postdata(); endforeach; ?>
    </ol>
</div>

もし、質問の解釈が間違えている部分などあればご指摘ください。

カスタム投稿タイプやカスタムタクソノミーにタームなど、
名前も似ていて紛らわしいですが、使いこなすとすっごく便利なものです。
難しいのは初めだけなので、頑張ってみてください!

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/14 23:35

    ちなみに上の方のこの部分は
    <?php
    $terms = the_terms(get_the_ID(),'test1-category');

    こうとか
    <?php
    $terms = get_terms(get_the_ID(),'test1-category');
    こうでは
    <?php
    $terms = get_the_terms(get_the_ID(),'test1-category');
    ないですよね?

    まぁ、前者は上述したエラーで、後者はh3しか表示されませんでしたから違うのでしょうけれど。笑

    キャンセル

  • 2016/10/14 23:41

    いえ、失礼いたしました。やっぱり the_terms なのですね。
    いやぁぜんぜんわからん。。笑
    「もしかしてここじゃない?」など軽くヒントを頂戴できませんでしょうか?

    キャンセル

  • 2018/01/24 14:12

    $terms = get_terms(get_the_ID(),'test1-category');
    が正解だと思います。

    それでもエラーが出るとのことですので、
    'meta_key' => 'views',
    'orderby' => 'meta_value_num',
    を削除して、よりシンプルな状態で表示されるかを確認してみてください。

    キャンセル

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

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