У меня есть эта функция PHP для добавления запланированного баннера на мой сайт. Я хочу сделать его работоспособным с полями ACF.
Функция:
function holiday_site_banner() {
$from_time = new DateTime( 'get_field('banner_start_date')' );
$to_time = new DateTime( 'get_field('banner_end_date')' );
if ( new DateTime() > $from_time && new DateTime() < $to_time ) {
?><div class = "site-banner">
<span>
<strong style = "">ⓘ LET OP:</strong> <?php get_field('banner_message')?>
</span>
</div><?php
}
}
add_action( 'wp_footer', 'holiday_site_banner' );
Я пытался использовать get_field для реализации значений ACF в $from_time и $to_time, но это не сработало.
Я установил для этого поле ACF как средство выбора даты с выходом Y-m-d H:i, названное [banner_start_date] и [banner_end_date].
Затем у меня также есть поле текстовой области ACF с именем [banner_message] для размещения между тегами <span>, как вы можете видеть, что также не работает.
Поля ACF добавляются на пользовательскую страницу параметров, созданную с помощью этого кода:
if ( function_exists('acf_add_options_page') ) {
acf_add_options_page(array(
'page_title' => 'DWD Vakantiesluiting',
'menu_title' => 'DWD Vakantie',
'menu_slug' => 'dwd-vakantiesluiting',
'capability' => 'edit_posts',
'icon_url' => 'dashicons-lock',
'redirect' => true,
'updated_message' => __("Vakantiemodus ingesteld", 'acf'),
));
}
Я изменил код на это, но это все еще не работает:
function scheduled_site_banner() {
// Get the start and end date values from ACF fields
$start_date = get_field('banner_start_date', 'option');
$end_date = get_field('banner_end_date', 'option');
$banner_message = get_field('banner_message', 'option');
// Create DateTime objects for the start and end date
$start_time = new DateTime($start_date);
$end_time = new DateTime($end_date);
// Format the start and end date
$formatted_start_date = date("F j, Y",strtotime($start_date));
$formatted_end_date = date("F j, Y",strtotime($end_date));
// Check if the current date and time falls between the start and end dates
if ( new DateTime() > $start_time && new DateTime() < $end_time ) {
?>
<div class = "site-banner">
<span>
<strong>Important Notice:</strong> <?php echo $banner_message; ?> Our site-wide banner is scheduled to display from <?php echo $formatted_start_date ?> to <?php echo $formatted_end_date ?>
</span>
</div>
<?php
}
}
add_action( 'wp_footer', 'scheduled_site_banner' );
Также использование двойных кавычек в // Get the start and end date values from ACF fields не работает.
Есть ли кто-нибудь, кто мог бы помочь мне с этим?
Заранее спасибо!
Извините, я добавил это в код.
В этой форме он даже не будет выполняться, использование вами одинарных кавычек вызывает ошибку синтаксического анализа.
Я изменил одинарные кавычки на двойные кавычки, и это выполняет код, но, к сожалению, это не работает.
Где вы на самом деле хранили эти значения? Поскольку вы не указали идентификатор сообщения, это всегда будет искать поле под идентификатором текущего сообщения.
Я создаю пользовательскую страницу параметров для полей. Я добавил этот код в вопрос.
Затем вам нужно передать 'option' в качестве второго параметра для get_field, чтобы он знал, что вы хотите получить это значение со страницы параметров, а не из текущего сообщения. advancedcustomfields.com/resources/options-pa
Я сделал это, а также изменил код, но он все еще не работает. Это дает мне критическую ошибку на веб-сайте.
Затем включите режим отладки WP и проверьте журнал ошибок, чтобы выяснить причину.






У меня получилось, спасибо за помощь. Проблема заключалась в формате даты среди прочего. Я также добавил Europe/Amsterdam Часовой пояс.
Это правильный код:
function scheduled_site_banner() {
// Get the start and end date values from ACF fields
$start_date = get_field("banner_start_date", "option");
$end_date = get_field("banner_end_date", "option");
$banner_message = get_field("banner_message", "option");
// Create DateTime objects for the start and end date and set Amsterdam timezone
$start_time = DateTime::createFromFormat("Y-m-d H:i:s", $start_date, new DateTimeZone('Europe/Amsterdam'));
$end_time = DateTime::createFromFormat("Y-m-d H:i:s", $end_date, new DateTimeZone('Europe/Amsterdam'));
if ($start_time === false || $end_time === false) {
// date is not in correct format
return;
}
// Check if the current date and time falls between the start and end dates
if ( new DateTime('Europe/Amsterdam') > $start_time && new DateTime('Europe/Amsterdam') < $end_time ) {
?>
<div class = "site-banner">
<span>
<strong>Important:</strong> <?php echo $banner_message; ?>
</span>
</div>
<?php
}
}
add_action( 'wp_footer', 'scheduled_site_banner' );
add_filter('acf/format_value', 'do_shortcode');
Я также добавил 2 шорткода, которые можно использовать в сообщении для отображения начальной и конечной дат, установленных в полях acf. Я использовал этот код для этого:
function register_acf_shortcodes() {
add_shortcode('begin_vakantie', 'acf_banner_start_date_shortcode');
add_shortcode('einde_vakantie', 'acf_banner_end_date_shortcode');
}
add_action( 'init', 'register_acf_shortcodes');
function acf_banner_start_date_shortcode() {
$start_date = get_field('banner_start_date', 'option');
return date('d-m-Y', strtotime($start_date));
}
function acf_banner_end_date_shortcode() {
$end_date = get_field('banner_end_date', 'option');
return date('d-m-Y', strtotime($end_date));
}
И добавил этот фильтр в function scheduled_site_banner(), как вы можете видеть:
add_filter('acf/format_value', 'do_shortcode');
И последнее, но не менее важное: я использовал этот CSS для оформления баннера и расположил его внизу страницы:
.site-banner {
position: fixed;
bottom: 0;
width: 100%;
background-color: #cf2e2e;
padding: 1em;
z-index: 99999;
text-align: center;
color: #ffffff;
}
Пожалуйста, покажите нам, как именно вы пытались использовать
get_field, вместо того, чтобы просто говорить нам, что вы пытались его использовать.