サポート » バグ報告と提案 » pre_get_postsで複数の並び順指定でエラー

  • Anon_

    (@kuroro111)


    add_action('pre_get_posts','cs_pre_get_posts');
    
    	function cs_pre_get_posts($query)
    	{
    		if (is_admin() || !$query->is_main_query()) {
    			return;
    		}
    
    		if (!lightning_is_woo_page() && !is_singular() && !is_search() && !is_404()) {
    			$meta_query_args = array(
    				'relation' => 'OR',
    				'exists' => array(
    					'key' => 'プラン',
    					'compare' => 'EXISTS',
    				),
    				'notexists' => array(
    					'key' => 'プラン',
    					'compare' => 'NOT EXISTS',
    				),
    			);
    			$query->set('meta_query', $meta_query_args);
    			$query->set( 'orderby', array('exists' => 'desc', 'notexists' => 'desc', 'date' => 'desc') );
    		}
    	}
    
    

    上記のコードでカスタムフィールドのプランが保存されている記事を優先的に表示させ、保存されていないものは後ろに回すという表示を行おうとしていますがうまくいきません。

    そこで$queryの中身を確認して、SQLクエリを確認し直接phpmyadminから実行すると、下記のエラーが発生しています。

    クエリーのエラー (1055): Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'local.wp_postmeta.meta_value' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

    sql_mode=only_full_group_byが有効になっていると起こるエラーのようですが、基本的にはオフにしないほうがよいという記事が見つかります。

    これはWordPressの仕様として問題ないのでしょうか?

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • こんにちは

    WordPress は Anon_ さんが独自に Order By のリストに追加された exist などのフィールドを知らないので、それらが Group By 句に含まれないのは当然と思いますが、どうでしょうか。

    sql_mode=only_full_group_byが有効になっていると起こるエラーのようですが、基本的にはオフにしないほうがよいという記事が見つかります。これはWordPressの仕様として問題ないのでしょうか?

    これは、「WordPress では only_full_group_by がオフになってるけれどオフにしないほうがいいですよ」と私には読めますが、ちょっと意味が分かりませんでした。

    トピック投稿者 Anon_

    (@kuroro111)

    独自に追加というより、そういう仕様で動作するはずなのです。
    下記のような記事に書かれております。

    どの記事でしょうか・・・

    トピック投稿者 Anon_

    (@kuroro111)

    失礼いたしました。

    https://hsmt-web.com/blog/wp-multisort/
    https://blog.cror.net/multi-sort.html

    これらの記事です。

    正直などころ、公式でない記事に記述されている内容で、どの環境でも動作するはずなのかは私には分かりません。

    記事の環境では動作するが、私の環境では動作しないようなことはままあります。

    only_full_group_by は WordPress とは互換性のないモードであることは認識されていて、データベースセッション上はセットされないように処理されているようです。

    参考)https://core.trac.wordpress.org/ticket/26847

    しかし、セッションごとにSQLモードを変更できないように構成されているサーバーでは only_full_group_by で動作しそうですので、環境に依存して動作しない部分はその環境に合わせて処理させるか、環境を変えるしかないのかな、と思います。
    (私自身はこのチケットに含まれる SET SESSION sql_mode が厳密にはどのような動作なのかは知りません。)

    もし、上記チケットにある処理、あるいは環境によって only_full_group_by が有効な場合は動作しないことが問題だと考えられるのであれば、こちらからチケットを発行されることをお勧めします。

    トピック投稿者 Anon_

    (@kuroro111)

    公式のドキュメントにも書かれております。

    https://onl.sc/yLtLJHK

    チケットを発行したいと思います。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「pre_get_postsで複数の並び順指定でエラー」には新たに返信することはできません。