@JivoyRoman

Как проверить содержимое полей ACF и не выводить вкладку (tabs) если пусто?

Здравствуйте!
Работаю с плагином ACF, сделано много полей. Есть группа полей для короткого описания товара и группа для большого.
Для некоторых товаров бывает ТОЛЬКО короткое и не будет полного.
Есть код проверки вкладок, если они пустые, то не выводится.
Вот код:
global $post; // обращаемся к глобальной переменной
 
if ($post->post_excerpt): // указываем условие
 
    $ Custom_tab_s = массив (
            = 'Custom_tab_s'> Массив (
                                'title' => __('Описание','woocommerce'),
                                'Приоритет' => 90,
                                'Обратного вызова' => 'description_product_tab_content'
                            )
                    );
    вернуться array_merge ($ custom_tab_s, $ Вкладки);
 
else: return $tabs; // оставляем табы без изменений если условие не соблюдено
ENDIF;
 
Условия при проверках
if ($post->post_excerpt): — есть ли краткое описание
if (get_post_meta($post->ID, ‘video_field’, true)): — заполнено ли пользовательское поле


А вот мой код, который сейчас работает в functions.php. Но выводит две вкладки, даже если они пустые:

add_filter( 'woocommerce_product_tabs', 'woo_new_product_tab' );
function woo_new_product_tab( $tabs ) {
   
    // Добавляем новую вкладку
   
    $tabs['korotkoe_opisanie_tab'] = array(
        'title'     => __( 'Короткое описание товара', 'woocommerce' ),
        'priority'  => 10,
        'callback'  => 'woo_new_product_tab_content_korotkoe'
    );
    $tabs['polnoe_opisanie_tab'] = array(
        'title'     => __( 'Все характеристики', 'woocommerce' ),
        'priority'  => 11,
        'callback'  => 'woo_new_product_tab_content_polnoe'
    );
    return $tabs;
 
}
function woo_new_product_tab_content_korotkoe() {
    $fields = get_fields();
        if( $fields ): ?>
        <?php foreach( $fields as $name => $value ):
        //if (strpos($name,'mini_')!==false){
            $field = get_field_object($name);
        if ($field['parent']==2581){
?>
            <?php if (!empty($field['value']) && $field['name']!=='mini_opisanie_vibor_vid_product'):?>
                <span style="font-family: courier new, courier, monospace; font-size: 14pt;"><strong><?php echo $field['label']; ?>:</strong> <?php echo $field['value'];  ?></span><br>
            <?php endif;
        }
        ?>
        <?php endforeach; ?>
<?php endif;
}
function woo_new_product_tab_content_polnoe() {
    $fields = get_fields();
        if( $fields ): ?>
        <?php foreach( $fields as $name => $value ):
        //if (strpos($name,'full_')!==false){
            $field = get_field_object($name);
        if ($field['parent']==14){
?>
            <?php if (!empty($field['value']) && $field['name']!=='full_opisanie_vibor_vid_product'):?>
                <span style="font-family: courier new, courier, monospace; font-size: 14pt;"><strong><?php echo $field['label']; ?>:</strong> <?php echo $field['value'];  ?></span><br>
            <?php endif;
        }
        ?>
        <?php endforeach; ?>
<?php endif;
}


Как проверить содержимое полей ACF и не выводить вкладку (tabs) если пусто?
  • Вопрос задан
  • 1309 просмотров
Решения вопроса 1
@JivoyRoman Автор вопроса
Такой код убирает вкладки вообще. Даже если в них не пусто.
Для товара с коротким описанием
$fields = get_fields();
$flag=false;
if ( $fields ){
foreach( $fields as $name => $value )
{
if ($field['parent']==2581 && !empty($field['value']) && $field['name']!=='mini_opisanie_vibor_vid_product')
{
$flag=true;break;
}
}
}
if ($flag)
{
$tabs['korotkoe_opisanie_tab'] = array(
        'title'     => __( 'Короткое описание товара', 'woocommerce' ),
        'priority'  => 10,
        'callback'  => 'woo_new_product_tab_content_korotkoe'
    );
}

И дублирую код для товара с полным описанием почти тоже самое:
$fields = get_fields();
$flag=false;
if ( $fields ){
foreach( $fields as $name => $value )
{
if ($field['parent']==14 && !empty($field['value']) && $field['name']!=='full_opisanie_vibor_vid_product')
{
$flag=true;break;
}
}
}
if ($flag)
{
$tabs['polnoe_opisanie_tab'] = array(
        'title'     => __( 'Полное описание товара', 'woocommerce' ),
        'priority'  => 11,
        'callback'  => 'woo_new_product_tab_content_polnoe'
    );
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Aricus
if ($fieldValue = get_field('field-name', get_the_ID())) {
	// Поле заполнено
} else {
	// Поле пустое
}
Ответ написан
Starck43
@Starck43
Full-stack разработчик (Python, React)
Чтобы дважды не делать запрос к БД лучше передать полученные данные из ACF в переменную 'content' в массиве аргумента $tabs (в примере это $tabs['additional_information']) и выводить в callback функции:

<?php
add_filter( 'woocommerce_product_tabs', 'woo_config_product_tabs', 98 );
function woo_config_product_tabs( $tabs ) {

	if ( $technical_info = get_field('technical_info') ) {
		$tabs['additional_information'] = array(
			'title' =>  'Техническая информация',
			'priority' => 30,
			'callback' => 'additional_information_tab_content',
			'content' => $technical_info,
		);
	} else unset( $tabs['additional_information'] );

	return $tabs;
}

function additional_information_tab_content($tab_name, $tab) {
        echo $tab['content'];
}
?>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы