web-dev-qa-db-fra.com

Wordpress pre_get_posts avec les résultats combinés de deux requêtes (OR)

Je suis un débutant en développement wordpress ...

J'ai un rôle d'utilisateur "propriétaire". Ces propres "machines" (type de message personnalisé) Je veux que les propriétaires du backend administrateur voient uniquement leurs propres machines (celles dont le propriétaire est l'auteur) et les machines appartenant à la même société (taxonomie des machines). La société est le méta-champ de l'utilisateur et doit correspondre à la taxonomie de la publication.

Pour la condition "même entreprise", je modifie la requête pour ne filtrer que les publications ayant une taxonomie d'entreprise donnée (voir "abc").

Comment puis-je étendre la requête afin que les utilisateurs voient également leurs propres publications, même si celles-ci n'ont pas renseigné le champ société?

Objectif: requête (même entreprise) OR requête (même auteur)

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' );

J'ai essayé de le combiner avec une seconde nouvelle requête mais cela ne semble pas être le bon chemin ...

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

Voir WP_Query comme référence pour les filtres de post-requête. Vous pouvez filtrer les publications de leurs auteurs avec la variable 'author' query en filtrant les publications en fonction de leur taxonomie avec la variable 'tax_query' query var.

Ensuite, définissez conditionnellement la variable 'tax_query' en fonction du champ méta de la société de l'utilisateur. S'il est vide, définissez plutôt la requête 'author' var.

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 );
        }
    }
}

Remarque: sanitize_key() peut être nécessaire en fonction de la manière dont vous stockez la méta-valeur de l'utilisateur de la société. Il met la chaîne en minuscule et y remplace les espaces vides par des traits d'union. Ceci est utilisé par WP par exemple pour définir le slug de l'article à partir du titre de l'article - autrement dit, il "slugify" une chaîne ...

0
ClemC