以编程方式将自定义分类设置为整个站点

时间:2016-02-05 作者:j8d

我想根据用户的位置在整个网站范围内创建和设置自定义分类法,以便调用taxonomy_exists( $country ) 确定用户是否位于特定国家/地区。

我安装了GeoIP插件,可以从中获取用户的国家/地区代码$userInfo->country->isoCode.

要注册自定义分类法,我有以下函数。但是,如果我想将分类法应用于整个站点,“对象类型”应该是什么?

add_action( \'init\', \'create_country_taxonomy\' );

function create_country_taxonomy() {
    register_taxonomy(
        \'country\',
        $object_type, // Set to what?
        array(
            \'label\' => __( \'Country\' ),
            \'rewrite\' => array( \'slug\' => \'location\' ),
        )
    );
}
最后,如何将用户的国家分类设置为$userInfo->country->isoCode?

2 个回复
最合适的回答,由SO网友:j8d 整理而成

我通过注册一个自定义分类法来实现它。。。

add_action( \'init\', \'create_country_tax\' );
function create_country_tax() {
    $userInfo = geoip_detect2_get_info_from_current_ip();
    $country = $userInfo->country->isoCode;
    register_taxonomy($country,\'country\');
}
然后打电话taxonomy_exists(\'US\').

SO网友:cybmeta

我觉得你做错了。您不需要一组分类法,只需要一个具有一组术语的分类法。

例如,如果用户位于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
}
我们可以将以前的代码更新为vaoidwp_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\' );

相关推荐