Вывод массива мета-значений терминов в пользовательской вкладке WooCommerce?

Вопрос или проблема

Простите меня – мои навыки в WordPress/PHP на удивление примитивны, поэтому я могу не использовать правильную терминологию.

Я добавил пользовательскую вкладку на страницу отдельного товара WooCommerce и мне нужно, чтобы она отображала количество (иногда одно, иногда несколько) значений метаданных терминов, связанных с пользовательской таксономией ‘book-author’. Эти значения создаются в редакторе WYSIWYG и содержат HTML-форматирование. У каждого ‘book-author’ есть биография автора (метаданная термина ‘wpcf-author-biography’), и у каждого продукта WooCommerce есть один или несколько ‘book-authors’.

Вот код, который я в настоящее время использую:

// Добавить вкладку биографии автора

add_filter( 'woocommerce_product_tabs', 'woo_new_product_tab' );
function woo_new_product_tab( $tabs ) {

// Добавляет новую вкладку

$tabs['author_tab'] = array(
    'title'     => __( 'О авторе', 'woocommerce' ),
    'priority'  => 50,
    'callback'  => 'woo_new_product_tab_content'
);

return $tabs;

}

// Добавить содержимое

function woo_new_product_tab_content() {

$terms = get_the_terms(get_the_ID(), 'book-author' );
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
foreach ( $terms as $term ) {
    $all_term_meta = get_term_meta($term->term_id, 'wpcf-author-biography', false);
    print_r($all_term_meta);
}
}   
}

Мне потребовалось вечность, чтобы добраться до этой точки, и хотя соответствующие данные наконец выводятся, результат на фронтенде оставляет желать лучшего. Вот как это получается:

<div class="woocommerce-Tabs-panel woocommerce-Tabs-panel--author_tab panel 
entry-content wc-tab" id="tab-author_tab" role="tabpanel" aria-
labelledby="tab-title-author_tab" style="display: block;">
            Массив
(
[0] => XX штатный писатель&nbsp;<strong>Джон Доу</strong>&nbsp;освещал 
всё, от мужского&nbsp;стиля и ухода до еды, напитков и путешествий. Джон 
также взял интервью у&nbsp;некоторых из самых известных имен в кино, телевидении и 
музыке.
)
Массив
(
[0] => <div class="woocommerce-tabs wc-tabs-wrapper">
<div id="tab-test_tab" class="woocommerce-Tabs-panel woocommerce-Tabs-panel--
test_tab panel entry-content wc-tab" style="display: none;">

<strong>Джейн Доу&nbsp;</strong>является автором и университетским 
лектором&nbsp;по подводному плетению корзин. Она недавно завершила защиту докторской диссертации.

</div>
</div>
)
        </div>

Хотя вкладка сама по себе создаётся без каких-либо проблем, как вы можете видеть, я получаю несколько непорядочных Массивов, а также другую ерунду, и второе значение метаданных термина по каким-то причинам застревает в своем собственном скрытом обёртке вкладки, когда оно должно появиться в той же вкладке.

Очевидно, я делаю это неверно, иначе я бы не оказался здесь, поэтому любая помощь или направление в нужную сторону будет очень ценным.

Дополнительно, если есть возможность реализовать условие так, чтобы, если у продукта нет ‘book-author’, вкладка ‘О авторе’ не появлялась, это было бы очень полезно…

Спасибо заранее!

Редактировать: Основываясь на совете от WebElaine, я попытался использовать foreach вместо print_r:

function woo_new_product_tab_content() {

$terms = get_the_terms(get_the_ID(), 'book-author' );
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
foreach ( $terms as $term ) {
    $all_term_meta = get_term_meta($term->term_id, 'wpcf-author-biography', 
false);     
    foreach($all_term_meta as $meta) {
        echo $meta[0]; // пытался также с return, без успеха
}
}
}
}

Это даёт следующие результаты:

<div class="woocommerce-Tabs-panel woocommerce-Tabs-panel--author_tab panel 
entry-content wc-tab" id="tab-author_tab" role="tabpanel" aria-
labelledby="tab-title-author_tab" style="display: block;">
            G&lt;           </div>

Если я убираю [0] после $meta, нам удаётся избавиться от некрасивых символов и сбившегося Массива, но у меня всё ещё есть проблема с тем, что информация о втором авторе теряется:

<div class="woocommerce-Tabs-panel woocommerce-Tabs-panel--author_tab panel 
entry-content wc-tab" id="tab-author_tab" role="tabpanel" aria-
labelledby="tab-title-author_tab" style="display: block;">

        XX штатный писатель&nbsp;<strong>Джон Доу</strong>&nbsp;освещал 
всё, от мужского&nbsp;стиля и ухода до еды, напитков и путешествий. Джон 
также взял интервью у&nbsp;некоторых из самых известных имен в кино, телевидении и 
музыке.

<div class="woocommerce-tabs wc-tabs-wrapper">
<div id="tab-test_tab" class="woocommerce-Tabs-panel woocommerce-Tabs-panel--
test_tab panel entry-content wc-tab" style="display: none;">

<strong>Джейн Доу&nbsp;</strong>является автором и университетским лектором&nbsp;по 
подводному плетению корзин. Она недавно завершила защиту докторской диссертации.

