Rechercher des médias en fonction du titre de l’article attaché
Cette astuce permet de rechercher dans l’espace d’administration des médias en fonction du titre de l’article auquel ils sont attachés.
Lorsque vous faites une recherche dans les médias, WordPress examine dans le titre et la description des médias pour retourner ces résultats.
Dans cette astuce, je vous propose d’ajouter à cette recherche le titre de l’article parent contenant le média recherché !
Modification de la requête
Je vais modifier la requête de la recherche dans la page des médias et ajouter une clause dans le WHERE grâce au hook posts_request
.
Copier le code ci-dessous dans le fichier functions.php
présent à la racine de votre thème :
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]
function baw_search_media_by_post( $request ) {
global $pagenow, $wpdb;
// Si je suis sur la page des médias et qu'une recherche a été lancée.
if ( is_admin() && $pagenow=='upload.php' && isset( $_GET['s'] ) ) {
// Je garde la configuration actuelle de l'utilisateur et aussi la page vue.
$upload_per_page = apply_filters('upload_per_page', (int)get_user_option( 'upload_per_page' ) );
$upload_per_page = empty( $upload_per_page ) || $upload_per_page prepare('SELECT SQL_CALC_FOUND_ROWS '.$wpdb->posts.'. *
FROM '.$wpdb->posts.'
WHERE 1=1
AND '.$wpdb->posts.'.post_type="attachment"
AND ('.$wpdb->posts.'.post_status="inherit" OR '.$wpdb->posts.'.post_status="private")
AND
('.$wpdb->posts.'.post_title LIKE "%%%1$s%%"
OR '.$wpdb->posts.'.post_content LIKE "%%%1$s%%"
OR '.$wpdb->posts.'.post_parent IN (
SELECT ID FROM '.$wpdb->posts.' AS p
WHERE p.post_type"attachment"
AND p.post_title LIKE "%%%1$s%%"
)
)
ORDER BY '.$wpdb->posts.'.post_date DESC LIMIT %2$d, %3$d',
like_escape( $_GET['s'] ), $start, $upload_per_page
);
}
return $request;
}
add_filter('posts_request' , 'baw_search_media_by_post' );
[/pastacode]
La requête d’origine
Voici la requête d’origine avec le mot “test” comme mot de recherche :
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]
SELECT SQL_CALC_FOUND_ROWS wp_posts.*
FROM wp_posts
WHERE 1=1
AND (((wp_posts.post_title LIKE '%test%') OR (wp_posts.post_content LIKE '%test%')))
AND wp_posts.post_type = 'attachment'
AND (wp_posts.post_status = 'inherit' OR wp_posts.post_status = 'private')
ORDER BY wp_posts.post_date DESC LIMIT 0, 20
[/pastacode]
On constate que la recherche est effectuée uniquement dans le titre et la description des médias et non dans le titre de l’article parent.
Aperçu du résultat final
Voilà qui est chose faite avec mon astuce ! Voici la capture de mon essai sur l’article “test post”. Mon média est une image de koala où le mot ‘test’ ne figure pas dans le titre ou le contenu de l’article.
Encore une fois, j’utilise cette fonctionnalité sur toutes mes installations WordPress. Bien à vous !
3 Commentaires
Pas mal du tout. J’ai cru voir passer un plugin qui devait reprendre le même principe.
Excellent, voici qui va servir.
Je préfère cette solution à un plugin, ceci est simple à mettre en place et beaucoup plus léger je pense.
Merci
Salut,
Dans le même principe, il pourrait être intéressant de proposer une solution pour recherche via les tags médias en plus de la recherche classique ? Cela en aiderait plus d’un à mon avis.
Merci.