Замените название продукта пользовательским мета в загрузках электронной почты Woocommerce

Из-за того, что плагин Essential Grid просто передает названия продуктов в его заголовок лайтбокса, для отображения достаточного количества описаний продуктов я вынужден иметь более длинные заголовки для продуктов в моем магазине Woocommerce. Эти более длинные заголовки, в свою очередь, выводятся в электронном письме с заказом WooCommerce для клиента, включая теги HTML, как показано ниже.

Электронные письма с длинными заголовками, включая HTML-код

Я исправил это поведение в модальном окне мини-тележки, вызвав для каждого продукта настраиваемую мету simple_title для вывода, а не заголовок по умолчанию, как показано ниже в моем отредактированном mini-cart.php (*** указывает на мои единственные изменения)

<?php
        do_action( 'woocommerce_before_mini_cart_contents' );

        foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
            $_product     = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
            $product_id   = apply_filters( 'woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key );
            ***$meta_title = get_post_meta( $product_id, 'simple_title', true)***;

...

<?php echo str_replace( array( 'http:', 'https:' ), '', $thumbnail ) . ***$meta_title*** . '&nbsp;'; ?>

Теперь я хотел бы реализовать то же решение в WooCommerce email-downloads.php, чтобы исправить мои электронные письма Woocommerce, но я не могу заставить get_post_meta работать в foreach в этом файле. Может ли кто-нибудь поделиться правильным форматированием или где вставить это в приведенный ниже код?

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

<?php echo esc_html( $download['product_name'] ); ?>

- именно этот вывод нужно заменить отображением настраиваемой мета-информации simple_title продукта.

Большое спасибо за любые идеи.

<table class="td" cellspacing="0" cellpadding="6" style="width: 100%; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; margin-bottom: 40px;" border="1">
<thead>
    <tr>
        <?php foreach ( $columns as $column_id => $column_name ) : ?>
            <th class="td" scope="col" style="text-align:<?php echo $text_align; ?>;"><?php echo esc_html( $column_name ); ?></th>
        <?php endforeach; ?>
    </tr>
</thead>

<?php foreach ( $downloads as $download ) : ?>

    <tr>
        <?php foreach ( $columns as $column_id => $column_name ) : ?>
                <td class="td" style="text-align:<?php echo $text_align; ?>;"><?php
                if ( has_action( 'woocommerce_email_downloads_column_' . $column_id ) ) {
                    do_action( 'woocommerce_email_downloads_column_' . $column_id, $download );
                } else {
                    switch ( $column_id ) {
                        case 'download-product' : ?>
                            <?php echo esc_html( $download['product_name'] ); ?>
                            <?php
                        break;
                        case 'download-file' : ?>
                            <a href="<?php echo esc_url( $download['download_url'] ); ?>" class="woocommerce-MyAccount-downloads-file button alt"><?php echo esc_html( $download['download_name'] ); ?></a>
                            <?php
                        break;
                        case 'download-expires' : ?>
                            <?php if ( ! empty( $download['access_expires'] ) ) : ?>
                                <time datetime="<?php echo date( 'Y-m-d', strtotime( $download['access_expires'] ) ); ?>" title="<?php echo esc_attr( strtotime( $download['access_expires'] ) ); ?>"><?php echo date_i18n( get_option( 'date_format' ), strtotime( $download['access_expires'] ) ); ?></time>
                            <?php else : ?>
                                <?php _e( 'Never', 'woocommerce' ); ?>
                            <?php endif;
                        break;
                    }
                }
            ?></td>
        <?php endforeach; ?>
    </tr>
<?php endforeach; ?>
</table>

person daveisthemusic    schedule 30.03.2018    source источник


Ответы (2)


Возможны 2 способа:

1) Используя этот крючок фильтра:

add_filter( 'woocommerce_order_get_downloadable_items', 'custom_order_get_downloadable_items', 30, 2 );
function custom_order_get_downloadable_items( $downloads, $orders ){
    if( is_admin() )
        $downloads['product_name'] = get_post_meta( $downloads['product_id'], 'simple_title', true );

    return $downloads;
}

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


2) Замените шаблон напрямую через вашу тему и замените в emails/email-downloads.php файле:

<?php echo esc_html( $download['product_name'] ); ?> 

by:

<?php echo get_post_meta( $downloads['product_id'], 'simple_title', true ); ?>
person LoicTheAztec    schedule 30.03.2018
comment
Очень признателен за ввод, но, к сожалению, это не повлияло на электронные письма (все еще длинный заголовок). Я использую дочернюю тему и пробовал добавить ее в свой functions.php вместе с другими моими там фильтрами. - person daveisthemusic; 30.03.2018
comment
@daveisthemusic и если вы удалите if( is_admin() ), что произойдет - person LoicTheAztec; 30.03.2018
comment
К сожалению, он по-прежнему не работает через functions.php - однако ваше решение помогло мне исправить это через email-downloads.php следующим образом, так что я очень счастлив. Спасибо. ...else { switch ( $column_id ) { case 'download-product' : ?> <?php $meta_title = get_post_meta( $download['product_id'], 'simple_title', true ); echo esc_html( $meta_title ); ?> <?php break; case 'download-file' : ?> - person daveisthemusic; 30.03.2018
comment
@daveisthemusic Да, конечно, вы можете напрямую переопределить шаблон электронной почты, поскольку это те же данные в этом шаблоне электронной почты ... Но я действительно не понимаю, почему этот фильтр не работает, поскольку он находится в функции, расположенной в функции te, которая выводит данные в этот шаблон ... Я не могу его сейчас протестировать, правда, но сделаю это позже, чтобы найти правильный путь. - person LoicTheAztec; 30.03.2018

Я использовал решение от @loicTheAztec с небольшими изменениями

    add_filter( 'woocommerce_order_get_downloadable_items', 'custom_order_get_downloadable_items', 30, 2 );
function custom_order_get_downloadable_items( $downloads, $orders ){

  $new_download = array();
  foreach($downloads as $dl){
    $new_name = sprintf( __('New Name %s' , 'my_project') , $dl['product_name'] );
    $dl['download_name'] = $new_name;

    $new_download[] =  $dl;
  }
  return $new_download;
}
person Vincent Guesné    schedule 27.09.2019