Пользовательское поле ACF. Получить поле внутри действия в functions.php

Wordpress + Timber + ACF Pro. Внутри functions.php у меня есть действие, которое запускается всякий раз, когда публикуется сообщение (с типом недели).

Я хотел бы взять данные из этого сообщения и использовать их для создания нового сообщения для каждого пользователя.

У меня вроде работает. Когда сообщение публикуется, я беру заголовок и имя пользователя и использую их как заголовок для вновь созданного сообщения.

Однако у меня возникают проблемы при попытке получить данные ACF - например: поле даты week_commencing. Все данные ACF возвращают NULL (я знаю, что поля заполнены).

Я прочитал документы - в каком состоянии получить доступ к данным, вам нужно вызвать get_field ('field_name', 'post_id') - что я и сделал.

Я написал $ ID - знайте, что это правильно.

Может быть, это связано с порядком, в котором я работаю?

Вот мой код:

function weekly_published_post_setup($ID, $post) {
    $customers = get_users();
    $theDate = get_field("week_commencing", $ID);

// Array of WP_User objects.
foreach ( $customers as $user ) {

        $new_post = array(
              'post_type' => 'weekly_tasks',
                'post_title' => $post->post_title . ' - ' . $theDate . ' - ' . $user->display_name,
                'post_content' => $theDate,
                'post_status' => 'publish',
                'post_author' => $user->ID
        );
    wp_insert_post($new_post);

        }
}
add_action( 'publish_week', 'weekly_published_post_setup',  10, 2 );

** РЕДАКТИРОВАТЬ **

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

function week_published_delivery_setup($ID) {

    $post = get_post($ID);

    if ($post->post_type != 'week') {
        return;
    }

    if( $post->post_modified_gmt != $post->post_date_gmt ){
        return;
    }

    $customers = get_users();

     $field = get_field('week_commencing', $ID);

     $fields = post.get_field_objects($ID);

     if( $fields )
     {
        foreach( $fields as $field_name => $field )
        {

                $tmp .= $field['label'] . $field['value'];
        }
    }*/



// Array of WP_User objects.
foreach ( $customers as $user ) {
        $new_delivery_post = array(
              'post_type' => 'delivery',
                'post_title' => $post->post_title . ' - ' . $field . ' - ' . $user->display_name,
                'post_content' =>  $post->post_title,
                'post_status' => 'publish',
                'post_author' => $user->ID
        );
    wp_insert_post($new_delivery_post);


        }
}
add_action( 'acf/save_post', 'week_published_delivery_setup',  20);

person Rob    schedule 22.01.2017    source источник


Ответы (1)


Итак, теперь тестируем статус публикации на момент публикации - и делаем то, что тогда нужно. Запуск действия, если old_status == future и new_status == publish, похоже, помогает.

function on_all_status_transitions( $new_status, $old_status, $post ) {
    $ID = $post->ID;
    if ($post->post_type != 'week') {
        return;
    }

    if ( $new_status != $old_status && $old_status == 'future' && $new_status == 'publish' ) {

            $customers = get_users();

            $field = get_field('week_commencing', $ID);



            // Array of WP_User objects.
            foreach ( $customers as $user ) {
                $new_delivery_post = array(
                        'post_type' => 'delivery',
                        'post_title' => $post->post_title . ' - ' . $field . ' - ' . $user->display_name,
                        'post_content' =>  $post->post_title,
                        'post_status' => 'publish',
                        'post_author' => $user->ID
                );
                wp_insert_post($new_delivery_post);


                }

    }
}
add_action(  'transition_post_status',  'on_all_status_transitions', 20, 3 );
person Rob    schedule 23.01.2017