我有一些文章的作者被指定为共同作者。如果我想在我的作者页面上显示他们,他们却没有被列出。因为查询中的这个条件:
AND (wp_posts.post_author = 53)
AND (wp_posts.post_author = 53)
我该如何删除它?或者有没有更好的解决方案?
public static function pre_get_posts($query)
{
if ($query->is_author() && $query->is_main_query()):
$author = (get_query_var('author_name')) ? get_user_by('slug', get_query_var('author_name')) : get_userdata(get_query_var('author'));
$authorPostIDs = self::getAuthorsPostIDs($author->ID);
$coAuthorPostIDs = self::getCoAuthorsPostsIDs($author->ID);
$postIDs = array_unique(
array_merge($coAuthorPostIDs, $authorPostIDs), SORT_REGULAR
);
$query->set('post__in', $postIDs);
$query->set('post_status', 'publish');
endif;
}
我的完整查询:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
其中 1=1
AND wp_posts.ID IN (349956,327745)
AND (wp_posts.post_author = 53)
AND wp_posts.post_type = "post
AND ((wp_posts.post_status = 'publish'))
ORDER BY wp_posts.post_date DESC
LIMIT 0, 10
是对的,
AND (wp_posts.post_author = 53)
这一行限制了查询结果,只显示 ID 为 53 的作者的文章。为了显示共同作者的文章,需要修改查询,使其包含所有共同作者的 ID。
以下是一些解决方案:
1. 使用
IN
运算符:
可以将
=
替换为
IN
,并将所有共同作者的 ID 包含在一个数组中:
sql
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
WHERE 1=1
AND wp_posts.ID IN (349956,327745)
AND wp_posts.post_author IN (53, /* 其他共同作者ID */)
AND wp_posts.post_type = "post"
AND ((wp_posts.post_status = 'publish'))
ORDER BY wp_posts.post_date DESC
LIMIT 0, 10
在的
pre_get_posts
函数中,可以通过以下方式获取所有共同作者的 ID:
```php $coAuthorIDs = []; foreach ($coAuthorPostIDs as $coAuthorPostID) { $coAuthorIDs[] = get_post_field( 'post_author', $coAuthorPostID ); } $authorIDs = array_unique(array_merge([$author->ID], $coAuthorIDs), SORT_REGULAR);
$query->set('author__in', $authorIDs); ```
注意:
这里使用了
author__in
参数,而不是直接修改 SQL 查询。
2. 使用联表查询:
可以使用联表查询,从存储共同作者信息的表中获取作者 ID。假设使用的是 "Co-Authors Plus" 插件,该插件将共同作者信息存储在
wp_coauthors
表中:
sql
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
JOIN wp_coauthors ON wp_posts.ID = wp_coauthors.post_id
WHERE 1=1
AND wp_posts.ID IN (349956,327745)
AND (wp_coauthors.author_id = 53 OR wp_posts.post_author = 53)
AND wp_posts.post_type = "post"
AND ((wp_posts.post_status = 'publish'))
ORDER BY wp_posts.post_date DESC
LIMIT 0, 10
这个查询将返回 ID 为 53 的作者以及与该作者共同撰写文章的所有作者的文章。
需要根据使用的插件或方法调整联表查询。
建议:
-
使用 WordPress 提供的 API:
尽量使用 WordPress 提供的 API(如
author__in
参数)来修改查询,而不是直接编写 SQL 代码。这样可以提高代码的可读性和可维护性。 -
调试:
使用
var_dump($query->request);
打印修改后的 SQL 查询,确保其符合预期。
请根据使用的共同作者插件或方法选择合适的解决方案,并更新的
pre_get_posts
函数以构建正确的查询。