WP_查询作者或类别

时间:2015-10-30 作者:William Brawner

我正在尝试创建一个feed,其中的帖子是根据一组作者或一组类别提取的,但我运气不太好。我试过使用meta_querytax_query, 但两者都不起作用。基本上,我尝试运行的查询是:

"SELECT * FROM wp_posts WHERE author_id = $set_of_authors OR category = $set_of_categories"
我希望得到一个post对象,我可以正常地运行循环,但我会得到我能得到的。我唯一能想到的就是逃跑get_results 但我知道这通常不是WordPress的方式。是否有更好的方法获取此查询?

2 个回复
SO网友:birgire

自定义进料段塞,以创建自定义进料段塞,例如。

example.tld/billyfeed/
我们可以使用add_feed() 但我们必须刷新重写规则才能激活它。我们可以这样做,例如访问后端的Permalinks设置页面。

要生成提要,我们可以使用例如。do_feed_rss2()do_feed_atom().

下面是一个示例:

add_action( \'init\', function()
{
    add_feed( \'billyfeed\', function()
    {
        do_feed_rss2();
    });
});
修改自定义提要查询接下来,我们需要修改自定义提要,以便获得作者或类别。

以下是使用posts_clauses 筛选,但不使用字符串替换str_replace().

/**
 * Custom feed example.tld/billyfeed that queries authors or categories
 * Supports pagination
 *
 * @link http://wordpress.stackexchange.com/a/207876/26350
 */
add_filter( \'posts_clauses\', function( $clauses, \\WP_Query $q ) 
{    
    //---------------------------------------
    // Only target our custom feed
    //---------------------------------------
    if( ! $q->is_feed( \'billyfeed\' ) || ! $q->is_main_query() )
        return $clauses;

    global $wpdb;       

    //---------------------------------------
    // Input - we edit this to our needs
    //---------------------------------------
    $tax_query = [ 
        [
            \'taxonomy\' => \'category\',
            \'field\'    => \'slug\',
            \'terms\'    => [ \'red\', \'green\', \'blue\' ]
        ]
    ];      
    $author__in = [ 1, 2, 3 ];  

    //---------------------------------------
    // Generate the tax query SQL
    //---------------------------------------
    $qv = [ \'tax_query\' => $tax_query, \'cat\' => null, \'tag\' => null ];
    $q->parse_tax_query( $qv );
    $tc = $q->tax_query->get_sql( $wpdb->posts, \'ID\' );

    //---------------------------------------
    // Generate the author query SQL
    //---------------------------------------
    $csv     = join( \',\', wp_parse_id_list( (array) $author__in ) );
    $authors = " {$wpdb->posts}.post_author IN ( $csv ) ";

    //---------------------------------------
    // Make sure the authors are set and 
    // the tax query is valid (doesn\'t contain 0 = 1)
    //---------------------------------------
    if( ! empty( $author__in ) && false === strpos ( $tc[\'where\' ], \' 0 = 1\' ) ) 
    {
        // Append to the current join/where parts
        $clauses[\'join\']  .= $tc[\'join\'];
        $clauses[\'where\'] .= sprintf( 
            \' AND ( %s OR ( 1=1 %s ) ) \', // The tax query SQL comes prepended with AND
            $authors,
            $tc[\'where\']
        );
    }

    return $clauses;   

}, PHP_INT_MAX, 2 );
我们在其中修改$tax_query$author__in 满足我们的需求。

这将生成以下主SQL查询:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts  
INNER JOIN wp_term_relationships 
    ON (wp_posts.ID = wp_term_relationships.object_id) 
WHERE
    1=1  
    AND wp_posts.post_type = \'post\' 
    AND (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'private\') 
    AND (  wp_posts.post_authors IN (1,2,3 )  OR ( 1=1  AND ( 
        wp_term_relationships.term_taxonomy_id IN (1,43,120)
    ) ) )   
ORDER BY wp_posts.post_date DESC 
LIMIT 0, 10;
通过这种方法,我们仍然可以对提要分页:

example.tld/billyfeed/?paged=2

SO网友:William Brawner

嗯,这并不漂亮,我相信有更好的方法可以做到这一点,但这就是我想到的:

if ($author_ids) {
    $author_ids = implode(\',\', $author_ids);
}
if ($cat_ids) {
    $cat_ids = implode(\',\', $cat_ids);
}
global $wpdb;
if (count($author_ids) > 0 && count($cat_ids) > 0) {
    $posts = $wpdb->get_results(
        "SELECT *
        FROM $wpdb->posts
        INNER JOIN $wpdb->term_relationships
        ON $wpdb->posts.ID = $wpdb->term_relationships.object_id
        WHERE post_status = \'publish\'
        AND post_author
        IN ($author_ids)
        OR term_taxonomy_id
        IN ($cat_ids)
        ORDER BY post_date DESC"
    );
  $post_ids = array();
  foreach ($posts as $post) {
    if (!in_array($post->ID, $post_ids)) {
        $post_ids[] = intval($post->ID);
    }
  }
    $post_ids = array_slice($post_ids, 0, 12);
    $query = new WP_Query(array(\'post__in\' => $post_ids));
} else if (count($author_ids > 0 ) && count($cat_ids) == 0) {
    $query = new WP_Query("author={$author_ids}&posts_per_page=12");
} else if (count($author_ids == 0 ) && count($cat_ids) > 0) {
    $query = new WP_Query("cat={$cat_ids}&posts_per_page=12");
}
在这个特殊的案例中,我正在寻找12个帖子,因此如果有人需要更多,只需将底部的数字12更改为他们需要的数字。

我不知道为什么,但这句话:

    $post_ids = array_slice($post_ids, 0, 12);
必须更改为:

    $post_ids = array_slice($post_ids, 0, 16);
因为它只打印了8篇文章,而不是12篇,尽管日志上说我的$post\\u id包含12篇文章id。无论如何,这一点本身不应该给任何其他希望使用它的人带来任何问题。希望这能有所帮助,或者其他人知道更好的实现方法。

相关推荐

JqueryUi对话框给出未捕获的TypeError:This._addClass不是函数错误

我有一个网站,我们需要一些自定义php编码来连接到外部数据库,以获取几个销售我们产品的供应商的产品评论URL。我们试图实现的基本想法是让用户注册他们的产品,然后如果他们愿意留下评论,就延长保修期。我正在使用XYZScript。com的“插入PHP”插件来实现这一点。该主题最初只加载了jQuery,以避免创建子主题,我们正在php脚本中加载jQueryUI。因此,我们将jQuery加载到文档的标题中,将jQueryUI加载到文档的正文中。我不太确定这是因为加载脚本的顺序造成的,还是其他一些冲突的javasc