Динамически изменяйте цену товара и название для конкретного товара в Woocommerce - PullRequest
1 голос
/ 02 октября 2019

В WooCommerce у меня есть конкретный продукт, цена которого установлена ​​на 0 (идентификатор продукта 2938) .

При добавлении этого товара в корзину через href="http://yourdomain.com/?add-to-cart=2938", яя пытаюсь установить цену динамически на основе пользовательского поста текущего пользователя (это довольно сложный расчет, основанный на том, какие посты создал пользователь, в противном случае я просто использовал бы группы / связки).

На основе " Изменить цены товаров в корзине в Woocommerce 3 " код ответа, вот что я получил:

add_action( 'woocommerce_before_calculate_totals', 'add_custom_price', 20, 1);
function add_custom_price( $cart ) {

    // ID of the product I've set up
    $product_id_to_change = 2938;

    $user_id = get_current_user_id();

    $studio_args = array(
        'post_type' => 'studio',
        'post_status' => 'published',
        'posts_per_page' => 1,
        'author' => $user_id
    );

    $studio_query = new WP_Query( $studio_args );

    foreach( $studio_query as $studio ) {
        $studio_listing_name = get_the_title();
        $studio_listing_option = get_post_meta( $studio->ID, 'wpcf-listing-option', true );
    }

    if ( $studio_listing_option = array( 1, 2 ) ) {
        $new_price = 180;
    } elseif ( $studio_listing_option = array( 3, 4 ) ) {
        $new_price = 345;
    } elseif ( $studio_listing_option = array( 5, 6, 7 ) ) {
        $new_price = 690;
    }

    $new_name = 'Payment for 2020 Listing: ' . $user_id . ' - ' . $studio_listing_name . ' - ' . 'Listing Option ' . $studio_listing_option;

    // This is necessary for WC 3.0+
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // Avoiding hook repetition (when using price calculations for example)
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // Loop through cart items
    foreach ( $cart->get_cart() as $item ) {
        $item['data']->set_price( $new_price );
        $item['data']->set_name( $new_name );
    }

}

Важно отметить, что у каждого пользователя может быть только 1 студия,Я думаю, что мой foreach и if ( $studio_listing_option = array( 1, 2 ) ) проверка неверны / возможно, могут быть сделаны лучше. Любые идеи о том, как я могу заставить его работать лучше?

Как я могу ограничить вычисление только идентификатором продукта 2938?

Кроме того, $studio_listing_name возвращает пустое значение, а $studio_listing_option возвращаетмассив. Могу ли я улучшить это, чтобы заставить его работать должным образом?

1 Ответ

1 голос
/ 02 октября 2019

Во-первых, трудно помочь, поскольку мы ничего не знаем о вашем пользовательском типе поста в «студии» и о том, как на нем устанавливаются данные для клиентов.

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

Я пытался угадать, как данные задаются в wpcf-listing-option метаданных для вашего studio пользовательского типа записи, и я предполагаю, что это число между 1 (один)и 7 (семь).

Также в вашем коде, когда вы перебираете $studio_query, для $studio_listing_name и $studio_listing_option вы всегда будете получать значения из последнегоэлемент из цикла ... так что в вашей логике что-то не так.

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

add_action( 'woocommerce_before_calculate_totals', 'customize_cart_item_details', 20, 1);
function customize_cart_item_details( $cart ) {

    // This is necessary for WC 3.0+
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // Avoiding hook repetition (when using price calculations for example)
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 || ! is_user_logged_in() )
        return;

    // ID of the product I've set up
    $defined_product_id = 2938;

    $customer_id = get_current_user_id();

    // Get "studio" custom post objects
    $studio_query = get_posts( array(
        'post_type' => 'studio',
        'post_status' => 'published',
        'posts_per_page' => 1,
        'author' => $customer_id
    ) );

    // Get the first "studio" post for the current user
    $studio = reset( $studio_query );

    $studio_name   = $studio->post_title;
    $studio_option = get_post_meta( $studio->ID, 'wpcf-listing-option', true );

    if ( in_array( $studio_option, array( 1, 2 ) ) ) {
        $new_price = 180;
    } elseif ( in_array( $studio_option, array( 3, 4 ) ) ) {
        $new_price = 345;
    } elseif ( in_array( $studio_option, array( 5, 6, 7 ) ) ) {
        $new_price = 690;
    }

    $new_name = sprintf( 
        __( "Payment for 2020 Listing: %s - %s - Listing Option %s", "woocommerce" ),
        $customer_id, $studio_name, $studio_option 
    );

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item ) {
        // Only for the defined product ID (or variation ID)
        if ( in_array( $defined_product_id, [ $cart_item['product_id'], $cart_item['variation_id'] ] ) ) {
            $cart_item['data']->set_price( $new_price );
            $cart_item['data']->set_name( $new_name );   
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...