web-dev-qa-db-fra.com

rechercher parmi les titres de pièces jointes de type post

J'ai une page où je montre toutes les pièces jointes d'une page dans une table qui a id=10.

J'ai des centaines de pièces jointes et j'aimerais implémenter un formulaire de recherche AJAX qui utilise le titre de la pièce jointe comme clé de recherche.

En réalité, le problème ne réside pas dans l'implémentation de l'appel AJAX, mais dans la requête qui renvoie la liste des pièces jointes.

2

vous interrogez peut être comme

<?php
$args = array( 'post_type' => 'attachment', 'numberposts' => -1, 'post_status' =>'any', 'post_parent' => 10 ); 
$attachments = get_posts($args);
if ($attachments) {
    foreach ( $attachments as $attachment ) {
        if('you title of image'==$attachment->post_title ){
              //your code goes here
        }
    }
}
?>

Lien important :

get_posts ()

Formulaire de recherche Ajax

2
Ravinder Kumar

Vous devriez essayer d'appliquer la variable s (recherche) en tant que paramètre de votre requête personnalisée.

Voir cet exemple ici:

$query = new WP_Query( 's=keyword' );

et vous pouvez ensuite appliquer une boucle normale pour parcourir vos résultats. Ceci effectue également une correspondance de chaîne identique à celle de l'opérateur %keyword% que vous avez mentionné dans le commentaire de la réponse de @Ravs.

Reportez-vous à la documentation ici .

2
Rohit Pande

WP_Query ne fera pas ce que vous voulez par défaut. Si vous essayez de rechercher par post_name, vous obtiendrez une requête post_name= qui est trop stricte. Si vous utilisez le paramètre s, vous obtiendrez une recherche %term% à la fois sur le nom et le contenu de la publication. term correspondra n'importe où dans le mot, pas seulement au début. Et c'est trop large pour ce que vous faites. Et s devient de moins en moins efficace à mesure que vous ajoutez des termes, bien que cela ne soit pas un problème pour vous.

Vous dites que vous voulez une correspondance si vous utilisez les "n premières" lettres, vous devez donc filtrer la requête. Cela devrait le faire.

function search_filter_right_wild($search) {
  remove_filter('posts_where','search_filter_right_wild');
  global $wpdb;
  $pattern = "|{$wpdb->posts}.post_name = '([^']*)'|";
  $search = preg_replace($pattern,"{$wpdb->posts}.post_name LIKE '$1%'",$search);
  return $search;
}
add_filter('posts_where','search_filter_right_wild');

$q = new WP_Query( 
  array(
    'name' => 'test',
    'post_type' => 'attachment', 
    'numberposts' => -1, 
    'post_status' => 'inherit'
  ) 
);
var_dump($q->request);

Vous recherchez uniquement le nom du message et le filtre ajoute un % à droite uniquement, de sorte que le caractère générique ne correspond qu'à la droite du terme.

Ajoutez le filtre dans votre callback AJAX avant la requête et il se supprimera automatiquement (bien que cette dernière partie ne soit probablement pas nécessaire).

2
s_ha_dum