サポート » 使い方全般 » カスタムフィールドから作成したアーカイブリストの昇順

  • 解決済 yd2

    (@yd2)


    以前、下記の質問をさせていただいたものです。
    http://ja.forums.wordpress.org/topic/8389?replies=7

    こちらの方法で年別アーカイブの表示には成功したのですが、
    記事がカスタムフィールドの日付順になっていないことに気がつきました。

    どこかで記述を間違えているか、
    下記のコードの中を変更すればいいのかと思い、
    いろいろと試してみたのですが解決できません。
    (実際は’date’に日付のキーを入れています。)

    add_action( 'init', 'my_init' );
    function my_init() {
    	global $wp;
    	$wp->add_query_var( 'meta_key' );
    }
    
    add_action( 'pre_get_posts', 'my_pre_get_posts' );
    function my_pre_get_posts( $query ) {
    	if ( $query->is_year ) {
    		$meta_query = array(
    			array(
    				'key'     => $query->get( 'meta_key' ),
    				'value'   => $query->get( 'year'     ),
    				'compare' => 'LIKE'
    			),
    		);
    
    		$query->set( 'meta_query' , $meta_query );
    		$query->set( 'year'       , ''          );
    		$query->set( 'date'       , ''          );
    		$query->set( 'meta_key'   , ''          );
    	}
    }

    方法をご存知の方がいらっしゃれば、
    ご教授いただければと思います。
    よろしくお願いします。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • $query = "$select FROM $wpdb->posts AS p $join $where GROUP BY SUBSTRING($field,1,4) ORDER BY $field DESC $limit";
    の部分で日付で並べ替えるように、例えば
    ORDER BY m.meta_value, p.post_date DESC";
    みたいな感じにする必要があるのでは?

    トピック投稿者 yd2

    (@yd2)

    kurosquareさん、ありがとうございます。

    $query = "$select FROM $wpdb->posts AS p $join $where GROUP BY SUBSTRING($field,1,4) ORDER BY m.meta_value, p.post_date DESC";

    このように変更したところ、年別のリストの順番は変更されますが
    記事の順番は変わりませんでした。

    トピック投稿者 yd2

    (@yd2)

    kurosquareさん、すみません。勘違いをしていました。
    上と同様にする必要があるとのことだったのですね。

    ‘date’でソートしたい場合を調べていたのですが、
    このような書き方は全く違うのでしょうか。

    add_action( 'pre_get_posts', 'my_pre_get_posts' );
    function my_pre_get_posts( $query ) {
    	if ( $query->is_year ) {
    		$meta_query = array(
    			array(
    				'key'     => $query->get( 'meta_key' ),
    				'value'   => $query->get( 'year'     ),
    				'compare' => 'LIKE'
    			),
    			'meta_key'=> 'date',
        	'orderby'=> 'meta_value_num',
        	'order'=> 'ASC'
    		);
    
    		$query->set( 'meta_query' , $meta_query );
    		$query->set( 'year'       , ''          );
    		$query->set( 'date'       , ''          );
    		$query->set( 'meta_key'   , ''          );
    	}
    }

    #未検証

    add_action( 'pre_get_posts', 'my_pre_get_posts' );
    function my_pre_get_posts( $query ) {
    	if ( $query->is_year ) {
    		$meta_query = array(
    			array(
    				'key'     => $query->get( 'meta_key' ),
    				'value'   => $query->get( 'year'     ),
    				'compare' => 'LIKE'
    			),
    		);
    
    		$query->set( 'meta_query' , $meta_query );
    		$query->set( 'year'       , ''          );
    		$query->set( 'date'       , ''          );
    		$query->set( 'meta_key'   , 'date'      );
    		$query->set( 'orderby'    , 'meta_value_num' );
    		$query->set( 'order'      , 'ASC'       );
    	}
    }
    トピック投稿者 yd2

    (@yd2)

    kzさん、前回に引き続きありがとうございます。
    書いていただいた内容を元に、このようにしたところ
    思い通りの表示を実現することができました。

    $query->set( 'meta_query' , $meta_query );
    		$query->set( 'year'       , ''          );
    		$query->set( 'date'       , ''          );
    		$query->set( 'meta_key'   , 'date'      );
    		$query->set( 'orderby'    , 'meta_value' );
    		$query->set( 'order'      , 'DECS'       );

    日付のカスタムフィールドが、数値ではなく文字列になっている(?)のが、
    ややこしくなってしまった原因なのでしょうか。
    ともあれ、やっと解決できました。

    本当にありがとうございました。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「カスタムフィールドから作成したアーカイブリストの昇順」には新たに返信することはできません。