Вопрос или проблема
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, чтобы гарантировать, что вы извлекаете необходимые данные.
Если у вас остались вопросы, не стесняйтесь задавать!