22

is it possible to create a loop of posts using WP_Query or query_posts using the title?

ie

$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(); ...

5 Answers 5

37

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;
}
?>

Then:

$args = array(
    'post_title_like' => $str
);
$res = new WP_Query($args);
6
  • Works great except for the second argument (the referenced $wp_query), which doesn't seem to be part of the filter callback (see codex.wordpress.org/Plugin_API/Filter_Reference/posts_where) and will generate an error.
    – maryisdead
    Commented Oct 14, 2013 at 12:37
  • 1
    actually, the code is correct as is, at least in WP 4.1.1. It's the codex that's omitting the second argument, so if you declare 2 arguments in add_filter as in the example, it works fine. Another advantage of this solution is that it works for custom post types.
    – yitwail
    Commented Mar 22, 2015 at 4:49
  • 1
    This should be accepted answer since this shows how to do it using WordPress built-in functions and not using custom SQL query.
    – Sudar
    Commented Apr 2, 2015 at 6:11
  • 1
    it seems, that first % is missed here. Right after LIKE \'. I added it and it started working (4.2.4)
    – vladkras
    Commented Aug 16, 2015 at 10:45
  • Yes, missing the first % , added too, and works :) ( maybe should edit the answer ? ) Commented Sep 21, 2016 at 8:40
3

got this working with the help from this post in the end. Cheers guys;

$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

Get the title from another loop

$title = get_the_title();

and use the $title variable if you wish.

<?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(); ?>
1
  • it works on custom post type and wordpress 3.2.1 Commented Nov 22, 2011 at 23:35
2

These replies seem to me as trying to hack wordpress.

Refer to the same question on stack overflow:

https://stackoverflow.com/questions/25761593/wp-query-with-post-title-like-something-and-category

This works if you want to do a search query by title ordered by title:

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

This example query is for a post type named watches and the 's' (search term) is where you can look for your post titles on the query

1
  • 6
    This will search the content as well Commented Jul 2, 2019 at 12:17
2

Yes it is 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);
2
  • cheers Rajeev - tried this but it gets stuck after the get_col. I've updated the above^^^
    – v3nt
    Commented Jul 14, 2011 at 15:17
  • 1
    This worked perfectly, thank you.
    – csaborio
    Commented Jan 11, 2021 at 1:55

Not the answer you're looking for? Browse other questions tagged or ask your own question.