Пользовательские заполнители тем электронной почты для заказов WooCommerce, связанных с заказами

Woocommerce дает возможность добавлять заполнители к теме электронного письма. Я хотел бы расширить эту возможность, создав настраиваемый заполнитель, который извлекает информацию из надстроек продуктов и бронирований woocommerce для форм гравитации.

Я пробовал Создать дополнительные переменные / placeholder для темы уведомлений по электронной почте Woocommerce, вносящий некоторые изменения, чтобы проверить, смогу ли я заставить его работать. Кроме того, я попытался получить мета-поля woocommerce, но это тоже не сработало.

По этому коду я не могу получить бронирование, связанное с заказом:

// For woocommerce versions up to 3.2
add_filter( 'woocommerce_email_format_string' , 'filter_email_format_string', 20, 2 );
function filter_email_format_string( $string, $email ) {
    // Get the instance of the WC_Order object
    $booking = $get_order;

    // Additional wanted placeholders in the array (find / replace pairs)
    $additional_placeholders = array(
        '{custom_one}'      => $booking->get_start_date(),
    );

    // return the clean string with new replacements
    return str_replace( array_keys( $additional_placeholders ), array_values( $additional_placeholders ), $string );
}

person Exodus    schedule 02.08.2020    source источник
comment
что здесь в $ get_order ?? например, покажите var_dump $ get_order   -  person Anil    schedule 02.08.2020


Ответы (1)


Прежде всего, ваша основная проблема:

Как получить идентификатор (а) бронирования из заказа (Id)?

Поскольку в заказе может быть много заказов (элементов), вы можете получить идентификаторы бронирования, нацеленные на родительский элемент сообщения (который является идентификатором заказа), с помощью очень простого и легкого SQL-запроса. Использование WordPress _ 1_ Класс и доступные методы.

Затем вы сможете получить дату начала из одного бронирования этого заказа и установить ее в качестве настраиваемого заполнителя для темы уведомления по электронной почте:

// Custom function to get the booking Ids from an order Id (with an SQL query)
function wc_get_booking_ids( $order_id ){
    global $wpdb;

    return $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'wc_booking' AND post_parent =  %d", $order_id ) );
}

// For woocommerce versions up to 3.2
add_filter( 'woocommerce_email_format_string' , 'filter_email_format_string', 20, 2 );
function filter_email_format_string( $string, $email ) {
    if( ! is_a($email->object, 'WC_Order') ) return; // Exit

    $booking_ids = wc_get_booking_ids( $email->object->get_id() );

    if( ! empty($booking_ids) ) {
        // Get the instance of the WC_Booking object from one booking Id
        $booking = new WC_Booking( reset($booking_ids) );

        if( is_a($booking, 'WC_Booking') && method_exists($booking, 'get_start_date') ) {
            // Additional placeholders array (one by line)
            $custom_placeholders = array(
                '{start_date}' => $start_date = $booking->get_start_date(),
            );
            $string = str_replace( array_keys( $custom_placeholders ), array_values( $custom_placeholders ), $string );
        }
    }
    return $string;
}

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

person LoicTheAztec    schedule 02.08.2020
comment
Огромное спасибо! Я только что проверил это на своей стороне, и он работает на дату начала. У меня есть и другие требования, я пробовал их, используя приведенный выше код, но он не работал так же. Можно ли на это посмотреть? Я был бы счастлив заплатить вам за ваше время. - person Exodus; 03.08.2020