query_post par titre?


18

est-il possible de créer une boucle de messages en utilisant WP_Query ou query_posts en utilisant le titre?

c'est à dire

$args = array('post_title'='LIKE '.$str.'% ');

$res = WP_Query($arg);

// the loop...


// trying this now...
$mypostids = $wpdb->get_col("select ID from $wpdb->posts where post_title like 'Abb%' ");

echo count($mypostids).", ";    // works but can't echo out array of IDs for the next args?

$args = array(
    'post__in'=> $mypostids
);

$res = WP_Query($args);

while( $res->have_posts() ) : $res->the_post(); ...

Réponses:


31

functions.php

<?php
add_filter( 'posts_where', 'title_like_posts_where', 10, 2 );
function title_like_posts_where( $where, $wp_query ) {
    global $wpdb;
    if ( $post_title_like = $wp_query->get( 'post_title_like' ) ) {
        $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( $wpdb->esc_like( $post_title_like ) ) . '%\'';
    }
    return $where;
}
?>

Alors:

$args = array(
    'post_title_like' => $str
);
$res = new WP_Query($args);

Fonctionne très bien, sauf pour le deuxième argument (le référencé $wp_query), qui ne semble pas faire partie du rappel de filtre (voir codex.wordpress.org/Plugin_API/Filter_Reference/posts_where ) et générera une erreur.
maryisdead

1
en fait, le code est correct tel quel, au moins dans WP 4.1.1. C'est le codex qui omet le deuxième argument, donc si vous déclarez 2 arguments add_filtercomme dans l'exemple, cela fonctionne très bien. Un autre avantage de cette solution est qu'elle fonctionne pour les types de publication personnalisés.
yitwail

1
Cette réponse doit être acceptée car cela montre comment le faire à l'aide des fonctions intégrées de WordPress et non à l'aide d'une requête SQL personnalisée.
Sudar

1
il semble que ce premier %soit manqué ici. Juste après LIKE \'. Je l'ai ajouté et il a commencé à fonctionner (4.2.4)
vladkras

Oui, il manque le premier %, ajouté aussi et fonctionne :) (devrait peut-être modifier la réponse?)
Toni Michel Caubet

3

obtenu ce travail avec l'aide de ce message à la fin. Acclamations gars;

$finalArgs =  array (       
        'posts_per_page'=>5,
        'order' => 'ASC',
        'post_type' => 'school'                         
    );

    // Create a new instance
    $searchSchools = new WP_Query( $finalArgs );

    $mypostids = $wpdb->get_col("select ID from $wpdb->posts where post_title LIKE '".$str."%' ");

    $args = array(
        'post__in'=> $mypostids,
        'post_type'=>'school',
        'orderby'=>'title',
        'order'=>'asc'
    );

    $res = new WP_Query($args);

    while( $res->have_posts() ) : $res->the_post();

        global $post;

        $EstablishmentNumber = get_post_meta($post->ID,'EstablishmentNumber', true);

        $schl = array('id'=>$EstablishmentNumber, 'label'=>$post->post_title , 'value'=>$EstablishmentNumber );     
        $matchedSchools[] = $schl;


    endwhile;

3

Obtenez le titre d'une autre boucle

$title = get_the_title();

et utilisez la variable $ title si vous le souhaitez.

<?php

global $post, $current_post_id, $title;

function filter_where($where = ''){

    global $title;
    $where .= "AND post_title = '$title'";
    return $where;

}
add_filter('posts_where', 'filter_where');

$query = new WP_Query(array('post_type' => 'sessions') );
if ( have_posts() ) : while ( $query->have_posts() ) : $query->the_post();

    /* Loop here */

endwhile; endif; 

wp_reset_query(); ?>

cela fonctionne sur le type de message personnalisé et wordpress 3.2.1
Zakir Sajib

0

Oui c'est possible....

global $wpdb;

$mypostids = $wpdb->get_col("select ID from $wpdb->posts where post_title like '%$str%' ");

$args = array('post__in'=$mypostids);

$res = WP_Query($arg);

cheers Rajeev - a essayé mais il reste bloqué après le get_col. J'ai mis à jour ce qui précède ^^^
v3nt

0

Ces réponses me semblent essayer de pirater wordpress.

Référez-vous à la même question sur le débordement de pile:

/programming/25761593/wp-query-with-post-title-like-something-and-category

Cela fonctionne si vous souhaitez effectuer une recherche par titre trié par titre:

$the_query = new WP_Query( 
  array(
    'post_type' => 'watches',
    'posts_per_page' => 5,
    'orderby' => 'title',
    's' => 'my title'
  ) 
);

Cet exemple de requête concerne un type de publication nommé montres et le 's' (terme de recherche) est l'endroit où vous pouvez rechercher vos titres de publication dans la requête


1
Cela cherchera également le contenu
Mark Kaplun
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.