我正在建立一个关于狗的网站,有很多图片。用户应该能够根据类别(例如狗品种的名称)查找图像。因此,我需要网站处理常规博客文章等附件,并以帖子的形式列在类别下,如下所示:
为此,我使用functions.php中的以下代码注册了附件的类别和标签:
// add categories for attachments
function add_categories_for_attachments() {
register_taxonomy_for_object_type( 'category', 'attachment' );
}
add_action( 'init' , 'add_categories_for_attachments' );
// add tags for attachments
function add_tags_for_attachments() {
register_taxonomy_for_object_type( 'post_tag', 'attachment' );
}
add_action( 'init' , 'add_tags_for_attachments' );
Now Media真正展示了类别和标签,如下所示:
但是类别页面不会检索任何内容。例如,虽然我在Beagle类别下至少有三个图像/附件,但在尝试查看Beagle类别时,没有任何内容出现。它被认为是一个空的类别,虽然有三个附件。
我认为这是因为按类别查询仅在常规帖子中执行,不包括附件。我已经搜索了好几天了,但是还没有找到如何在类别查询中包含附件,以便我的附件类别看起来不是空的。请帮忙! :P
答案 0 :(得分:0)
分享我发现的内容,以防其他人需要相同的答案......
这里实际上有两个问题:一个与“主要查询”相关,另一个与“类别计数器”相关。
1)要在主查询中包含附件(从而在查看类别时检索附件和常规帖子),可以将以下过滤器添加到functions.php中:
function my_custom_filter($query) {
if( !is_admin() && $query->is_main_query() ) {
if( $query->is_archive() ) {
$query->set('post_type', array( 'post', 'attachment' ) );
$query->set('post_status', array( 'publish', 'inherit' ) );
}
}
}
add_action('pre_get_posts','my_custom_filter');
2)要让附件填充类别以便它们不再显示为空,我创建了一个解决方法。我认为这不是最优雅和最明智的解决方案,但确实有效。在WordPress SQL数据库中执行以下mySQL查询:
UPDATE `wp_posts` SET `post_status`='publish' WHERE `post_type`='attachment' AND `post_status`='inherit' AND `post_mime_type`='image/jpeg'
附件通常不会出现在类别中,因为它们的默认post_status是“inherit”。此查询将其更改为“发布”,就像常规帖子一样。
WordPress codex提到:
因为附件是一种帖子,所以默认 将使用_update_post_term_count()(在register_taxonomy()函数中)。然而,这可能是不合需要的,因为这只会是 计算实际附加到另一个帖子的附件(如 当您将图像插入帖子时)。这意味着附件 您只需使用媒体库上传到WordPress,但确实如此 实际上不附加到另一个帖子将不计算在内。 (...)你 应该通过设置强制使用_update_generic_term_count() '_update_generic_term_count'作为update_count_callback的值。 另一个重要的考虑因素是_update_post_term_count() 计算发布的帖子。如果您使用自定义状态或使用 发布的自定义帖子类型不一定是 考虑计入术语计数,那么你需要 提供不包含post_status的回调 where子句的一部分。
这肯定是反问题的正确解决方案,但我找不到足够的信息来允许我实施它。我无法弄清楚如何在类别上强制'_update_generic_term_count',而不会通过对register_taxonomy()的新调用覆盖类别,这将删除所有当前的类别配置。我发现绝对没有关于“提供我自己的回调,不包括post_status”的信息。这个回调函数的正确语法是什么?我应该把它包括在哪里?如果有人知道,请分享。