Скрытие цен на основе бэкэнда местоположения посетителя в Woocommerce - PullRequest
0 голосов
/ 28 февраля 2019

В моем последнем вопросе я спросил, как скрыть цены для посетителей за пределами Великобритании.

Исходя из ответа, я успешно использовал этот код

add_filter( 'woocommerce_get_price_html', 'country_geolocated_based_hide_price', 10, 2 );
function country_geolocated_based_hide_price( $price, $product ) {
    if( get_current_user_id() > 0 ) {
        $country = WC()->customer->get_billing_country();
    } else {
        // Get an instance of the WC_Geolocation object class
        $geo_instance  = new WC_Geolocation();
        // Get geolocated user geo data.
        $user_geodata = $geo_instance->geolocate_ip();
        // Get current user GeoIP Country
        $country = $user_geodata['country'];
    }
    return $country !== 'GB' ? '' : $price;
}

Это работает, как и ожидалось, однакокогда я пытаюсь редактировать свои продукты в административной области, я получаю эту ошибку в столбце цены каждого продукта:

Неустранимая ошибка: ошибка Uncaught: вызов функции-члена get_billing_country () onnull в /var/sites/o/oxfordriderwear.com/public_html/wp-content/themes/storefront/functions.php:61 Трассировка стека: # 0 /var/sites/o/oxfordriderwear.com/public_html/wp-include/class-wp-hook.php (286): country_geolocated_based_hide_price ('apply_filters (' get_price_html () # 4 /var/sites/o/oxfordriderwear.com/public_html/wp-content/plugins/woocommerce/includes/admin/list)/abstract-class-wc-admin-list-table.php(261): WC в /var/sites/o/oxfordriderwear.com/public_html/wp-content/themes/storefront/functions.php в строке 61

Что-то не так в коде, который яsed, или что-то, что мне нужно добавить, чтобы исправить эту проблему, чтобы моя область администратора отображалась как обычно?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Чтобы избежать этой проблемы, мы можем вернуть отформатированную цену на бэкэнд следующим образом:

add_filter( 'woocommerce_get_price_html', 'country_geolocated_based_hide_price', 10, 2 );
function country_geolocated_based_hide_price( $price, $product ) {
    // Not on backend
    if( is_admin() ) 
        return $price;

    if( get_current_user_id() > 0 ) {
        $country = WC()->customer->get_billing_country();
    } else {
        // Get an instance of the WC_Geolocation object class
        $geo_instance  = new WC_Geolocation();
        // Get geolocated user geo data.
        $user_geodata = $geo_instance->geolocate_ip();
        // Get current user GeoIP Country
        $country = $user_geodata['country'];
    }
    return $country !== 'GB' ? '' : $price;
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы).Протестировано и работает.

Больше ошибок нет.

0 голосов
/ 28 февраля 2019
add_filter( 'woocommerce_get_price_html', 'country_geolocated_based_hide_price', 10, 2 );
function country_geolocated_based_hide_price( $price, $product ) {
    if( get_current_user_id() > 0 ) {
        $customer = WC_Customer(get_current_user_id());
        $country = $customer->get_billing_country();
    } else {
        // Get an instance of the WC_Geolocation object class
        $geo_instance  = new WC_Geolocation();
        // Get geolocated user geo data.
        $user_geodata = $geo_instance->geolocate_ip();
        // Get current user GeoIP Country
        $country = $user_geodata['country'];
    }
    return $country !== 'GB' ? '' : $price;
}
...