Как получить пользовательские поля в публикации поста при его публикации

Вопрос или проблема

add_action( 'publish_post', 'sm12_publish_post' );
    add_action( 'save_post', 'sm12_publish_post', 20 ); //После сохранения значения мета
    function sm12_publish_post( $postid ){

        /** некоторые проверки */

        if( "publish" != get_post_status( $postid ) )
            return;

        $post= get_post($postid);
        $sub = 'тема теста';
        $mgs="текст сообщения";

        wp_mail( '[email protected]', $email, $mgs);

    }

Мне нужно получить пользовательские поля на мой фронтенд (Laravel) из бэкенда WordPress. Пост был успешно сохранен, и я смог получить идентификатор поста и заголовок, но я не могу извлечь значения из пользовательского поля. Затем, после того как я использовал var_dump для данных поста. Он показывает:

object(WP_Post)#1791 (24) {
      ["ID"]=>
      int(789)
      ["post_author"]=>
      string(1) "1"
      ["post_date"]=>
      string(19) "2018-04-20 06:06:32"
      ["post_date_gmt"]=>
      string(19) "2018-04-20 06:06:32"
      ["post_content"]=>
      string(0) ""
      ["post_title"]=>
      string(33) "Laundry Service - Quintessa Walls"
      ["post_excerpt"]=>
      string(0) ""
      ["post_status"]=>
      string(7) "publish"
      ["comment_status"]=>
      string(6) "closed"
      ["ping_status"]=>
      string(6) "closed"
      ["post_password"]=>
      string(0) ""
      ["post_name"]=>
      string(31) "laundry-service-quintessa-walls"
      ["to_ping"]=>
      string(0) ""
      ["pinged"]=>
      string(0) ""
      ["post_modified"]=>
      string(19) "2018-04-20 06:06:32"
      ["post_modified_gmt"]=>
      string(19) "2018-04-20 06:06:32"
      ["post_content_filtered"]=>
      string(0) ""
      ["post_parent"]=>
      int(0)
      ["guid"]=>
      string(65) "http://localhost/smartend/orders/laundry-service-quintessa-walls/"
      ["menu_order"]=>
      int(0)
      ["post_type"]=>
      string(6) "orders"
      ["post_mime_type"]=>
      string(0) ""
      ["comment_count"]=>
      string(1) "0"
      ["filter"]=>
      string(3) "raw"
    }
    {"id":789,"date":"2018-04-20T06:06:32","date_gmt":"2018-04-20T06:06:32","guid":{"rendered":"http:\/\/localhost\/smartend\/orders\/laundry-service-quintessa-walls\/","raw":"http:\/\/localhost\/smartend\/orders\/laundry-service-quintessa-walls\/"},"modified":"2018-04-20T06:06:32","modified_gmt":"2018-04-20T06:06:32","password":"","slug":"laundry-service-quintessa-walls","status":"publish","type":"orders","link":"http:\/\/localhost\/smartend\/orders\/laundry-service-quintessa-walls\/","title":{"raw":"Laundry Service - Quintessa Walls","rendered":"Laundry Service – Quintessa Walls"},"template":"","acf":{"customer_name":"Quintessa Walls","service_name":"Laundry Service","customer_phone_number":"+793-64-2761068","customer_email":"[email protected]","order_quantity":"501","order_date":"04\/20\/2018","order_notes":"Eum ab dolor ipsa non consequatur Repellendus Elit ratione ad ad totam qui ut vel culpa","order_status":"Pending"},"_links":{"self":[{"href":"http:\/\/localhost\/smartend\/wp-json\/wp\/v2\/orders\/789"}],"collection":[{"href":"http:\/\/localhost\/smartend\/wp-json\/wp\/v2\/orders"}],"about":[{"href":"http:\/\/localhost\/smartend\/wp-json\/wp\/v2\/types\/orders"}],"version-history":[{"href":"http:\/\/localhost\/smartend\/wp-json\/wp\/v2\/orders\/789\/revisions"}],"wp:attachment":[{"href":"http:\/\/localhost\/smartend\/wp-json\/wp\/v2\/media?parent=789"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}"

ОБНОВЛЕНИЕ: Вторые данные в фигурных скобках пришли из ответа AJAX в моем js. Поэтому get_posts() возвращает только первую фигурную скобку {}, которая не содержит значений полей acf.

Мой вопрос: как получить данные из вторых фигурных скобок?

Кстати, я использую ACF для REST API, чтобы получить данные acf на мой фронтенд Laravel.

add_action('publish_post','create_custom_field')

function create_custom_field ($post_id) {
    global $wpdb;
    if ( current_user_can('contributor') ) {
        if(get_post_meta($post_id,'custom_field_1',true) == '1'){
            add_post_meta($post_ID,'submit','1',true);
            return $post_id;
        }

        return $post_id;
    }
}

Ответ или решение

Чтобы получить пользовательские поля в посте при его публикации в WordPress, необходимо использовать функции, предоставляемые WordPress и Advanced Custom Fields (ACF). Вам уже удалось получить ID и заголовок поста, но теперь вам нужно получить и пользовательские поля.

Вот как вы можете это сделать шаг за шагом:

1. Получение пользовательских полей

Для того чтобы получить пользовательские поля ACF в функции, которая срабатывает при публикации поста, вы можете использовать функцию get_field(), или если пользовательские поля не создавались через ACF, используйте get_post_meta().

Пример функции для обработки пользовательских полей

add_action('publish_post', 'sm12_publish_post');
add_action('save_post', 'sm12_publish_post', 20);

function sm12_publish_post($postid) {
    // Проверяем, является ли пост опубликованным
    if ("publish" != get_post_status($postid)) {
        return;
    }

    // Получаем пользовательское поле с помощью ACF
    $customer_name = get_field('customer_name', $postid);
    $service_name = get_field('service_name', $postid);
    $customer_phone_number = get_field('customer_phone_number', $postid);
    $customer_email = get_field('customer_email', $postid);
    $order_quantity = get_field('order_quantity', $postid);
    $order_date = get_field('order_date', $postid);
    $order_notes = get_field('order_notes', $postid);
    $order_status = get_field('order_status', $postid);

    // Дальнейшая обработка: отправка почты и т.д.
    $to = $customer_email; // например, используем email клиента
    $subject = 'Подтверждение заказа';
    $message = "Уважаемый/ая $customer_name, ваш заказ на услугу '$service_name' принят.\n";
    $message .= "Количество: $order_quantity\n";
    $message .= "Дата заказа: $order_date\n";
    $message .= "Примечания: $order_notes\n";
    $message .= "Статус: $order_status\n";

    wp_mail($to, $subject, $message);
}

2. Получение пользовательских полей в Laravel

Если вы используете ACF для REST API, то пользовательские поля должны возвращаться вместе с остальными данными поста. Вы можете использовать следующий пример AJAX-запроса в Laravel для получения этих данных:

$.ajax({
    url: 'http://localhost/smartend/wp-json/wp/v2/orders/' + postId,
    method: 'GET',
    success: function(response) {
        console.log(response.acf); // Здесь вы получаете данные ACF
    },
    error: function(error) {
        console.error(error);
    }
});

3. Проверка на наличие данных ACF

Убедитесь, что плагин ACF установлен и активирован, и что пользовательские поля настроены для вашего типа поста. Если данные все еще не отображаются, проверьте настройки REST API в ACF.

Заключение

Таким образом, для эффективного получения пользовательских полей при публикации поста:

  • Используйте функции ACF для получения данных.
  • Обеспечьте правильную конфигурацию REST API, чтобы данные возвращались правильно.
  • Проверьте ваши AJAX-запросы в Laravel, чтобы гарантировать, что вы извлекаете необходимые данные.

Если у вас остались вопросы, не стесняйтесь задавать!

Оцените материал
Добавить комментарий

Капча загружается...