Полностью скрыть продукты от неавторизованных пользователей в WooCommerce - PullRequest
1 голос
/ 26 мая 2019

Я пытаюсь полностью удалить продукт / продукты у пользователей, которые не вошли в систему, и если пользователь не имеет определенной роли (например, проверенный покупатель).

Мне удалось создать новую роль с именем Проверенный покупатель, используя приведенный ниже код;

add_role(
    'verified_buyer',
    __( 'Verified Buyer', 'text-domain' ),
    array(
       'read'         => true,  
        'edit_posts'   => false,
    )
);
//This Role is same role capability as the WooCommerce Customer role

и я также добавил флажок на странице WooCommerce Add New Product, используя код ниже

function hide_product_from_unathorised_users() {
  $args = array(
    'id' => '_hide_from_unauthorize_users',
    'label' => 'Hide Product from unauthorized users',
    'desc_tip' => true,
    'description' => __('Check this to hide this product from unauthorized users', 'text-domain')
  );
  woocommerce_wp_checkbox( $args );
}

add_action( 'woocommerce_product_options_advanced', 'hide_product_from_unathorised_users' );

// Save Fields
function product_custom_fields_save($post_id){
    // Custom Product Text Field
    $hide_product_unathorised_users = isset( $_POST['_hide_from_unauthorize_users'] ) ? 'yes' : 'no';
        update_post_meta($post_id, '_hide_from_unauthorize_users', esc_attr( $hide_product_unathorised_users ));
}
add_action('woocommerce_process_product_meta', 'product_custom_fields_save');

Теперь, когда у меня есть эти две опции (роль пользователя и флажок, чтобы узнать, какой продукт скрыть) ... Я хочу скрыть такой продукт, если выполнены следующие условия;

ЗАКРЫТЬ ПРОДУКТ ПОЛНОСТЬЮ (даже из поисковых запросов) ЕСЛИ
1. Флажок установлен на продукте, а пользователь не авторизован
2. Флажок установлен для продукта и пользователь вошел в систему и не проверен Покупатель или администратор Роль

Как это

function hide_product_completely_conditionally() {

global $post;

$hide_product_checkbox = get_post_meta( $post->ID, '_hide_from_unauthorize_users', true )

$user = wp_get_current_user();
$authorized_user_role = in_array( 'verified_buyer', (array) $user->roles );
$admin_role = in_array( 'administrator', (array) $user->roles );

    if ( ($hide_product_checkbox == 'yes' && !is_user_loggedin()) || ($hide_product_checkbox == 'yes' && is_user_loggedin() && (!$authorized_user_role || !$admin_role) ) ) {

     //(...) HIDE SUCH PRODUCT COMPLETELY CODE THAT I'M NOT SURE HOW TO WRITE

    }
}

Спасибо за вашу помощь заранее.

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Следующий код будет фильтровать продукты на основе настраиваемого вами поля продукта, когда пользователям не разрешено (и перенаправит их на страницу магазина, если они попытаются получить доступ к защищенному продукту вручную) .

// Conditional function checking for authorized users
function is_authorized_user(){
    if ( is_user_logged_in() ) {
        $user = wp_get_current_user();
        $caps = $user->allcaps;

        if ( ( isset($caps['edit_product']) && $caps['edit_product'] )
        || in_array( 'verified_buyer', $user->roles ) ) return true;
    }
    else return false;
}

// Filter product query (and search) from unauthorized users
add_filter( 'woocommerce_product_query_meta_query', 'only_authorized_users_meta_query', 10, 2 );
function only_authorized_users_meta_query( $meta_query, $query ) {
    // Hide specific products from unauthorized users
    if( ! is_authorized_user() && ! is_admin() ) {
        $meta_query['relation'] = 'OR';
        $meta_query[] = array(
            'key'     => '_hide_from_unauthorize_users',
            'value'   => 'no',
            'compare' => '='
        );
        $meta_query[] = array(
            'key'     => '_hide_from_unauthorize_users',
            'compare' => 'NOT EXISTS'
        );
    }
    return $meta_query;
}

// Security: Redirect unauthorized users if accessing prodtected products
add_action( 'template_redirect', 'only_authorized_users_redirect' );
function only_authorized_users_redirect() {
    // Specific products redirect for unauthorized users (to be sure)
    if( is_product() && ! is_authorized_user()
    && get_post_meta( get_the_id(), '_hide_from_unauthorize_users', true ) === 'yes' ) {
        wp_safe_redirect( get_permalink( wc_get_page_id( 'shop' ) ) );
        exit;
    }
}

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


Вместо использования дополнительной роли пользователя вы можете:

1) Используйте булево свойство WC_Customer is_paying_customer, например:

 if( WC()->customer->get_is_paying_customer() ) {
     // Is a playing customer
 } else {
     // NOT a playing customer
 }

2) Или добавление пользовательской мета как:

 update_user_meta( get_current_user_id(), 'allowed_customer', '1' );

Затем вы проверите с помощью:

 if( get_user_meta( get_current_user_id(), 'allowed_customer', true ) ) {
     // Allowed customer
 } else {
     // NOT Allowed customer
 }
0 голосов
/ 26 мая 2019

Когда вы говорите «Удалить», я предполагаю, что вы на самом деле пытаетесь скрыть продукт.

Таким образом, вы можете использовать pre_get_posts action hook.

Приведенный ниже код скроет любой продукт, для которого в поле _hide_from_unauthorize_users установлено значение yes от пользователей.которые не зарегистрированы в и от пользователей, которые вошли в систему, но не являются verified_buyer или administrator.

Поместите фрагмент нижев вашем файле functions.php обратите внимание на комментарии:

<?php

/**
 * @param WP_Query $query
 */
function _hide_products_from_certain_users( $query ) {
    if ( is_admin() ) {
        return;
    }

    /**
     * Create the query which will make sure only products that are allowed to bee seen will show up.
     */
    $meta_query[] = array(
        'key'     => '_hide_from_unauthorize_users',
        'value'   => 'yes',
        'compare' => '!=',
    );

    $user = wp_get_current_user();

    // If user is not logged in.
    if ( ! is_user_logged_in() ) {
        $query->set( 'meta_query', $meta_query );
    } else {
        $authorized_user_role = in_array( 'verified_buyer', (array) $user->roles );
        $admin_role           = in_array( 'administrator', (array) $user->roles );

        // If the current user is not a verified_buyer nor an administrator.
        if ( ! $authorized_user_role && ! $admin_role ) {
            $query->set( 'meta_query', $meta_query );
        }
    }
}

add_action( 'pre_get_posts', '_hide_products_from_certain_users' );

Кстати, у вас в коде было несколько синтаксических ошибок, я их исправил.

...