21

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

35

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
    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
    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
    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
    Aug 16, 2015 at 10:45
  • Yes, missing the first % , added too, and works :) ( maybe should edit the answer ? ) 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 Nov 22, 2011 at 23:35
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
    Jul 14, 2011 at 15:17
  • 1
    This worked perfectly, thank you.
    – csaborio
    Jan 11, 2021 at 1:55
1

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
  • 5
    This will search the content as well Jul 2, 2019 at 12:17

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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