基于调用它的核心函数的条件挂接

时间:2012-12-31 作者:brasofilo

在多站点中,我正在应用过滤器get_blogs_of_user 对“我的网站”管理栏菜单进行排序,其中网站按blogname:

admin bar multisite my-sites

所发生的是,我想在其他地方再订购一个,在那里,这些网站是按domain.
例如,出现在用户屏幕中的站点(/wp-admin/network/users.php):

user sites

问题是:为了实现这一目标,我正在使用debug_backtrace, 但我不确定这是否是偶然发生的,或者逻辑是否成立(?!)。

我在检查debug_trace()->trace[4][\'function\'] 我知道功能的核心在哪里get_blogs_of_user 正在调用。

示例代码

add_filter( \'get_blogs_of_user\', \'bf_reorder_users_sites\' );

function bf_reorder_users_sites( $blogs ) {
    $trace = debug_backtrace();
    // my_debug_dump();

    if( \'initialize\' == $trace[4][\'function\'] )
        uasort( $blogs, \'bf_uasort_by_blogname\' );
    else
        uasort( $blogs, \'bf_uasort_by_domain\' );

    return $blogs;
}

function bf_uasort_by_domain( $a, $b ) {
    return strcasecmp( $a->domain, $b->domain );
}

function bf_uasort_by_blogname( $a, $b ) {
    return strcasecmp( $a->blogname, $b->blogname );
}
调试my_debug_dump() 列表$trace[4][\'file\']$trace[4][\'function\'], 和打印:

File:: /wp-path/wp-includes/admin-bar.php
Function:: initialize
--------
File:: /wp-path/wp-includes/class-wp-admin-bar.php
Function:: get_active_blog_for_user
--------
File:: /wp-path/wp-admin/admin-header.php
Function:: wp_user_settings
--------
File:: /wp-path/wp-includes/admin-bar.php
Function:: is_user_member_of_blog
--------
File:: /wp-path/wp-admin/includes/class-wp-list-table.php
Function:: display_rows
--------
File:: /wp-path/wp-admin/includes/class-wp-list-table.php
Function:: display_rows
--------
File:: /wp-path/wp-admin/includes/class-wp-list-table.php
Function:: display_rows

1 个回复
最合适的回答,由SO网友:brasofilo 整理而成

很可能,使用debug_backtrace 这种方式就是疯狂的黑客行为。。。

根据@toscho的提示,以下内容可以获得相同的结果:

add_filter( \'get_blogs_of_user\', \'reorder_users_sites\' );

function reorder_users_sites( $blogs ) 
{
    if( !did_action( \'wp_before_admin_bar_render\' ) )
        uasort( $blogs, \'bf_uasort_by_blogname\' );
    else 
        uasort( $blogs, \'bf_uasort_by_domain\' );

    return $blogs;
}

结束

相关推荐

创建补丁以提交给WordPress Core的最简单方法?

我已经提交了一些patches for WordPress core 在…上Trac (其中一个已经被使用过)但每次我想这样做的时候,我都会退缩,因为我这样做的设置令人难以置信地乏味。有人能详细说明提交core补丁所需的步骤吗,然后是简化流程的最佳方法,这样就不会那么乏味了?我目前使用Mac OS X和PhpStorm,但我认为shell脚本可能是最简单的?或者是一个PHP脚本,它可以完成所有的死记硬背工作?问题之一是我不完全理解我需要从什么开始。我是从行李箱开始的吗?每次我想创建补丁时,我是否必须下载一