使用自定义分类创建轻量级媒体标签插件

时间:2013-07-05 作者:MadtownLems

我们一直在使用媒体标签(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 );

1 个回复
最合适的回答,由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在检测到您正在查询附件时会自动执行一些有趣的操作。它将添加JOINwp_posts 查询父帖子,并将子句添加到WHERE 子句,用于检查父项的post\\u状态以及子项的状态。

这意味着您可能会得到一些重复,如果事实上,一些媒体项目已包括在帖子中。避免这种情况的一种方法是将状态硬编码为“仅继承”(而不是使用炫耀get_post_stati() 我使用的方法,主要是因为我欣赏函数名中拉丁文复数的使用。)。

如果你内心勇敢,你可以做的另一件事就是避免parse_query 有利于posts_clauses 筛选并重写WHEREJOIN sql自己。这将需要一些创造性的探索和替换,对我来说,这个答案似乎太麻烦了,尽管这无疑是最正确的方法,也是最能证明未来的方法。

结束

相关推荐

Multi site and media uploader

在我的live博客上,我的多站点似乎有一个奇怪的问题。可能是因为我有一个网站设置为“已删除”-所以我可以编辑它,但公众看不到它?我当前的上载设置如下:wp-content/blogs.dir/10/files这给了我一个链接,例如(链接是真实的,我用example.com替换了我的网站地址):http://example.com/files/2013/01/Screenshot-from-2013-01-04-141248-300x150.png这适用于我拥有的每一个站点,我最近创建了一个新站点,通过上传