可以将“额外的”表格导航添加到EDIT-Tags.php屏幕上吗?

时间:2017-05-29 作者:Paul \'Sparrow Hawk\' Biron

WP_Posts_List_Table::extra_tablenav() 适用于restrict_manage_posts, 插件可以使用它输出额外的下拉列表(或其他标记),允许根据任意条件过滤表中的帖子。

同样地,WP_(Users|Comments)_List_Table 有一个resttric_manage_(users|comment) 出于类似目的采取的行动。

然而,据我所知,WP_Terms_List_Tablenot. 这是正确的吗?

我正在编写一个插件,它严重依赖于termmeta 在各种自定义分类法上。我的插件将自定义列添加到edit-tags.php?taxonomy=my_custom_tax 显示各种termmeta 每个学期。如果用户能够按不同的meta_value\'s代表我的meta_key\'s

在我打开建议添加WP_Terms_List_Table::extra_tablenav() 方法和restrict_manage_terms 过滤,以便可以执行我想执行的操作,我想看看WPSE上是否有人知道:

是否有可行的解决办法(不涉及劫机之类的事情edit-tags.php?taxonomy=my_custom_tax 重定向到使用自定义子类的自定义页面WP_Terms_List_Table)?WP_Terms_List_Table 当前不支持此功能<我意识到对于core来说,没有(好的)理由按照任何标准进行过滤WP_Term_List_Table 列,但向其中添加自定义列是相当常见的,我不敢相信我是唯一一个想按自定义列中的值进行筛选的人

Edit

我应该注意,在显示meta_value 在custom列中,我将其输出为一个链接,该链接根据该值有效地过滤术语列表。如果用户可以从下拉列表中进行选择(如WP_Posts_List_Table) 这不是meta_value 在列表中显示的任何给定术语页面上始终可见。什么I 要使用链接按当前页面上当前未显示的值进行筛选,请单击随机链接,然后在浏览器的地址字段中编辑生成的URL,使meta_value I 要按筛选。这不仅是一种痛苦,而且并非所有用户都足够精明,意识到他们可以做到这一点。

2 个回复
SO网友:constancecchen

我一直在寻找你问题的相同答案,遇到了完全相同的问题,非常感谢你的深入研究。我在这里绝对是第一个提出这个补充的人!

尝试回答2)-我认为没有很好的理由排除它。我认为WordPress的分类术语与post和user实体相比,在功能上缺乏可悲之处(看看术语meta是如何在post和user meta之后出现的),我希望看到这种变化。

回答1)-我不知道这比您的解决方案好多少,但我提出的解决方法涉及通过get_terms_args 筛选,然后在客户端JS中手动插入选择下拉菜单+筛选按钮。下面是我的设置示例(修改为不使用我的特定类或常量),它通过某个术语元字段进行过滤:

PHP Logic

