Вопрос или проблема
Простите меня – мои навыки в 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 штатный писатель <strong>Джон Доу</strong> освещал
всё, от мужского стиля и ухода до еды, напитков и путешествий. Джон
также взял интервью у некоторых из самых известных имен в кино, телевидении и
музыке.
)
Массив
(
[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>Джейн Доу </strong>является автором и университетским
лектором по подводному плетению корзин. Она недавно завершила защиту докторской диссертации.
</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< </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 штатный писатель <strong>Джон Доу</strong> освещал
всё, от мужского стиля и ухода до еды, напитков и путешествий. Джон
также взял интервью у некоторых из самых известных имен в кино, телевидении и
музыке.
<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>Джейн Доу </strong>является автором и университетским лектором по
подводному плетению корзин. Она недавно завершила защиту докторской диссертации.
</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 штатный писатель <strong>Джон Доу</strong> освещал
всё, от мужского стиля и ухода до еды, напитков и
путешествий. Джон также взял интервью у некоторых из самых известных имен в кино,
телевидении и музыке.</p>
<p><strong>Джейн Доу </strong>является автором и университетским
лектором по подводному плетению корзин. Она недавно завершила защиту докторской работы.</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>';
}
}
Важные замечания
-
Использование
wp_kses_post()
: Эта функция обеспечивает безопасность, разрешая только безопасные HTML-теги, которые могут содержаться в тексте, который вы выводите. Это защитит вашу страницу от потенциальных XSS-атак. -
Условная логика для обработки отсутствия авторов: В случае, если у продукта нет авторов, вместо пустой вкладки отображается сообщение «Нет информации об авторах».
Шаг 3: Завершение и тестирование
После внедрения изменения, убедитесь, что вы протестировали вкладку на страницах продуктов с различным количеством авторов. Проверьте следующие сценарии:
- Продукт с одним автором.
- Продукт с несколькими авторами.
- Продукт без авторов — вкладка не должна отображаться.
Заключение
Предложенное решение эффективно справляется с задачей вывода мета-значений авторов в WooCommerce. Оно не только решает вашу проблему, но и обеспечивает лучшую структуру и защиту вывода информации. Если у вас возникнут дополнительные вопросы или потребуется уточнение, не стесняйтесь обращаться за помощью!