サポート » 使い方全般 » WP_Queryで本文欄に入力値があるものを優先表示したい

  • 解決済 san3san

    (@san3san)


    やりたいことは、WP_Queryでタイトルの一覧表示をする際に、
    ベースとしては日付順で、本文欄に入力のあるものを
    先頭に優先表示させるというものです。

    カスタムフィールドの入力値(null含む)で並び替える方法はよく目にしますが
    本文post_contentの値で並び替える方法がわかりません。

    ループ内では

    
    <?php
    	if(empty($post->post_content)){ ?>
    		<li><?php the_title(); ?></li>
    		<?php }
    	else{ ?>
    		<a href="<?php the_permalink(); ?>"><li><?php the_title(); ?></li></a>
    		<?php }
    ?>
    

    とし、本文がある場合はタイトルにリンク、
    本文がない場合はリンク無しの処理をして、
    リンクのあるものを上に表示させるという目的です。

    無理ならば、本文があるものだけを先に抽出し、
    ループをわけて後から本文がないものだけを抽出でも構いません。

    下記ページの質問が参考になりそうではありますが
    具体的な解決に至りませんでした。
    http://q.hatena.ne.jp/1477991932
    本文欄に文字列が含まれるか検索パラメータで絞り込む方法です。
    これをアレンジして文字列の有無で判断できないかと思いますが
    方法がわかりません。

    よろしくお願いします。

    • このトピックはsan3sanが4年、 7ヶ月前に変更しました。
    • このトピックはsan3sanが4年、 7ヶ月前に変更しました。
    • このトピックはsan3sanが4年、 7ヶ月前に変更しました。
3件の返信を表示中 - 1 - 3件目 (全3件中)
  • こんにちは

    ORDER BY 句に、条件を指定することで、優先してソートすることができます。

    例:

    $the_query = new WP_Query( array(
    	'custom_orderby' => true,	// <-追加
    ) );

    functions.php に、

    function my_posts_orderby( $orderby, $query ) {
    	global $wpdb;
    	if ( $query->get( 'custom_orderby' ) ) {
    		$orderby = "trim({$wpdb->posts}.post_content) = '' DESC, {$wpdb->posts}.post_date DESC";
    	}
    	return $orderby;
    }
    add_filter( 'posts_orderby', 'my_posts_orderby', 10, 2 );

    無理ならば、本文があるものだけを先に抽出し、
    ループをわけて後から本文がないものだけを抽出でも構いません。

    こちらは、下記ページが参考になると思います。
    https://wordpress.stackexchange.com/questions/251384/exclude-posts-with-empty-post-content-in-wp-query

    トピック投稿者 san3san

    (@san3san)

    @ishitaka さん

    どうもありがとうございます。

    お陰さまでうまくいきました。
    本文があるものを優先にしたいので

    
    $orderby = "trim({$wpdb->posts}.post_content) = '' ASC, {$wpdb->posts}.post_date DESC";
    

    の箇所をDECSではなくASCにしました。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「WP_Queryで本文欄に入力値があるものを優先表示したい」には新たに返信することはできません。