我觉得你做错了。您不需要一组分类法,只需要一个具有一组术语的分类法。
例如,如果用户位于US
, US
应该是属于country
分类学,而不是分类学本身。
在答案的代码中,您为每个国家注册了一个分类法,当您真的只需要一个分类法和多个术语时,您将得到许多分类法。此外,在该代码中,您没有将任何用户分配给任何分类法,因为您没有创建术语,您正在创建分类法,并且可以将对象(本例中的用户)分配给术语,但不能分配给分类法。
一个简单的例子:一篇文章可以属于“类别A”(类别分类法的一个术语),但不属于“类别分类法”。我不确定我是否能正确解释这个概念,我希望你理解我的意思。
此外,如果要使用自定义分类法对用户进行分类object_type
参数应为user
, 不country
也就是说,看到你的代码,一个未知的对象类型。
因此,首先,我们为用户注册分类法:
add_action( \'init\', \'create_country_taxonomy\' );
function create_country_taxonomy() {
register_taxonomy(
// name of the taxonomy
\'country\',
// Object type that can be classified using the taxonomy
\'user\',
array(
\'label\' => __( \'Country\' ),
\'rewrite\' => array( \'slug\' => \'location\' ),
)
);
}
现在,当用户注册或更新时,我们可以在国家分类法中创建一个术语,并将其分配给用户,如下所示:
add_action( \'user_register\', \'my_profile_update\' );
add_action( \'profile_update\', \'my_profile_update\', 10, 2 );
function my_profile_update( $user_id, $old_user_data ) {
$userInfo = geoip_detect2_get_info_from_current_ip();
$country_code = $userInfo->country->isoCode;
// Syntax (see https://codex.wordpress.org/Function_Reference/wp_set_object_terms)
// wp_set_object_terms( $object_id, $terms, $taxonomy, $append );
wp_set_object_terms( $user_id, $country_code, \'country\' );
}
然后,您可以使用该功能检查用户是否属于某个国家
has_term()
. 例如,您可以检查当前用户是否位于美国:
if( has_term( \'US\', \'conuntry\', get_current_user_id() ) ) {
// Current user belongs to US
}
我们可以将以前的代码更新为vaoid
wp_set_object_terms()
如果用户已指定国家/地区:
add_action( \'user_register\', \'my_profile_update\' );
add_action( \'profile_update\', \'my_profile_update\', 10, 2 );
function my_profile_update( $user_id, $old_user_data ) {
$userInfo = geoip_detect2_get_info_from_current_ip();
$country_code = $userInfo->country->isoCode;
if( ! has_term( $country_code, \'conuntry\', $user_id ) ) {
wp_set_object_terms( $user_id, $country_code, \'country\' );
}
}
您还可以使用
get_objects_in_term()
列出我们的所有用户(
WP_User_Query
似乎不支持分类法?:
// You need to know the term_id of US term,
// I use 3 here as example
$user_in_US = get_objects_in_term( 3, \'country\' );