如何按标题获取多个页面?

时间:2013-07-24 作者:Ben Miller - Remember Monica

在我的插件中,我需要找到任何具有特定标题的自定义帖子类型的帖子。我用的是:

$my_post = get_page_by_title( $title, OBJECT, \'my_custom_post_type\' );
这很好,但如果有多篇文章具有相同的标题,则get\\u page\\u by\\u title将只返回一个结果。根据the Codex article on get_page_by_title, 这是函数的正确行为。

如何检索具有给定标题的所有帖子,而不是仅检索一篇?

2 个回复
最合适的回答,由SO网友:Brian Fegter 整理而成

您需要创建一个新函数。我的示例是核心函数的一个分支。以下内容将允许您跨所有已发布的帖子创建查询,而不管帖子类型如何,除非您需要该特定集。

function get_posts_by_title($page_title, $post_type = false, $output = OBJECT ) {
    global $wpdb;

    //Handle specific post type?
    $post_type_where = $post_type ? \'AND post_type = %s\' : \'\';

    //Query all columns so as not to use get_post()
    $results = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_title = %s $post_type_where AND post_status = \'publish\'", $page_title, $post_type ? $post_type : \'\' ) );

    if ( $results ){
        $output = array();
        foreach ( $results as $post ){
            $output[] = $post;
        }
        return $output;
    }
    return null;
}

//This should get you an array of all posts with \'Foo Bar\' as the title
get_posts_by_title(\'Foo Bar\');

SO网友:Tyler Collier

我也在互联网上搜索过这个问题,但什么都找不到,所以对我来说,这个问题最有价值的部分是验证Wordpress中没有更好的东西。以下是我所知道的最好的方法。

这与标记答案的主要区别在于,它返回的是实数WP_Post 对象,并且不忽略$output 参数

function get_pages_by_title( $page_title, $output = OBJECT, $post_type = \'page\' ) {
    global $wpdb;

    $prepared = $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title = %s AND post_type = %s AND post_status = \'publish\' ORDER BY ID", $page_title, $post_type );
    $results = $wpdb->get_results( $prepared );
    $post_ids = array_map( function($x) { return intval($x->ID); }, $results );
    $posts = get_posts( array(
        \'numberposts\' => -1,
        \'post_type\' => $post_type,
        \'post__in\' => $post_ids,
        \'ignore_sticky_posts\' => true,
        \'orderby\' => \'ID\'
    ) );
    return $posts;
}
(注意:我没有直接测试这段代码。它来自于我编写的代码,它更适合我的项目。如果您发现任何明显的错误,请修复!)

结束