サポート » 使い方全般 » カスタムフィールドで並び替えをした特定タームの年月アーカイブを作成

  • 解決済 usaginomori

    (@usaginomori)


    お世話になります。
    テーマ「Twenty Eleven」を子テーマで編集しています。

    カスタムフィールドで並べ替えをした特定のタームに属する記事のアーカイブを作成しようとしています。
    以前のこの掲示板での投稿
    https://ja.forums.wordpress.org/topic/8389

    このサイト様の「WordPress】カスタムフィールドの日付でカスタム投稿の年月別アーカイブ」
    http://p-nt.com/technicblog/wordpress-4/

    などを参考にさせていただき、カスタムポスト単位での年別、月別、日別のアーカイブを作成することはうまくいきました。
    しかし、特定タームに属する記事だけを抜き出すことができません。
    $where,$joinあたりを編集すればよいかと思ったのですが、あまりに知識がないため、検索で見つけたコードを入れてもただページが真っ白になるばかりでうまくいきません。

    具体的には、「sche」というカスタムポストがあり、タクソノミー「schedule」を設定して、「past」というタームがあります。
    「past」に属する記事をカスタムフィールド「opendate」の日付と、それが同じものがある場合は、投稿日付で並び替えていますが、その順序で年月アーカイブを作成したいのです。
    現状は、上記サイトのコードをほとんどそのまま使用させていただいて、最後に記事の順番だけ変更するために
    $query->set( 'orderby', array('meta_value' => 'DESC', 'date' => 'DESC'));
    を付け加えて「sche」全体のアーカイブは作成できています。

    子テーマのfunstions.phpに付け加えたコードは
    http://pastebin.com/hUe44dhR
    にアップいたしました。

    どこをどう変更したらよいのかお教えいただければ幸いです。
    どうぞよろしくお願いいたします。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック投稿者 usaginomori

    (@usaginomori)

    その後わずかな進展はあったのですが、解決には至っておりません。
    phpMyAdminで試したところ、次のようなSQLで「past」タームのみが「opendate」の日付の降順で取得できるのを確認できました。
    SQL

    SELECT *
    FROM wp_posts
    INNER JOIN wp_term_relationships AS tr ON ( wp_posts.ID = tr.object_id )
    INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
    WHERE tr.term_taxonomy_id = '18'
    AND wp_postmeta.meta_key = 'opendate'
    ORDER BY meta_value DESC , post_date DESC

    そこで、functions.phpをいろいろ書き換えてみたところ、現状では、「past」のまったくない年は、サイドバーに表示されなくなりました。しかし、「past」のある年には、ほかのタームの投稿も一緒に表示されてしまいます。
    また、サイドバーの「年」に表示されていない年もurlでアクセスしてみると、404にはならず、ページが作成されているようです。
    現在の記述は、http://pastebin.com/hUe44dhR の22行目から26行目を

    $field  = 'm.meta_value';
        $select = "SELECT SUBSTRING($field,1,4) AS 'year', COUNT(p.ID) AS posts";
        $where  = "WHERE tr.term_taxonomy_id = '18' AND p.post_type = 'sche' AND p.post_status = 'publish'";
        $where .= $wpdb->prepare( ' AND m.meta_key = %s', $date_field );
        $join   = " INNER JOIN $wpdb->term_relationships AS tr ON (p.ID = tr.object_id)
        INNER JOIN $wpdb->term_taxonomy AS tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id )
        INNER JOIN $wpdb->postmeta AS m ON (p.ID = m.post_ID)";

    に、書き換えています。
    知識が足りないため、見当違いのことをしているかも知れません。
    引き続き、どうぞアドバイスをよろしくお願いいたします

    トピック投稿者 usaginomori

    (@usaginomori)

    何とか自己解決いたしました。

    <?php $wpdb->show_errors(); ?>
    <?php $wpdb->print_error(); ?>

    を 関数リファレンス/wpdb Class
    にあるのをみつけて確かめたところ、SQLではエラーがないようだったので、よく見直したところ、pre_get_posts でタームで絞り込んでいないことが原因でした。 ’tax_query’ を追加してようやく希望の表示ができるようになりました。ちょっとカスタマイズしたいと思うと難しいですが、勉強になりました。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「カスタムフィールドで並び替えをした特定タームの年月アーカイブを作成」には新たに返信することはできません。