update_user_meta not updating

时间:2012-06-15 作者:user761076

我试图在第一次用户登录时强制更改密码,但总体上不起作用,但到目前为止,我发现一个问题update\\u user\\u meta()根本没有更新,这是我的代码:

function track_last_login($login)
{
    global $user_ID;
    $user = get_userdatabylogin($login);
    $Nlogins = (int)get_user_meta($user->ID, \'Nlogins\', true);

    if (!$Nlogins) $Nlogins=1;
    else $Nlogins++;

    update_user_meta($user->ID, \'Nlogins\', $Nlogins);

    if ($Nlogins==1)
    {
        add_action(\'admin_notices\', \'showAdminMessagePwd\');
        header("Location: http://example.com/wp-admin/profile.php");
    }
    else
        remove_action(\'admin_notices\', \'showAdminMessagePwd\');

}
add_action(\'wp_login\',\'track_last_login\');

//(showAdminMessagePwd is a function already defined)
根据我的日志消息,在update\\u user\\u meta之前,Nlogins的值是1,但它在数据库中保持在0,每次新登录都像第一次一样。

我做错了什么?

另一个问题是:为什么*add\\u action(\'admin\\u notices\',\'showadminsessagepwd\')*只在从函数外部调用(直接在functions.php中调用)时起作用,而在函数内部调用时不起作用。

非常感谢。

2 个回复
SO网友:bosco

回答扩展问题,即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开始。

SO网友:Mario Peshev

我不确定流程到底是如何进行的,但我遇到了一个非常类似的问题,我在update\\u user\\u meta上面转储值,它在下面工作(甚至在DB中),如果没有var\\u转储,它在任何地方都无法工作。我已经报告了on Trac 但目前没有回应。

结束

相关推荐

Custom Post Row Actions

我偶然发现this question 在写这个问题的时候。我有一个问题是关于这个问题的。我发现你用的是get_delete_post_link 筛选为我的操作创建一个新的url(或一个类似的函数——在任何情况下,我都会将该函数与布尔值一起使用)。唯一的问题是,I don\'t know how to capture the event now. 考虑到我在谷歌上找不到很多关于行后操作的例子,我将不胜感激-/public function _wp_filter_get_delete_post_link( $