Salut, pour une raison quelconque, j’ai une fonction qui doit rechercher des publications par identifiant, nom ou titre de publication. Cela ressemble à ceci:
/**
* @param $name_or_id: Name or ID of the post to find
* @param $posttype: The Post Type
* @return null|WP_Post
*/
function r2o_find_post($name_or_id,$posttype) {
if(is_numeric($name_or_id)) {
$id = abs(intval($name_or_id));
if($id > 0) {
$post = get_post($id);
if(is_object($post) && $post->post_type == $posttype) {
return $post;
}
}
return null;
}
$slargs = array(
'post_title' => $name_or_id,
'post_type' => $posttype,
'post_status' => 'publish',
'numberposts' => 1
);
$pt = get_posts($slargs);
if(is_array($pt)) {
return $pt[0];
}
return null;
}
Cependant, dans $ slargs, je ne peux que faire:
post_title => $name_or_id
OR
post_name => $name_or_id
Puis-je faire cette relation "OU" avec WP_Query/get_posts sans faire deux requêtes distinctes?
La classe WP_Query
ne prend pas en charge la requête conditionnelle basée sur OR
sur les colonnes de la même table. Donc, dans ce cas, vous devez écrire votre propre requête SQL. Et comme il y a une requête pour obtenir cet article, cela ne gênera pas la performance. :)
Cependant, j'ai réécrit votre code d'une manière légèrement différente. De cette façon, vous n’auriez pas besoin d’utiliser get_post()
et get_posts()
. Un seul appel get_posts()
serait suffisant. Voici ce-
/**
* @param $name_or_id: Name or ID of the post to find
* @param $posttype: The Post Type
* @return null|WP_Post
*/
function r2o_find_post( $name_or_id, $posttype ) {
$slargs = array(
'post_title' => $name_or_id,
'post_type' => $posttype,
'post_status' => 'publish',
'posts_per_page' => 1,
);
if( is_numeric( $name_or_id ) ) {
$id = abs( intval( $name_or_id ) );
if( $id > 0 ) {
unset( $slargs[ 'post_title' ] );
$slargs['post__in'] = [ $name_or_id ];
}
}
$pt = get_posts( $slargs );
if( is_array($pt) ) {
return $pt[0];
}
return null;
}
Ma théorie principale ci-dessus consiste à manipuler les arguments de get_posts()
en fonction du type de paramètre name_or_id
.
J'espère que cela aide.