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(); ...
v3nt
la source

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);
Brady
la source
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;
v3nt
la source
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(); ?>
Zakir Sajib
la source
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);
Rajeev Vyas
la source
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

gtamborero
la source
1
Cela cherchera également le contenu
Mark Kaplun