サポート » バグ報告と提案 » query_postsタクソノミー引数でfieldをnameで指定した場合の動作不良

  • モデレーター jim912

    (@jim912)


    query_postsなどで利用可能な服すタクソノミー引数で、fieldの指定をnameにした場合、日本語環境で上手く動作しません。

    これは、termで指定した値が16進数の文字コードにエンコードされてしまうことが原因です。
    具体的には、

    1. WP_Tax_Query->get_sql
    2. WP_Tax_Query->clean_query
    3. WP_Tax_Query->transform_query
    4. sanitize_title_for_query
    5. sanitize_title
    6. sanitize_title_with_dashes
    7. utf8_uri_encode

    と呼び出されて変換されています。

    暫定的な対応方法として、sanitize_title にフックしている sanitize_title_with_dashes を remove して独自の関数をかけ直す方法が最有力と思われますが、該当部分の参照箇所が多岐に渡ること、セキュリティに関わる微妙な内容であることから、「これなら大丈夫」という上手い解決策がまだ見いだせずにいます。

    WordPress tracの方はざっと検索してみましたが、これに関する報告は見つけられませんでした。
    引き続き私の方でも調査しますが、可能であれば、tracへの報告と暫定的な対応策など検討いただければと思います。

1件の返信を表示中 - 1 - 1件目 (全1件中)
  • モデレーター jim912

    (@jim912)

    複数タクソノミー引数ですね。すみません。

    原因としては、wp_insert_termsでのサニタイズとWP_Tax_Queryで行われているサニタイズの方法が異なることが要因となっています。

    wp-includes/taxonomy.phpのtransform_queryメソッドを下記のように改めることで、wp_insert_termsで行われているものと同じサニタイズおよびエスケープが行われ、正しく動作するようになると思われます。(_escapeメソッドを直接コールして良いかどうかは少々疑問ではありますが。)

    最新版

    switch ( $query['field'] ) {
    			case 'slug':
    			case 'name':
    				$terms = "'" . implode( "','", array_map( 'sanitize_title_for_query', $query['terms'] ) ) . "'";
    				$terms = $wpdb->get_col( "
    					SELECT $wpdb->term_taxonomy.$resulting_field
    					FROM $wpdb->term_taxonomy
    					INNER JOIN $wpdb->terms USING (term_id)
    					WHERE taxonomy = '{$query['taxonomy']}'
    					AND $wpdb->terms.{$query['field']} IN ($terms)
    				" );
    				break;

    修正版

    $terms = $query['terms'];
    		switch ( $query['field'] ) {
    			case 'slug':
    				$terms = array_map( 'sanitize_title', $terms );
    			case 'name':
    				$terms = "'" . implode( "','", array_map( array( $wpdb, '_escape' ), $terms ) ) . "'";
    				$terms = $wpdb->get_col( "
    					SELECT $wpdb->term_taxonomy.$resulting_field
    					FROM $wpdb->term_taxonomy
    					INNER JOIN $wpdb->terms USING (term_id)
    					WHERE taxonomy = '{$query['taxonomy']}'
    					AND $wpdb->terms.{$query['field']} IN ($terms)
    				" );
    				break;

1件の返信を表示中 - 1 - 1件目 (全1件中)
  • トピック「query_postsタクソノミー引数でfieldをnameで指定した場合の動作不良」には新たに返信することはできません。