¿Cómo consultar posts por título en WordPress?

14 jul 2011, 17:16:48
Vistas: 88.5K
Votos: 22

¿Es posible crear un bucle de posts usando WP_Query o query_posts utilizando el título?

Ejemplo:

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

$res = WP_Query($arg);

// el bucle...


// probando esto ahora...
$mypostids = $wpdb->get_col("select ID from $wpdb->posts where post_title like 'Abb%' ");

echo count($mypostids).", ";    // funciona pero no puedo mostrar el array de IDs para los siguientes args?

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

$res = WP_Query($args);

while( $res->have_posts() ) : $res->the_post(); ...
0
Todas las respuestas a la pregunta 5
6
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;
}
?>

Luego:

$args = array(
    'post_title_like' => $str
);
$res = new WP_Query($args);
14 jul 2011 18:21:09
Comentarios

Funciona muy bien excepto por el segundo argumento (la referencia a $wp_query), que parece no ser parte del callback del filtro (ver http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where) y generará un error.

maryisdead maryisdead
14 oct 2013 15:37:09

en realidad, el código es correcto tal como está, al menos en WP 4.1.1. Es el codex el que omite el segundo argumento, así que si declaras 2 argumentos en add_filter como en el ejemplo, funciona bien. Otra ventaja de esta solución es que funciona para custom post types.

yitwail yitwail
22 mar 2015 06:49:55

Esta debería ser la respuesta aceptada ya que muestra cómo hacerlo usando las funciones nativas de WordPress y no usando una consulta SQL personalizada.

Sudar Sudar
2 abr 2015 09:11:17

parece que falta el primer % aquí. Justo después de LIKE \'. Lo agregué y comenzó a funcionar (4.2.4)

vladkras vladkras
16 ago 2015 13:45:14

Sí, falta el primer %, también lo agregué y funciona :) (¿quizás debería editar la respuesta?)

Toni Michel Caubet Toni Michel Caubet
21 sept 2016 11:40:03

Funciona bien para mí, solo que eliminé & en function title_like_posts_where( $where, &$wp_query ) {, antes de $wp_query. Gracias a @Brady.

Jose Carlos Ramos Carmenates Jose Carlos Ramos Carmenates
25 ene 2017 18:54:12
Mostrar los 1 comentarios restantes
0

Finalmente logré que funcionara con la ayuda de este post. ¡Gracias chicos!

$finalArgs =  array (       
        'posts_per_page'=>5,  // Número máximo de posts por página
        'order' => 'ASC',     // Orden ascendente
        'post_type' => 'school' // Tipo de post personalizado                         
    );

    // Crear una nueva instancia de WP_Query
    $searchSchools = new WP_Query( $finalArgs );

    // Obtener IDs de posts donde el título comienza con la cadena buscada
    $mypostids = $wpdb->get_col("select ID from $wpdb->posts where post_title LIKE '".$str."%' ");

    $args = array(
        'post__in'=> $mypostids, // Solo posts con estos IDs
        'post_type'=>'school',   // Tipo de post
        'orderby'=>'title',      // Ordenar por título
        'order'=>'asc'           // Orden ascendente
    );

    $res = new WP_Query($args);

    // Loop a través de los resultados
    while( $res->have_posts() ) : $res->the_post();

        global $post;

        // Obtener metadato del post
        $EstablishmentNumber = get_post_meta($post->ID,'EstablishmentNumber', true);

        // Crear array con datos de la escuela
        $schl = array(
            'id'=>$EstablishmentNumber, 
            'label'=>$post->post_title, 
            'value'=>$EstablishmentNumber
        );     
        $matchedSchools[] = $schl;

    endwhile;
19 jul 2011 16:04:36
1

Obtener el título de otro bucle

$title = get_the_title();

y usa la variable $title si lo deseas.

<?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();

    /* Bucle aquí */

endwhile; endif; 

wp_reset_query(); ?>
23 nov 2011 01:32:33
Comentarios

funciona en tipos de entradas personalizados y WordPress 3.2.1

Zakir Sajib Zakir Sajib
23 nov 2011 01:35:41
2

Sí, es posible...

global $wpdb;

// Obtener IDs de posts cuyo título coincida con el string buscado
$mypostids = $wpdb->get_col("select ID from $wpdb->posts where post_title like '%$str%' ");

// Configurar argumentos para la consulta WP_Query
$args = array('post__in' => $mypostids);

// Ejecutar la consulta
$res = WP_Query($args);
14 jul 2011 17:29:47
Comentarios

saludos Rajeev - probé esto pero se queda atascado después del get_col. He actualizado lo de arriba^^^

v3nt v3nt
14 jul 2011 18:17:31

Esto funcionó perfectamente, gracias.

csaborio csaborio
11 ene 2021 03:55:30
1

Estas respuestas me parecen intentos de hackear WordPress.

Consulta la misma pregunta en Stack Overflow:

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

Esto funciona si deseas realizar una consulta de búsqueda por título ordenada por título:

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

Este ejemplo de consulta es para un tipo de publicación llamado 'watches' y el 's' (término de búsqueda) es donde puedes buscar los títulos de tus publicaciones en la consulta.

16 nov 2018 13:44:07
Comentarios

Esto también buscará en el contenido

Mark Kaplun Mark Kaplun
2 jul 2019 15:17:25