私は自分のクエリの順序付けを実装しようとしています、これが私が思いついたものです...
$query = new WP_Query('post_type=contentboxes&include=' . $contentboxes . '&order=ASC&orderby=include' );
私のカスタムループ、$ contentboxesは、orderby include引数を指定した場合の4,45,23,46のように見えます。
カスタムオーダーを実装するには、* pre_get_posts *および* posts_orderby *フィルタを使用します。
function pre_get_posts( $query )
{
if ( 'include' == $query->query_vars['orderby'] ) :
global $order_by_include;
$order_by_include = TRUE;
endif;
}
* $ order_by_include *は私のカスタム注文が使用されたときに作成される空の変数です。
function posts_orderby( $orderby )
{
if ( !isset( $order_by_include ) )
return $orderby;
global $wpdb, $contentbox_order;
unset( $order_by_include );
return "FIND_IN_SET(" . $wpdb->posts . ".ID, '" . $wp_query->query_vars['include'] . "') " . $wp_query->query_vars['order'];
}
Posts_orderbyフィルタでは、変数が設定されていれば、現在の注文を自分のカスタム注文に上書きします。その後、グローバルスコープをきれいに保ち、他のループを変更しないように変数を設定解除します。
これが私の質問です。この機能を実装するためにグローバル変数を使うのは好きではありません。少し汚いと思いますが、仕事はします。
私は私のカスタムが動作しますposts_orderby内の私のカスタムクエリからクエリ変数を取得しようとしました。
もっときれいな方法はありますか?
フィルタをチェーン します。
if ( 'include' == $query->query_vars['orderby'] )
add_filter( 'posts_orderby', /* … */ );
そしてあなたのorderbyフィルタには以下を使ってください。
remove_filter( current_filter(), __FUNCTION__ );