Изменить кнопку «добавить в корзину» для приобретенных продуктов в Woocommerce - PullRequest
0 голосов
/ 16 сентября 2018

Я бы хотел сделать следующее:

Покупатель покупает товар. Вместо «добавить в корзину» будет отображаться «Просмотреть цифровой продукт» и иметь пользовательскую ссылку на определенную страницу.

Я искал в базе данных WooCommerce и пытался выяснить, как узнать, что предмет уже куплен, чтобы я мог выяснить, как заставить функцию делать это автоматически:

ВЫБРАТЬ * ОТ wp_woocommerce_payment_tokens

token_id    gateway_id  token   user_id     type    is_default 

ВЫБРАТЬ * ИЗ wp_woocommerce_order_items

order_item_id   order_item_name     order_item_type     order_id 

Но я пока не мог понять их логику или правильную функцию в WordPress.

Единственная функция, которую я мог найти в Интернете, - это перенаправления, но это верно только при покупке предмета, но не при возврате на страницу, где вы уже купили предмет:

add_action( 'template_redirect', 'wc_custom_redirect_after_purchase' );
function wc_custom_redirect_after_purchase() {
   global $wp;

   if ( is_checkout() && ! empty( $wp->query_vars['order-received'] ) ) {
        wp_redirect( get_permalink( get_page_by_title( "About" )->ID ) );
        exit;
    }
} 

Пожалуйста, ведите меня в правильном направлении.

1 Ответ

0 голосов
/ 17 сентября 2018

Следующие функции будут проверять, купил ли клиент продукт, и если это так, кнопка добавления в корзину будет заменена пользовательской кнопкой «Просмотреть цифровой продукт» на странице «О нас».

Первый код функции сделан из wc_customer_bought_product() исходного кода, более легким способом . Код будет проверять только зарегистрированных пользователей, а для незарегистрированных - false.

function has_bought_item( $product_id ) {
    global $wpdb;

    if( ! is_user_logged_in() )
        return false;

    $customer_id = get_current_user_id();
    $statuses      = array_map( 'esc_sql', wc_get_is_paid_statuses() );

    // Count the number of products
    $count_query = $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 IN ( 'wc-" . implode( "','wc-", $statuses ) . "' )
        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 true boolean value if count is higher than 0, if not false
    return $count_query > 0 ? true : false;
}

// Shop and archives - Replace add to cart ajax button to a custom linked button
add_filter( 'woocommerce_loop_add_to_cart_link', 'replace_loop_add_to_cart', 20, 2 );
function replace_loop_add_to_cart( $html, $product ) {
    if( has_bought_item( $product->get_id() ) ) {
        $page = get_page_by_title( "About" );
        if ( ! is_object($page) )
            return $html;
        $link = get_permalink( $page->ID );
        $text = __("See Digital Product", "woocommerce");
        $html = '<a href="' . $link . '" class="button alt add_to_cart_button">' . $text . '</a>';
    }
    return $html;
}

// Single products: Replacing the button add to cart by a custom button on single product pages
add_action( 'woocommerce_single_product_summary', 'replace_single_add_to_cart_button', 1 );
function replace_single_add_to_cart_button() {
    global $product;

    if( has_bought_item( $product->get_id() ) && get_page_by_title( "About" ) ) {
        // For variable product types (keeping attribute select fields)
        if( $product->is_type( 'variable' ) ) {
            remove_action( 'woocommerce_single_variation', 'woocommerce_single_variation_add_to_cart_button', 20 );
            add_action( 'woocommerce_single_product_summary', 'custom_single_add_to_cart_button', 20 );
        }
        // For all other product types
        else {
            remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
            add_action( 'woocommerce_single_product_summary', 'custom_single_add_to_cart_button', 30 );
        }
    }
}

// Utility function: displays a custom  button replacement
function custom_single_add_to_cart_button() {
    $page = get_page_by_title( "About" );
    if ( ! is_object($page) )
        return;
    $link = get_permalink( $page->ID );
    $text = __("See Digital Product", "woocommerce");
    echo '<a href="' . $link . '" class="button alt add_to_cart_button">' . $text . '</a>';
}

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

на основании:

...