Как скрыть пустые вкладки woocommerce?

Ссылка скопирована
PHP
1 ответ

Здравствуйте!

Добавляю дополнительные вкладки в товары woocommerce через function.php. Дополнительные вкладки добавляются нормально (использую плагин acf), но хочу чтобы сами вкладки добавлялись только если в них есть содержимое. например, у некоторых товаров есть схема, но в большинстве товаров схемы не будет. Однако, вкладка с пустым содержимым отображается.

Заранее благодарен.

add_filter( 'woocommerce_product_tabs', 'woo_new_product_tab' ); function woo_new_product_tab( $tabs ) {   	// Adds the new tab   	$tabs['test_tab'] = array( 		'title' 	=> __( 'Схема', 'woocommerce' ), 		'priority' 	=> 50, 		'callback' 	=> 'woo_new_product_tab_content' 	);   	return $tabs;   } function woo_new_product_tab_content() {   	// The new tab content   	echo '<h2>Схема</h2>'; 	echo '<p>Привет</p>'; 	echo the_field('shema');   }

add_filter( 'woocommerce_product_tabs', 'woo_new_product_tab' ); function woo_new_product_tab( $tabs ) { // Adds the new tab $tabs['test_tab'] = array( 'title' => __( 'Схема', 'woocommerce' ), 'priority' => 50, 'callback' => 'woo_new_product_tab_content' ); return $tabs; } function woo_new_product_tab_content() { // The new tab content echo '<h2>Схема</h2>'; echo '<p>Привет</p>'; echo the_field('shema'); }

Дополнительно:

Как скрыть пустые вкладки woocommerce?

Дмитрий @pro100taa Автор вопроса Сделал такие правки в коде. Пока все работает.

add_filter( 'woocommerce_product_tabs', 'woo_new_product_tab' ); function woo_new_product_tab( $tabs ) {   	// Adds the new tab  if( get_field('shema') ) { 	  	$tabs['test_tab'] = array( 		'title' 	=> __( 'Схема', 'woocommerce' ), 		'priority' 	=> 50, 		'callback' 	=> 'woo_new_product_tab_content' 	);  	  	return $tabs;  	} else {  	  	 $tabs['test_tab'] = array( 		'title' 	=> __( '' ), 		'priority' 	=> 50, 		'callback' 	=> 'woo_new_product_tab_content' 	);  	 return $tabs;   } 	   } function woo_new_product_tab_content() {  	 	echo '<img src="' . get_field('shema') . '"/>';   }

add_filter( 'woocommerce_product_tabs', 'woo_new_product_tab' ); function woo_new_product_tab( $tabs ) { // Adds the new tab if( get_field('shema') ) { $tabs['test_tab'] = array( 'title' => __( 'Схема', 'woocommerce' ), 'priority' => 50, 'callback' => 'woo_new_product_tab_content' ); return $tabs; } else { $tabs['test_tab'] = array( 'title' => __( '' ), 'priority' => 50, 'callback' => 'woo_new_product_tab_content' ); return $tabs; } } function woo_new_product_tab_content() { echo '<img src="' . get_field('shema') . '"/>'; }

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Игорь Волков Ответ

Пустую вкладку WooCommerce нужно не прятать пустым заголовком, а вообще не добавлять в массив вкладок. В вашем исправленном варианте ветка else все равно создает вкладку test_tab, только с пустым title. Это плохой вариант: тема или скрипты WooCommerce могут оставить пустой пункт, лишнюю разметку, отступы или нарушить порядок вкладок. Правильная проверка должна стоять до добавления вкладки. Если поле ACF shema пустое, функция просто возвращает исходный массив $tabs без изменений.

Еще один важный момент: для проверки значения используйте get_field, а не the_field. Функция the_field сразу выводит значение на экран и не предназначена для условий или сборки HTML. Для условия, обработки и безопасного вывода нужна get_field. Также желательно передавать ID текущего товара, чтобы ACF точно взял поле у нужного product, а не из случайного глобального контекста.

Базовый вариант для functions.php дочерней темы:

add_filter('woocommerce_product_tabs', 'site_add_schema_product_tab');
 
function site_add_schema_product_tab($tabs) {
    if (!function_exists('get_field')) {
        return $tabs;
    }
 
    $product_id = get_the_ID();
    $schema = get_field('shema', $product_id);
 
    if (empty($schema)) {
        return $tabs;
    }
 
    $tabs['schema_tab'] = array(
        'title'    => __('Схема', 'woocommerce'),
        'priority' => 50,
        'callback' => 'site_schema_product_tab_content',
    );
 
    return $tabs;
}
 
function site_schema_product_tab_content() {
    if (!function_exists('get_field')) {
        return;
    }
 
    $schema = get_field('shema', get_the_ID());
 
    if (empty($schema)) {
        return;
    }
 
    echo '<h2>Схема</h2>';
 
    if (is_array($schema) && !empty($schema['url'])) {
        echo '<img src="' . esc_url($schema['url']) . '" alt="' . esc_attr($schema['alt'] ?? '') . '">';
        return;
    }
 
    if (is_numeric($schema)) {
        echo wp_get_attachment_image((int) $schema, 'full');
        return;
    }
 
    echo '<img src="' . esc_url($schema) . '" alt="">';
}

add_filter('woocommerce_product_tabs', 'site_add_schema_product_tab'); function site_add_schema_product_tab($tabs) { if (!function_exists('get_field')) { return $tabs; } $product_id = get_the_ID(); $schema = get_field('shema', $product_id); if (empty($schema)) { return $tabs; } $tabs['schema_tab'] = array( 'title' => __('Схема', 'woocommerce'), 'priority' => 50, 'callback' => 'site_schema_product_tab_content', ); return $tabs; } function site_schema_product_tab_content() { if (!function_exists('get_field')) { return; } $schema = get_field('shema', get_the_ID()); if (empty($schema)) { return; } echo '<h2>Схема</h2>'; if (is_array($schema) && !empty($schema['url'])) { echo '<img src="' . esc_url($schema['url']) . '" alt="' . esc_attr($schema['alt'] ?? '') . '">'; return; } if (is_numeric($schema)) { echo wp_get_attachment_image((int) $schema, 'full'); return; } echo '<img src="' . esc_url($schema) . '" alt="">'; }

Какой именно вывод использовать, зависит от настройки поля ACF. Если поле изображения возвращает URL, последняя строка с esc_url подойдет. Если поле возвращает массив, нужно брать schema['url'] и желательно schema['alt']. Если поле возвращает ID вложения, правильнее использовать wp_get_attachment_image, потому что WordPress сам подставит src, размеры, alt и srcset. Проверьте настройку Return Format у поля shema в ACF и оставьте в коде только нужную ветку, чтобы не держать лишнюю универсальность.

  • Не создавайте вкладку с пустым названием, просто не добавляйте ее в $tabs.
  • Проверку empty($schema) делайте до объявления $tabs['schema_tab'].
  • Для получения значения ACF используйте get_field, не the_field.
  • Вывод изображения экранируйте через esc_url, esc_attr или wp_get_attachment_image.
  • Если код добавлен в functions.php основной темы, лучше перенести его в дочернюю тему, чтобы правка не пропала при обновлении.
Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно