web-dev-qa-db-ja.com

WPクエリでのカスタムオーダー

私は自分のクエリの順序付けを実装しようとしています、これが私が思いついたものです...

$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内の私のカスタムクエリからクエリ変数を取得しようとしました。

もっときれいな方法はありますか?

2
Horttcore

フィルタをチェーン します。

if ( 'include' == $query->query_vars['orderby'] )
    add_filter( 'posts_orderby', /* … */ );

そしてあなたのorderbyフィルタには以下を使ってください。

remove_filter( current_filter(), __FUNCTION__ );
3
fuxia