Вызов поля ACF в функции PHP

У меня есть эта функция 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 = "">&#9432; 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 не работает.

Есть ли кто-нибудь, кто мог бы помочь мне с этим?

Заранее спасибо!

Пожалуйста, покажите нам, как именно вы пытались использовать get_field, вместо того, чтобы просто говорить нам, что вы пытались его использовать.

CBroe 19.01.2023 13:03

Извините, я добавил это в код.

MediaCreandum 19.01.2023 13:09

В этой форме он даже не будет выполняться, использование вами одинарных кавычек вызывает ошибку синтаксического анализа.

CBroe 19.01.2023 13:27

Я изменил одинарные кавычки на двойные кавычки, и это выполняет код, но, к сожалению, это не работает.

MediaCreandum 19.01.2023 15:08

Где вы на самом деле хранили эти значения? Поскольку вы не указали идентификатор сообщения, это всегда будет искать поле под идентификатором текущего сообщения.

CBroe 19.01.2023 15:12

Я создаю пользовательскую страницу параметров для полей. Я добавил этот код в вопрос.

MediaCreandum 19.01.2023 15:23

Затем вам нужно передать 'option' в качестве второго параметра для get_field, чтобы он знал, что вы хотите получить это значение со страницы параметров, а не из текущего сообщения. advancedcustomfields.com/resources/options-pa

CBroe 19.01.2023 15:47

Я сделал это, а также изменил код, но он все еще не работает. Это дает мне критическую ошибку на веб-сайте.

MediaCreandum 20.01.2023 08:54

Затем включите режим отладки WP и проверьте журнал ошибок, чтобы выяснить причину.

CBroe 20.01.2023 09:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
9
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У меня получилось, спасибо за помощь. Проблема заключалась в формате даты среди прочего. Я также добавил 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;
}

Другие вопросы по теме