回答扩展问题,即Another question is[...]:
值得注意的是,Wordpress的插件API不会在请求之间持久存在,也就是说,任何通过Wordpress与操作关联的函数都不会持久存在add_action()
仅在脚本执行期间关联。Wordpress提供的每个后续请求都必须再次将函数与其适当的操作绑定(同样,仅在请求/脚本执行期间)。
记住,您正在绑定函数showAdminMessagePwd()
到行动admin_notices
在执行标头重定向之前should briefly prompt the client browser to terminate the request and start a new one at the indicated location. I may be misinterpreting the situation, but it seems reasonable that showAdminMessagePwd()
is no longer bound to the action admin_notices
when the script at http://example.com/wp-admin/profile.php 执行为add_action()
绑定它的调用是在一个完全独立的请求上下文中执行的。
将操作绑定到functions.php 文件和函数外部都可以正常工作,因为每当加载主题时,就会执行主题函数文件中的所有代码(出于这个问题的意图和目的,实际上总是这样)。只要函数被执行,并且您的函数在admin_notices
已执行操作。
一种解决方案可能是将确定是否显示的逻辑附加到在每个请求上执行的操作,而不是wp_login
, 仅在用户对自己进行身份验证后执行。这样的实现看起来可能与
function track_last_login( $login ) {
$user = get_user_by( \'login\', $login );
$nLogins = (int) get_user_meta( $user->ID, \'Nlogins\', true );
update_user_meta( $user->ID, \'Nlogins\', $nLogins + 1 );
if( $nLogins === 1 )
header("Location: http://example.com/wp-admin/profile.php");
}
add_action( \'wp_login\', \'track_last_login\' );
function admin_password_notice() {
//If the user isn\'t logged in, or they are viewing pages outside of the dashboard, ignore them.
if( !is_user_logged_in() || !is_admin() )
return;
$user = wp_get_current_user();
$nLogins = (int) get_user_meta( $user->ID, \'Nlogins\', true );
if( $nLogins === 1 )
add_action(\'admin_notices\', \'showAdminMessagePwd\');
}
add_action( \'after_theme_setup\', \'admin_password_notice\' );
请注意,没有调用
remove_action( \'admin_notices\', \'showAdminMessagePwd\' )
是必要的,如果
$nLogins
不等于
1
, 函数从不绑定到操作(不调用
add_action( \'admin_notices\', \'showAdminMessagePwd\' )
,因此不存在要移除的绑定。
还要注意的是the function get_userdatabylogin()
has been deprecated 从Wordpress 3.3开始。