web-dev-qa-db-fra.com

Comment obtenir des messages par contenu?

J'ai trouvé les codes suivants pour obtenir les détails de la publication. Cependant, il n'est pas possible d'obtenir les messages par contenu . Est-ce que quelqu'un a des idées?

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;
2
goodseller

Vous devez étendre la requête de base de données pour rechercher dans la colonne post_content. Il existe un filtre: 'posts_where' que vous pouvez utiliser.

J'écrirais un simple wrapper pour get_posts() afin d'étendre ses arguments et d'exécuter le filtre une fois. Exemple:

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

Pour trouver les cinq derniers articles contenant la chaîne redimensionnée , écrivez:

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

Pour obtenir les cinq derniers articles non contenant redimensionnés :

$args = array(
    'content' => '%resized%',
    'like'    => FALSE
);
$posts = T5_Posts_By_Content::get( $args );
6
fuxia

Je ne peux pas penser à une façon élégante de penser, je ne suis pas sûr que ce soit même possible d'utiliser des fonctions de base, mais le SQL que vous voudriez utiliser ressemblerait à ceci (notez qu'il s'agit d'un pseudocode):

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

Cela renverra tous les identifiants des publications que SQL pense liées à votre terme de recherche.

1
mor7ifer