16

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

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);
  • 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 '13 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 '15 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 '15 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 '15 at 10:45
  • Yes, missing the first % , added too, and works :) ( maybe should edit the answer ? ) – Toni Michel Caubet Sep 21 '16 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;
2

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(); ?>
  • it works on custom post type and wordpress 3.2.1 – Zakir Sajib Nov 22 '11 at 23:35
0

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);
  • cheers Rajeev - tried this but it gets stuck after the get_col. I've updated the above^^^ – v3nt Jul 14 '11 at 15:17
0

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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