Вопрос или проблема
У меня создано пользовательское поле для продуктов WooCommerce.
Я использую следующий код для его создания:
// ДОБАВИТЬ ПОЛЕ ДАННЫХ WOO
add_action('woocommerce_product_options_general_product_data', 'woocommerce_product_custom_fields');
// Сохранение полей
add_action('woocommerce_process_product_meta', 'woocommerce_product_custom_fields_save');
function woocommerce_product_custom_fields()
{
global $woocommerce, $post;
echo '<div class="product_custom_field">';
// Текстовое поле продукта
woocommerce_wp_text_input(array(
'id' => '_sales_email',
'placeholder' => '',
'label' => __('Ссылка на Email для продаж', 'woocommerce'),
'desc_tip' => 'true'
));
echo '</div>';
}
function woocommerce_product_custom_fields_save($post_id)
{
// Текстовое поле продукта
$woocommerce_custom_product_text_field = $_POST['_sales_email'];
if (!empty($woocommerce_custom_product_text_field))
update_post_meta($post_id, '_sales_email', esc_attr($woocommerce_custom_product_text_field));
}
Код работает хорошо и отображает данные на странице продукта.
Я отображаю данные через шорткод.
<div class="dbtn_sales"><a href="https://wordpress.stackexchange.com/questions/325532/mailto:[foobar name=_sales_email]">Email Sales</a></div>
Проблема, с которой я столкнулся, заключается в скрытии данных, если поле пустое..
Я пробовал:
if( get_field('_sales_email') )
{
//echo the_field('_sales_email');
}
else
{
echo "<style>.dbtn_sales{display:none !important;}</style>";
}
но я никуда не продвинулся… Может, кто-то подскажет, в каком направлении двигаться?
Если я не ошибаюсь, функция get_field()
входит в ACF, и такой функции нет встроенной в WP.
Исходя из вашего кода, не очевидно, что вы используете плагин ACF на своем сайте, поэтому есть вероятность, что он может не сработать.
Но, так как вы уже используете встроенную функцию WP для установки метаданных, то будет хорошей идеей использовать встроенную функцию WP для получения этого значения также.
Кроме того, я бы не скрывал эту кнопку с помощью CSS. Я бы изменил ваш код (часть, отвечающую за вывод кнопки) на этот:
<?php if ( get_post_meta(get_the_ID(), '_sales_email', true) ) : ?>
<div class="dbtn_sales"><a href="https://wordpress.stackexchange.com/questions/325532/mailto:[foobar name=_sales_email]">Email Sales</a></div>
<?php endif; ?>
Также… Если это значение приходит от пользовательского ввода, то будет хорошей идеей убедиться, что оно правильно экранировано:
<?php if ( get_post_meta(get_the_ID(), '_sales_email', true) ) : ?>
<div class="dbtn_sales"><a href="https://wordpress.stackexchange.com/questions/325532/mailto:<?php esc_attr( get_post_meta(get_the_ID(),"_sales_email', true) ); ?>">Email Sales</a></div>
<?php endif; ?>
Ответ или решение
Конечно! Давайте рассмотрим, как скрыть пользовательское поле WooCommerce, если оно пустое. Ваш код уже почти правильный, просто нужно внести некоторые изменения, чтобы использовать правильные функции и избежать ненужного скрытия элемента с помощью CSS.
Во-первых, используйте функцию get_post_meta()
для получения значения вашего пользовательского поля. Пример вашего кода с исправлениями будет выглядеть следующим образом:
<?php
// Проверяем, есть ли у продукта значение пользовательского поля
if ( get_post_meta(get_the_ID(), '_sales_email', true) ) :
// Если да, выводим кнопку
?>
<div class="dbtn_sales">
<a href="mailto:<?php esc_attr_e( get_post_meta(get_the_ID(), '_sales_email', true) ); ?>">Email Sales</a>
</div>
<?php
endif;
?>
Обратите внимание на следующие моменты:
-
Мы используем функцию
get_post_meta()
, чтобы получить значение поля_sales_email
. Если значение существует и не пустое, выводим весь HTML-код для кнопки. -
В атрибуте
href
для ссылкиmailto:
мы также используемesc_attr()
для безопасного отображения пользовательского поля. Это поможет избежать потенциальных проблем с безопасностью, например, инъекций.
Этот код проверяет, есть ли значение в пользовательском поле. Если значение не пустое, кнопка будет отображаться. Если пользовательское поле пустое, код просто не выводит HTML-код кнопки. Так можно избежать использования CSS для скрытия пустого элемента, что более эффективно и корректно с точки зрения семантики.
Таким образом, вы сможете динамически скрывать элемент на странице продукта в зависимости от наличия пользовательских данных.