// @see https://developer.wordpress.org/reference/hooks/get_terms_args/
add_filter( \'get_terms_args\', \'taxonomy_filter\', 10, 2 );

function taxonomy_filter( $args, $taxonomies ) {
    global $pagenow;
    if ( \'edit-tags.php\' !== $pagenow || ! in_array( \'taxonomy-name\', $taxonomies, true ) ) { return $args; }

    // Sort by most recently added terms, instead of alphabetically
    $args[\'orderby\'] = \'term_id\';
    $args[\'order\'] = \'desc\';

    // Filter by term meta
    $meta_key = ( isset( $_GET[\'meta_key\'] ) ) ? sanitize_text_field( $_GET[\'meta_key\'] ) : null;
    $meta_value = ( isset( $_GET[\'meta_value\'] ) ) ? sanitize_text_field( $_GET[\'meta_value\'] ) : null;

    if ( \'meta-filter\' === $meta_key && $meta_value ) {
        $args[\'meta_key\'] = $meta_key;
        $args[\'meta_value\'] = $meta_value;
    }

    // Note: for more complex filtering, use the $args[\'meta_query\'] array.

    return $args;
}
此时,您只需转到(例如),就可以看到这一点yoursite.com/wp-admin/edit-tags.php?taxonomy=taxonomy-name&meta_key=meta-filter&meta_value=foobar.

Client-side jQuery logic

(请确保将此文件包括在wp_enqueue_script(), 但只有当$pagenow === \'edit-tags.php\').

/**
 * Param helpers
 */

// Get params in a JS object
var params = {};
window.location.search.substr(1).split( \'&\' ).forEach(function(item) {
    params[ item.split( \'=\' )[0] ] = item.split( \'=\' )[1];
});

// Return param string based on the params object
function setParams() {
    var string = \'?\';

    for ( key in params ) {
        var value = params[ key ];
        string += key + \'=\' + value + \'&\';
    }

    return string.slice(0, -1); // Remove trailing &
}

/**
 * Add dropdown filters + functionality to term tables
 */

if ( \'taxonomy-name\' === params.taxonomy ) {
    // Create the dropdown menu & HTML
    $( document.querySelector( \'.tablenav .bulkactions\' ) ).after( \'\\
        <div class="alignleft actions"> \\
            <select id="js-filter-dropdown"> \\
                <option value="">Term Meta Filter</option> \\
                <option value="foo">Foo</option> \\
                <option value="bar">Bar</option> \\
                <option value="baz">Baz</option> \\
            </select> \\
            <button id="js-filter" class="button" type="button">Filter</button> \\
        </div> \\
    \' );

    // If we\'re already filtering the view, have the dropdown reflect that
    var value = decodeURIComponent( params.meta_value ).replace(/\\+/g, \' \');
    $( \'#js-filter-dropdown\' ).find( \'option[value="\' + value + \'"]\' ).prop( \'selected\', true );

    // Set up the button action - see taxonomy_filter() for server-side filtering
    $( \'#js-filter\' ).click(function() {
        var value = $( \'#js-filter-dropdown\' ).val();

        if ( value ) {
            params.meta_key = \'meta-filter\';
            params.meta_value = encodeURIComponent( value );
        } else {
            delete params.meta_key;
            delete params.meta_value;
        }

        window.location.search = setParams();
    });
}

Screenshot of the Filtering UI

Before

Screenshot of the filtered table

After image

SO网友:birgire

快速复习课程,看来我们可以劫持bulk_actions-{$this->screen->id} 过滤器,在桌面添加额外的下拉列表。

Example

对于类别分类:

add_filter( \'bulk_actions-edit-category\', function( $actions )
{
    echo \'<select name="foo" ><option value="bar">Bar</option></select>\';

    return $actions;
} );
否则,扩展WP_Terms_List_Table 类实例化为:

$wp_list_table = _get_list_table(\'WP_Terms_List_Table\');

Update:

下面是另一个adventures黑客,用于编辑类别屏幕,需要一些测试:-)

add_filter( \'manage_edit-category_columns\', function( $columns ) use ( &$wp_list_table )
{    
    // Include the WP_Terms_List_Table class
    require_once ( ABSPATH . \'wp-admin/includes/class-wp-terms-list-table.php\' );

    // Extend the WP_Terms_List_Table class
    class WPSE_Terms_List_Table extends WP_Terms_List_Table
    {
        // Override this method
        protected function extra_tablenav( $which )
        {
            echo \'<select name="foo" ><option value="bar">Bar</option></select>\';
        }
    } 
    // end class

    $obj = new WPSE_Terms_List_Table;
    $obj->prepare_items(); 

    // Let\'s clone it to the global object
    $wp_list_table = clone $obj;

    return $columns;
} );
此外,还需要使用get_terms_args 如@winnietherpooh所述,并用redirect_term_location“Paul‘Sparrow Hawk’Biron”提到的过滤器

结束

相关推荐

URL rewriting taxonomy term

我正在为接下来的几个小时寻找解决方案,我不知道这是否适用。我有1个Custom Taxonomy \"Years\" 对于Post Type \"Post (default)\". 分类法有两个术语:\"2014\" 和\"2015\".我已经从类别中选择了一些帖子\"news\" 使用两个不同的分类术语。这显示了两个分类术语的所有帖子:http://website.com/category/news/ 当我想显示类别中的帖子时\"news\" 使用分类术语\"2014\" 我使用以下方法:ht