在多站点中,我正在应用过滤器get_blogs_of_user
对“我的网站”管理栏菜单进行排序,其中网站按blogname
:
所发生的是,我想在其他地方再订购一个,在那里,这些网站是按domain
.
例如,出现在用户屏幕中的站点(/wp-admin/network/users.php
):
问题是:为了实现这一目标,我正在使用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
最合适的回答,由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;
}