Динамическое изменение цены продукта на основе покупок, связанных с пользователем, в Woocommerce

Когда я добавил этот $product->get_id(), у меня появился HTTP Error 500 и получил это сообщение в журнале ошибок:

[13-Mar-2018 08:47:07 UTC] PHP Fatal error: Call to a member function get_id() on null in /home/healthnwellness/public_html/wp-content/themes/betheme-child/functions.php on line 926

Моя функция находится в functions.php:

//Function return price (commission based)  as per their purchase count 
function return_custom_price($price, $product) {
    global $product;
    $current_user = wp_get_current_user();

    $count_purchase = wc_product_sold_count();

    if ( wc_customer_bought_product( $current_user->user_email, $current_user->ID, $product->get_id() )  )
    {

        if ($count_purchase == 1){
            $price = get_post_meta( $product->get_id(), '_comm_1_kit');
            $post_id =  $product->get_id();

            $price = ($price[0]);
            return $price;
        }
        elseif ($count_purchase == 2){
            $price = get_post_meta( $product->get_id(), '_comm_2_kit');
            $post_id =  $product->get_id();

            $price = ($price[0]);
            return $price;
        }           
        elseif ($count_purchase >= 3){
            $price = get_post_meta($product->get_id(), '_comm_3_kit');
            $post_id = $product->get_id();

            $price = ($price[0]);
            return $price;
        }
    }
    else
    {
        $price = get_post_meta($product->get_id(), '_discounted_price');
        $post_id = $product->get_id();

        $price = ($price[0]);
        return $price;
    }
}

Как я могу решить эту ошибку? что я делаю не так?

Любая помощь приветствуется.

Примечание. Функция wc_product_sold_count() имеет значение из этого ответа и была изменена, чтобы возвращать только счетчик.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
117
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

$product->get_id() = $_SESSION["iddd"];

Это ошибочное задание. get_id() возвращает int, и вы пытаетесь установить его с другим значением.

Теперь он также появляется перед global $product;, поэтому он будет нулевым.

Я удалил это, как сейчас, пожалуйста, просмотрите и решите, спасибо

Mukhyyar 13.03.2018 10:46

Вы можете разместить свой крючок return_custom_price? потому что $ product не передается в эту функцию или имеет значение null

ikdekker 13.03.2018 12:17

'add_filter (' woocommerce_get_price ',' return_custom_price ', 10, 2);' вот крючок

Mukhyyar 13.03.2018 21:05

@Mukhyyar, что произойдет, если вы удалите global $product?, я не думаю, что это здесь, так как procuct передается в качестве аргумента

ikdekker 14.03.2018 12:08
Ответ принят как подходящий

В вашем коде есть некоторые недостающие части и много ошибок.

Вам нужно ласо внести изменения в функцию немного wc_product_sold_count()из этого ответа.

Так что попробуйте вместо этого:

function wc_product_sold_count_for_user( $product, $user_id ) {
    global $wpdb;

    $product_id = $product->get_id(); // Current Product ID

    // The SQL request
    return $wpdb->get_var( "
        SELECT SUM(woim2.meta_value)
        FROM {$wpdb->prefix}woocommerce_order_items AS woi
        INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta woim ON woi.order_item_id = woim.order_item_id
        INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta woim2 ON woi.order_item_id = woim2.order_item_id
        INNER JOIN {$wpdb->prefix}postmeta pm ON woi.order_id = pm.post_id
        INNER JOIN {$wpdb->prefix}posts AS p ON woi.order_id = p.ID
        WHERE woi.order_item_type LIKE 'line_item'
        AND p.post_type LIKE 'shop_order'
        AND p.post_status IN ('wc-completed','wc-processing')
        AND pm.meta_key = '_customer_user'
        AND pm.meta_value = '$user_id'
        AND woim.meta_key = '_product_id'
        AND woim.meta_value = '$product_id'
        AND woim2.meta_key = '_qty'
    ");
}

//Function return price (commission based)  as per their purchase count
add_filter('woocommerce_product_get_price','return_custom_price', 10, 2);
function return_custom_price( $price, $product ) {
    // If user is not logged in return the default price
    if ( ! is_user_logged_in() ) return $price;

    $customer = wp_get_current_user();
    $count_purchase = wc_product_sold_count_for_user( $product, $customer->ID );

    if ( wc_customer_bought_product( $customer->user_email, $customer->ID, $product->get_id() ) ){

        if ( $count_purchase == 1 )
            $price = get_post_meta( $product->get_id(), '_comm_1_kit', true );
        elseif ( $count_purchase == 2 )
            $price = get_post_meta( $product->get_id(), '_comm_2_kit', true );
        elseif ( $count_purchase >= 3 )
            $price = get_post_meta($product->get_id(), '_comm_3_kit', true );
    } else {
        $price = get_post_meta($product->get_id(), '_discounted_price', true );
    }
    return $price;
}

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

Другие вопросы по теме