关于子域的多步骤中的get_user_meta()

时间:2019-05-07 作者:Hamed

此代码允许获取每个用户获得的点数。

function qa_get_user_point ($user_id) {
  return get_user_meta( $user_id, \'qa_point\', true );
}
问题是,在多站点情况下,同一用户可能注册到多个子站点(子域),并且上述代码将为所有子站点返回相同的点数。在a中similar problem, 他们建议使用get_user_option() 而不是get_user_meta, wordpress 3.0.0中不推荐使用。我认为解决方案应该是这样的(但不起作用)

function qa_get_user_point ($user_id) {
    if ( is_single() ){
        return get_user_meta( $user_id, \'qa_point\', true );  // Original    
    }elseif ( is_multisite() ) {        
        return get_user_meta( array( \'blog_id\' => get_current_blog_id(),$user_id ), \'qa_point\', true );
    }   
}
有什么想法吗?

1 个回复
SO网友:majick

您可以通过过滤用户元更新调用,通过update_user_metadata 滤器

function myplugin_init() {
    add_filter( \'update_user_metadata\', \'myplugin_update_points\', 10, 5 );
}

function myplugin_update_points( $null, $object_id, $meta_key, $meta_value, $prev_value ) {

    if ($meta_key == \'qa_point\') {

        remove_filter( \'update_user_metadata\', \'myplugin_update_points\', 10, 5 );            

        global $wpdb; $blog_prefix = $wpdb->get_blog_prefix();

        $current_blog_points = get_user_meta( $object_id, $blog_prefix.$meta_key, true );
        $points_change = $meta_value - $prev_value;

        if (!$current_blog_points) {$new_blog_points = $points_change;}
        else {$new_blog_points = $current_blog_points + $points_change;}           

        update_user_meta( $object_id, $blog_prefix.meta_key, $new_blog_points );

        add_filter( \'update_user_metadata\', \'myplugin_update_points\', 10, 5 );
    }

    // this means: go on with the normal execution in meta.php
    return null;
}
这将在更新全局点时,通过额外的用户元条目(仅限)自动为博客存储点。然后,您可以使用一个单独的函数为博客用户检索这些点(第二个参数可选,默认为当前):

function myplugin_get_blog_points($user_id, $blog_id=false) {

    if (!$blog_id) {$blog_id = get_current_blog_id();}

    $meta_key = \'qapoint\';

    global $wpdb; $blog_prefix = $wpdb->get_blog_prefix($blog_id);

    $points = get_user_meta( $user_id, $blog_prefix.\'qapoints\', true ); 

    return $points;
}
注意,这可能不包括处理主题内点数据的其他函数,您必须检查它是否通过除此之外的任何方式修改点update_user_meta (例如。delete_user_meta) 并相应地添加更多代码以适应这种情况。这可能太难,也可能不太难,不值得这么麻烦,但这似乎是可能的。

还要注意的是,这将回顾性地记录处理点,这意味着如果这些点已经存在,你将不知道它们来自哪个博客——只有在你有了这样的代码后才会开始记录。

相关推荐

用于在AWS上使用WordPress MultiSite的映射域的SSL

我已经在Amazon Web服务器EC2实例上安装了Wordpress Multisite。我在实例上使用弹性IP和负载平衡器。我通过AWS证书管理器为多站点设置了通配符SSL证书,该证书适用于主站点和所有新创建的子域网站。我将此证书应用于负载平衡器。现在,我正在尝试为映射域设置SSL证书。我有域名购买通过名称便宜,并已建立了一个记录的弹性IP。我还创建了一个AWS证书,并通过Namecheap DNS上的CNAME记录对其进行了验证。我将此证书应用于同一个负载平衡器,并在AWS中为指向该负载平衡器的子域