我们一直在使用媒体标签(http://wordpress.org/plugins/media-tags/ ) 有一段时间,尤其是对于仪表板媒体管理功能,而不是其任何前端显示功能。它实际上并没有在任何地方进行积极维护,而且由于WP 3.5,对于本应仅使用自定义分类法即可完成的事情来说,这只是一个巨大的开销。
在尝试创建一个有效的、最少的媒体标签插件时,我使用了以下问题(How to use taxonomies on attachments with the new Media Library? ) 作为我的主要指导,但它至少有两个问题需要解决。
查看仪表板中的标签时,我总是会显示一个0的计数,即使有明显标记有所述标签的项目(点击0甚至可以找到它们)。我尝试根据我链接到的另一个问题将update\\u count\\u回调值更新为“\\u update\\u generic\\u term\\u count”,但它只提供了0罢工>
编辑:我的计数被关闭,不是因为此代码,而是因为数据库中先前使用的代码中已有的条目。
2) 在后端查看媒体标签时,当您将鼠标悬停在某个项目上时,始终会显示“查看”链接。该视图链接总是尝试转到一个非dahsboard页面,该页面始终不会返回任何帖子。理想情况下,视图链接不会出现,但它需要显示出来,我希望它至少能工作。
以下是我目前正在尝试的代码,但遇到了上述两个问题:
// Register Custom Taxonomy
function cets_media_tags_init() {
$labels = array(
\'name\' => _x( \'Media Tags\', \'Taxonomy General Name\', \'text_domain\' ),
\'singular_name\' => _x( \'Media Tag\', \'Taxonomy Singular Name\', \'text_domain\' ),
\'menu_name\' => __( \'Media Tags\', \'text_domain\' ),
\'all_items\' => __( \'All Media Tags\', \'text_domain\' ),
\'parent_item\' => __( \'Parent Media Tag\', \'text_domain\' ),
\'parent_item_colon\' => __( \'Parent Media Tag:\', \'text_domain\' ),
\'new_item_name\' => __( \'New Media Tag\', \'text_domain\' ),
\'add_new_item\' => __( \'Add New Media Tag\', \'text_domain\' ),
\'edit_item\' => __( \'Edit Media Tag\', \'text_domain\' ),
\'update_item\' => __( \'Update Media Tag\', \'text_domain\' ),
\'separate_items_with_commas\' => __( \'Separate Media Tags with commas\', \'text_domain\' ),
\'search_items\' => __( \'Search Media Tags\', \'text_domain\' ),
\'add_or_remove_items\' => __( \'Add or remove Media Tags\', \'text_domain\' ),
\'choose_from_most_used\' => __( \'Choose from the most used Media Tags\', \'text_domain\' ),
);
$args = array(
\'labels\' => $labels,
\'hierarchical\' => false,
\'public\' => true,
\'show_ui\' => true,
\'show_admin_column\' => true,
\'show_in_nav_menus\' => false,
\'show_tagcloud\' => false,
\'update_count_callback\' => \'_update_generic_term_count\',
\'query_var\' => false,
\'rewrite\' => false,
);
register_taxonomy( \'media-tags\', \'attachment\', $args );
}
// Hook into the \'init\' action
add_action( \'init\', \'cets_media_tags_init\', 0 );
最合适的回答,由SO网友:Tom Auger 整理而成
遗憾的是,就更新计数而言,我还没有在您的代码中发现缺陷。复制并粘贴我的以进行比较(将其粘贴到一个可以轻松停用的插件中)。这就像一个符咒,所有计数都会正确更新:
class ZGAttachmentTags {
const SLUG = \'attachment-tags\';
function __construct() {
add_action( \'init\', array( $this, \'register_custom_taxonomy\' ) );
}
function register_custom_taxonomy() {
register_taxonomy(
self::SLUG,
array( \'attachment\' ),
array(
\'label\' => __( \'Media Tags\' ),
\'labels\' => array(
\'name\'=> __( \'Media Tags\' ),
\'singular_name\'=> __( \'Media Tags\' )
),
\'hierarchical\' => false,
\'update_count_callback\' => \'_update_generic_term_count\'
)
);
}
}
$zg_attachment_tags_plugin = new ZGAttachmentTags();
很明显,我使用的是
register_taxonomy
, 仅仅是大量违约。可能是您的另一个参数导致了此问题。或者我误解了这个问题。
关于“查看”链接,默认情况下,分类法归档查询只包括状态为公共的帖子(如果用户登录,通常为“发布”和“私有”)。附件未发布-它们收到“继承”状态。然后,解决方案是修改查询或请求,以包含状态为“inherit”的帖子。
最简单的方法是使用parse_query
过滤器,在将所有查询变量解析为mainquery
对象,就在get_posts()
方法运行,最终生成SQL请求。您可以这样做:
add_filter( \'parse_query\', \'parse_query__attachment_status\' );
function parse_query__attachment_status( $query_obj ){
// Make sure we don\'t contaminate any other queries...
if ( $query_obj->query[\'attachment-tags\'] ){
$statuses = get_post_stati( array( \'public\' => true ) ) ;
$statuses[\'inherit\'] = \'inherit\'; // push \'inherit\' status onto the list
$query_obj->set( \'post_status\', array_keys( $statuses ) );
}
return $query_obj;
}
请注意,为了简单起见,我将此示例作为您的
functions.php
例如但是您可以(并且应该)将其滚到类中,因此将类常量用于分类slug(
self::SLUG
). 也不要忘记修改
add_filter()
调用以使用数组窗体。
这种方法唯一的问题(我想这不是真正的问题)是WordPress在检测到您正在查询附件时会自动执行一些有趣的操作。它将添加JOIN
到wp_posts
查询父帖子,并将子句添加到WHERE
子句,用于检查父项的post\\u状态以及子项的状态。
这意味着您可能会得到一些重复,如果事实上,一些媒体项目已包括在帖子中。避免这种情况的一种方法是将状态硬编码为“仅继承”(而不是使用炫耀get_post_stati()
我使用的方法,主要是因为我欣赏函数名中拉丁文复数的使用。)。
如果你内心勇敢,你可以做的另一件事就是避免parse_query
有利于posts_clauses
筛选并重写WHERE
和JOIN
sql自己。这将需要一些创造性的探索和替换,对我来说,这个答案似乎太麻烦了,尽管这无疑是最正确的方法,也是最能证明未来的方法。