web-dev-qa-db-ja.com

2つのクエリの結果を組み合わせたWordpressのpre_get_posts(OR)

Wordpress開発に関しては私は初心者です...

私はユーザーロール "owner"を持っています。それら自身の "machine"(カスタム投稿タイプ)私はadminバックエンドの所有者に彼ら自身のmachine(所有者が作者であるもの)と同じ会社が所有するmachine(machineの分類法)だけを見ることを望みます。会社はユーザーのメタフィールドであり、投稿の分類と一致する必要があります。

条件が「同じ会社」の場合、クエリを変更して、特定の会社分類法を使用して投稿をフィルタ処理するようにします(「abc」を参照)。

会社フィールドが入力されていなくてもユーザーが自分の投稿を表示できるようにクエリを拡張する方法を教えてください。

目標:クエリ(同じ会社)ORクエリ(同じ作者)

function only_own_company( $query ) {
    global $typenow;
    $current_user = wp_get_current_user();
    $post_type = 'machine'; // change to your post type
    $role = 'owner';

    if ( $typenow == $post_type && current_user_can( $role ) ) {
        $query->set( 'tax_query', array(
            array(
                'taxonomy' => 'company',
                'field'    => 'slug',
                'terms'    => 'abc',
            ),
        ) );
    }
}
add_action( 'pre_get_posts', 'only_own_company' );

私はそれを2番目の新しいクエリと組み合わせようとしましたが、それは正しい方法ではないようです...

$query2 = new WP_Query( array( 'author', $current_user->ID ) );
$query->posts = array_merge( $query->posts, $query2->posts );
1
Julian Stark

クエリ後フィルタの参照として WP_Query を参照してください。 'author' query varを使用して分類別に投稿をフィルタリングするのと同様に、'tax_query' query varを使用して作成者による投稿をフィルタリングできます。

次に、ユーザーの会社のメタフィールドに応じて'tax_query'クエリ変数を条件付きで設定します。空の場合は、代わりに'author'クエリ変数を設定してください。

add_action( 'pre_get_posts', 'alter_query', 99, 1 );

function alter_query( $query ) {
    global $typenow;

    if ( 'machine' === $typenow && current_user_can( 'owner' ) ) {
        $user    = wp_get_current_user();
        $company = get_user_meta( $user->ID, 'company', true );

        if ( '' !== $company ) {
            $query->set( 'tax_query', array(
                array(
                    'taxonomy' => 'company',
                    'field'    => 'slug',
                    'terms'    => sanitize_key( $company ),
                ),
            ) );

        } else {
            $query->set( 'author', $user->ID );
        }
    }
}

sanitize_key() は、会社のユーザーのメタ値の格納方法によっては必要になる場合があります。文字列を小文字にし、空白をハイフンで置き換えます。これはWPによって使用され、例えば投稿のタイトルから投稿のスラッグを定義します - 言い換えれば、それは文字列を "slugify"します...

0
ClemC