Проверьте, написал ли покупатель отзыв о товаре в Woocommerce. - PullRequest
0 голосов
/ 29 октября 2018

Этот код проверит, вошел ли клиент в систему, купил ли он / она продукт, и если эти утверждения верны, на нем отобразится сообщение.

Я бы хотел включить еще одну проверку перед отображением сообщения, если клиент уже оставил отзыв / написал отзыв о продукте и, если это так, не показывать сообщение.

Другими словами, если покупатель не написал рецензию на товар, показать сообщение Если клиент оставил отзыв, не показывать сообщение.

Вот код:

add_action( 'woocommerce_before_single_product_summary', 'woo_review_discount_message');
function woo_review_discount_message() {
if ( is_user_logged_in() ) {
global $product;
$current_user = wp_get_current_user();
if ( wc_customer_bought_product( $current_user->user_email, $current_user->ID, $product->get_id() && $order->status->complete ) ) echo '<div class="user-bought"><span style="color:#CA364D;font-weight:bold;font-size:18px;"><i class="wishlist-icon icon-heart-o"></i></span> Hi ' . $current_user->first_name . '! Please write a review below.</a></div>';
}
}

Любая помощь в этом очень ценится.

1 Ответ

0 голосов
/ 29 октября 2018

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

// Utility function to check if a customer has posted a review in a product
function has_reviewed_product( $product_id ) {
    global $wpdb;

    $user = wp_get_current_user();

    if( $user->ID == 0 )
        return false;

    // Count the number of products
    $count = $wpdb->get_var( "
        SELECT COUNT(comment_ID) FROM {$wpdb->prefix}comments
        WHERE comment_post_ID = $product_id
        AND comment_author_email = '{$user->user_email}'
    " );

    return $count > 0 ? true : false;
}

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

Таким образом, в вашем коде (из этого ответа ) вы будете использовать его следующим образом:

// Utility function to check if a customer has bought a product (Order with "completed" status only)
function customer_has_bought_product( $product_id, $user_id = 0 ) {
    global $wpdb;
    $customer_id = $user_id == 0 || $user_id == '' ? get_current_user_id() : $user_id;
    $status      = 'wc-completed';

    if( ! $customer_id )
        return false;

    // Count the number of products
    $count = $wpdb->get_var( "
        SELECT COUNT(woim.meta_value) FROM {$wpdb->prefix}posts AS p
        INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
        INNER JOIN {$wpdb->prefix}woocommerce_order_items AS woi ON p.ID = woi.order_id
        INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS woim ON woi.order_item_id = woim.order_item_id
        WHERE p.post_status = '$status'
        AND pm.meta_key = '_customer_user'
        AND pm.meta_value = $customer_id
        AND woim.meta_key IN ( '_product_id', '_variation_id' )
        AND woim.meta_value = $product_id
    " );

    // Return a boolean value if count is higher than 0
    return $count > 0 ? true : false;
}

add_action( 'woocommerce_before_single_product_summary', 'woo_review_discount_message');
function woo_review_discount_message() {
    global $product;

    if ( customer_has_bought_product( $product->get_id() ) && ! $product->is_type('variable') && ! has_reviewed_product( $product->get_id() ) ) {
        $user = wp_get_current_user();
        echo '<div class="user-bought"><span style="color:#CA364D;font-weight:bold;font-size:18px;"><i class="wishlist-icon icon-heart-o"></i></span> Hi ' . $user->first_name . '! Please write a review below.</a></div>';
    }
}

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

Соответствующий ответ: Отображение пользовательского текста, если пользователь уже купил текущий продукт В Woocommerce

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...