¿Cómo obtener publicaciones por contenido?

2

Encontré los siguientes códigos para obtener detalles de la publicación. Sin embargo, no es posible obtener las publicaciones por contenido . ¿Alguien tiene alguna idea?

get_posts()

//// get post ////
$args = array(
    'numberposts'     => -1, // number of posts to display; display all: -1.
    'offset'          => 0,
    // 'category'        => , // post category ID
    'orderby'         => 'post_date',
    'order'           => 'DESC', // Latest post first: 'ASC'; Olderest post first: 'DESC'
    // 'include'         => ,
    // 'exclude'         => ,
    // 'meta_key'        => ,
    // 'meta_value'      => ,
    'post_type'       => 'post', // get post type
    // 'post_mime_type'  => ,
    // 'post_parent'     => ,
    // 'post_status'     => 'publish'
);

// http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters
$posts_array = get_posts( $args );
foreach( $posts_array as $post ) : setup_postdata($post);
    echo "<li><a href='" . the_permalink() . "'>" . the_title() .
         "</a>" .
         $post->blog_ID . 
         $post->post_date . 
         $post->post_title . 
         $post->pubtimes . 
         $post->post_author . 
         $post->post_content . 
         $post->post_excerpt . 
         $post->post_status;
        "</li>";
endforeach;
    
pregunta goodseller 19.04.2012 - 12:47

2 respuestas

6

Tienes que extender la consulta db para buscar en la columna post_content . Hay un filtro: 'posts_where' que puedes usar.

Escribiría un contenedor simple para get_posts() para extender sus argumentos y ejecutar el filtro una vez. Ejemplo:

class T5_Posts_By_Content
{
    protected static $content = '';

    protected static $like    = TRUE;

    /**
     * Mapper for get_posts() with extra arguments 'content' and 'like'
     *
     * 'content' must be a string with optional '%' for free values.
     * 'like' must be TRUE or FALSE.
     *
     * @param array $args See get_posts.
     * @return array
     */
    public static function get( $args )
    {
        if ( isset ( $args['content'] ) )
        {
            // This is TRUE by default for get_posts().
            // We need FALSE to let the WHERE filter do its work.
            $args['suppress_filters'] = FALSE;
            self::$content            = $args['content'];
            add_filter( 'posts_where', array ( __CLASS__, 'where_filter' ) );
        }

        isset ( $args['like'] ) and self::$like = (bool) $like;

        return get_posts( $args );
    }

    /**
     * Changes the WHERE clause.
     *
     * @param string $where
     * @return string
     */
    public static function where_filter( $where )
    {
        // Make sure we run this just once.
        remove_filter( 'posts_where', array ( __CLASS__, 'where_filter' ) );

        global $wpdb;
        $like  = self::$like ? 'LIKE' : 'NOT LIKE';
        // Escape the searched text.
        $extra = $wpdb->prepare( '%s', self::$content );

        // Reset vars for the next use.
        self::$content = '';
        self::$like    = TRUE;

        return "$where AND post_content $like $extra";
    }
}

Para encontrar las últimas cinco publicaciones que contienen la cadena redimensionada escriba:

$args = array(
    'content' => '%resized%'
);
$posts = T5_Posts_By_Content::get( $args );

Para obtener las últimas cinco publicaciones no que contengan redimensionado :

$args = array(
    'content' => '%resized%',
    'like'    => FALSE
);
$posts = T5_Posts_By_Content::get( $args );
    
respondido por el fuxia 19.04.2012 - 13:43
1

No puedo pensar en una forma elegante fuera de mi cabeza, no estoy seguro de si es posible usar funciones básicas, pero el SQL que desearías usar sería algo como esto pseudocódigo):

SELECT  'ID' 
FROM  '$wpdb->posts' 
WHERE  'post_content' LIKE  '%search term%'

Esto devolverá todos los ID de las publicaciones que SQL cree que se relacionan con su término de búsqueda.

    
respondido por el mor7ifer 19.04.2012 - 12:55

Lea otras preguntas en las etiquetas