我已经注册了Wordpress附件的类别,但类别显示为空

时间:2016-08-25 13:19:15

标签: php wordpress

我正在建立一个关于狗的网站,有很多图片。用户应该能够根据类别(例如狗品种的名称)查找图像。因此,我需要网站处理常规博客文章等附件,并以帖子的形式列在类别下,如下所示:

image wrapped in post

为此,我使用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真正展示了类别和标签,如下所示:

Media categories

但是类别页面不会检索任何内容。例如,虽然我在Beagle类别下至少有三个图像/附件,但在尝试查看Beagle类别时,没有任何内容出现。它被认为是一个空的类别,虽然有三个附件。

enter image description here

我认为这是因为按类别查询仅在常规帖子中执行,不包括附件。我已经搜索了好几天了,但是还没有找到如何在类别查询中包含附件,以便我的附件类别看起来不是空的。请帮忙! :P

1 个答案:

答案 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”的信息。这个回调函数的正确语法是什么?我应该把它包括在哪里?如果有人知道,请分享。