</div>
</div>          </div> 

Для отображения контента авторов вместо print_r($all_term_meta); попробуйте foreach:

foreach($all_term_meta as $meta) {
    return $meta[0];
}

Возможно, вам нужно будет использовать “echo” вместо “return”, но сначала попробуйте “return”.

Чтобы контролировать, появляется ли вкладка автора, обновите вашу функцию woo_new_product_tab с тем же условием:

function woo_new_product_tab( $tabs ) {
    $terms = get_the_terms(get_the_ID(), 'book-author' );
    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
        // Добавляет новую вкладку
        $tabs['author_tab'] = array(
            'title'     => __( 'О авторе', 'woocommerce' ),
            'priority'  => 50,
            'callback'  => 'woo_new_product_tab_content'
        );
    }
    return $tabs;
}

Благодаря WebElaine мне удалось найти решение проблемы скрытой вкладки:

function woo_new_product_tab_content() {

$terms = get_the_terms(get_the_ID(), 'book-author' );
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
    foreach ( $terms as $term ) {
        $all_term_meta = get_term_meta($term->term_id, 'wpcf-author-
biography', false);     
        foreach($all_term_meta as $meta) {
            echo '<p>' . strip_tags($meta, '<strong><p><br>') . '</p>';
    }
   }
  }
}

Это выводит следующий удовлетворительный HTML:

<div class="woocommerce-Tabs-panel woocommerce-Tabs-panel--author_tab panel 
entry-content wc-tab" id="tab-author_tab" role="tabpanel" aria-
labelledby="tab-title-author_tab" style="display: block;">

   <p>XX штатный писатель&nbsp;<strong>Джон Доу</strong>&nbsp;освещал 
   всё, от мужского&nbsp;стиля и ухода до еды, напитков и 
   путешествий. Джон также взял интервью у&nbsp;некоторых из самых известных имен в кино, 
   телевидении и музыке.</p>

   <p><strong>Джейн Доу&nbsp;</strong>является автором и университетским 
   лектором&nbsp;по подводному плетению корзин. Она недавно завершила защиту докторской работы.</p>         

</div>

Ответ или решение

Для вывода массива мета-значений термина в пользовательской вкладке WooCommerce, нужно учитывать несколько моментов, чтобы информация отображалась корректно и без лишних элементов. Мы разберёмся, как реализовать вашу задачу, используя предоставленный вами код в качестве основы.

Шаг 1: Создание вкладки

Первым делом, давайте убедимся, что вкладка действительно отображается только тогда, когда существуют авторы для продукта. Это поможет избежать появления пустой вкладки.

// Добавление вкладки о авторе
add_filter('woocommerce_product_tabs', 'woo_new_product_tab');
function woo_new_product_tab($tabs) {
    $terms = get_the_terms(get_the_ID(), 'book-author');
    // Проверяем наличие термина и ошибки
    if (!empty($terms) && !is_wp_error($terms)) {
        // Добавляем новую вкладку
        $tabs['author_tab'] = array(
            'title'    => __('О авторе', 'woocommerce'),
            'priority' => 50,
            'callback' => 'woo_new_product_tab_content'
        );
    }
    return $tabs;
}

Шаг 2: Вывод контента вкладки

Теперь давайте добавим функцию, которая будет обрабатывать отображение информации о каждом авторе. Вместо использования print_r вы можете использовать echo для вывода содержимого.

// Контент вкладки о авторе
function woo_new_product_tab_content() {
    $terms = get_the_terms(get_the_ID(), 'book-author');
    if (!empty($terms) && !is_wp_error($terms)) {
        foreach ($terms as $term) {
            $all_term_meta = get_term_meta($term->term_id, 'wpcf-author-biography', false);
            foreach ($all_term_meta as $meta) {
                // Выводим мета-значение, очищая лишние теги
                echo '<p>' . wp_kses_post($meta) . '</p>';
            }
        }
    } else {
        echo '<p>' . __('Нет информации об авторах.', 'woocommerce') . '</p>';
    }
}

Важные замечания

  1. Использование wp_kses_post(): Эта функция обеспечивает безопасность, разрешая только безопасные HTML-теги, которые могут содержаться в тексте, который вы выводите. Это защитит вашу страницу от потенциальных XSS-атак.

  2. Условная логика для обработки отсутствия авторов: В случае, если у продукта нет авторов, вместо пустой вкладки отображается сообщение «Нет информации об авторах».

Шаг 3: Завершение и тестирование

После внедрения изменения, убедитесь, что вы протестировали вкладку на страницах продуктов с различным количеством авторов. Проверьте следующие сценарии:

  • Продукт с одним автором.
  • Продукт с несколькими авторами.
  • Продукт без авторов — вкладка не должна отображаться.

Заключение

Предложенное решение эффективно справляется с задачей вывода мета-значений авторов в WooCommerce. Оно не только решает вашу проблему, но и обеспечивает лучшую структуру и защиту вывода информации. Если у вас возникнут дополнительные вопросы или потребуется уточнение, не стесняйтесь обращаться за помощью!

Оцените материал
Добавить комментарий

Капча загружается...