J'ai des problèmes lors de l'interrogation d'un objet WP_Query lorsqu'un utilisateur a un rôle différent de administrator
Mon WP_Query est ceci:
function remove_new_c_post($author_id,$value_id) {
$query = new WP_Query( array(
'post_type' => 'custom_post_type',
'author' => $author_id,
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'value_id',
'value' => $value_id,
'compare' => 'LIKE',
),
),
'order' => 'ASC'
));
if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
wp_delete_post( get_the_ID() );
endwhile;
wp_reset_postdata();
endif;
}
Pour une raison quelconque, lorsque la requête est exécutée par un utilisateur autre que l'administrateur, le résultat est le suivant:
WP_Query Object
(
[query] => Array
(
[post_type] => custom_post_type
[author] => 70
[meta_query] => Array
(
[relation] => AND
[0] => Array
(
[key] => value_id
[value] => 86
[compare] => LIKE
)
)
[order] => ASC
)
[query_vars] => Array
(
[post_type] => custom_post_type
[author] => 86 //<--- THIS SHOULD BE 70
[meta_query] => Array
(
[relation] => AND
[0] => Array
(
[key] => value_id
[value] => 86
[compare] => LIKE
)
)
[order] => ASC
...
Veuillez noter que l'auteur dans query_vars
il est 86 alors qu'il devrait être 70. Pourquoi cela est-il modifié?
EDIT:
Je viens d'essayer de définir le query_var $query->set( 'author', $author_id );
et il a gardé le author_id intact; cependant, le mysql ne cesse de se modifier:
[request] => SELECT SQL_CALC_FOUND_ROWS dlwp_posts.ID
FROM dlwp_posts
INNER JOIN dlwp_postmeta ON ( dlwp_posts.ID = dlwp_postmeta.post_id )
WHERE 1=1 AND dlwp_posts.post_author IN (86)
AND dlwp_posts.post_type = 'custom_post_type'
AND (dlwp_posts.post_status = 'publish'
OR dlwp_posts.post_status = 'future'
OR dlwp_posts.post_status = 'draft'
OR dlwp_posts.post_status = 'pending'
OR dlwp_posts.post_status = 'private')
AND (( dlwp_postmeta.meta_key = 'value_id'
AND CAST(dlwp_postmeta.meta_value AS CHAR) LIKE '%86%' )
Le commentaire de Milo à propos de pre_get_posts
m'a aidé à résoudre ce problème. Dans mon cas, le thème parent a utilisé l'action pre_get_posts
pour définir explicitement le post_type
pour toutes les pages auteur. Ce n'était pas dans functions.php, mais j'ai pu le trouver en cherchant dans le thème des instances de pre_get_posts
. (J'ai utilisé grep -R "pre_get_posts" . -l
à partir de la ligne de commande pour trouver le fichier.)
Si vous n'utilisez pas de thème enfant, vous pouvez éventuellement simplement supprimer la fonction problématique et sa add_action()
.
Si vous utilisez un thème enfant, vous pouvez utiliser la fonction remove_action pour maintenir le caractère évolutif ...
Action problématique existante dans le thème parent:
function problematic_parent_action( &$query ) {
if ($query->is_author) {
$query->set( 'post_type', array( 'problematic_parent_post_type' ) );
}
}
add_action( 'pre_get_posts', 'problematic_parent_action' );
Résolution ajoutée au thème enfant:
function remove_problematic_parent_action() {
remove_action( 'pre_get_posts', 'problematic_parent_action' );
}
add_action( 'init', 'remove_problematic_parent_action');