Php I';我已注册Wordpress附件的类别,但类别显示为空

Php I';我已注册Wordpress附件的类别,但类别显示为空,php,wordpress,Php,Wordpress,我正在建立一个关于狗的网站,上面有很多图片。用户应该能够根据类别(例如狗的品种名称)查找图像。因此,我需要网站像对待普通博客帖子一样对待附件,并以帖子的形式将其按类别列出,如下所示: 为此,我使用functions.php中的以下代码注册了附件的类别和标记: // add categories for attachments function add_categories_for_attachments() { register_taxonomy_for_object_type( 'cat

我正在建立一个关于狗的网站,上面有很多图片。用户应该能够根据类别(例如狗的品种名称)查找图像。因此,我需要网站像对待普通博客帖子一样对待附件,并以帖子的形式将其按类别列出,如下所示:

为此,我使用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' );
现在,媒体确实显示了类别和标签,如下所示:

但是,类别页面不会检索任何内容。例如,尽管我在“小猎犬”类别下至少有三个图像/附件,但在尝试查看“小猎犬”类别时,不会显示任何内容。它被认为是一个空类别,尽管有三个附件有它


我想这是因为分类查询只在普通帖子中执行,不包括附件。我已经搜索了好几天了,但还没有找到如何在类别查询中包含附件,这样我的附件类别就不会显示为空。请帮忙P

分享我的发现,以防其他人需要同样的答案

这里实际上有两个问题:一个与“主查询”相关,另一个与“类别计数器”相关

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_状态为“继承”。此查询将其更改为“发布”,就像普通帖子一样

WordPress codex提到:

由于附件是post的一种类型,因此默认 _将使用update_post_term_count()(在register_taxonomy()函数中)。然而,这可能是不可取的,因为这只会 计算实际附加到其他帖子的附件(如 将图像插入帖子时)。这意味着附件 您只需使用媒体库上传到WordPress,但是 没有实际附加到另一个职位将不计算在内。(……)你 应通过设置强制使用_update_generic_term_count() “\u update\u generic\u term\u count”作为update\u count\u回调的值。 另一个重要的考虑因素是_update_post_term_count() 统计发布的帖子。如果您使用的是自定义状态,或 要发布的自定义帖子类型不一定是 考虑被计算在计算中,那么你需要 提供不包含post_状态的您自己的回调 where子句的一部分

这肯定是解决反问题的正确方法,但我没有找到足够的信息来实施它。我无法弄清楚如何强制在类别上使用“\u update\u generic\u term\u count”,而不使用register\u taxonomy()的新调用覆盖类别,这将删除所有类别的当前配置。我发现绝对没有关于“提供我自己的不包括post_状态的回调”的信息。这个回调函数的正确语法是什么?我应该把它放在哪里?如果有人知道,请分享