API JSON для отображения расширенных пользовательских полей - WordPress
Я разрабатываю сайт WordPress журнала, на котором будет загружен json-канал для мобильного приложения. Я установил бэкэнд с помощью дополнительных пользовательских полей с полем повторителя для нескольких статей и нескольких страниц в каждой статье. http://www.advancedcustomfields.com/add-ons/repeater-field/
![Screen shot of Repeater Fields]()
Я использую JSON API, но это не включает никаких моих настраиваемых полей. Есть ли в настоящее время плагин, который может это сделать?
![These are the Custom Fields 'slug names' of the previous fields]()
Ответы
Ответ 1
@Майк: ты мне очень помог. Здесь мое скромное дополнение:
add_filter('json_api_encode', 'json_api_encode_acf');
function json_api_encode_acf($response)
{
if (isset($response['posts'])) {
foreach ($response['posts'] as $post) {
json_api_add_acf($post); // Add specs to each post
}
}
else if (isset($response['post'])) {
json_api_add_acf($response['post']); // Add a specs property
}
return $response;
}
function json_api_add_acf(&$post)
{
$post->acf = get_fields($post->id);
}
Ответ 2
Пришел сюда, выбрав тот же вопрос. Это еще не полностью проверено, но я думаю, что это идет по правильному пути. Проверьте это.
У меня есть один меньше вложенного уровня, чем вы, так что это может немного измениться. Но плагин JSON API имеет фильтр json_api_encode. У меня есть ретранслятор, называемый спецификациями, который выглядит так.
http://d.pr/i/YMvv
В моем файле функций у меня есть это.
add_filter('json_api_encode', 'my_encode_specs');
function my_encode_specs($response) {
if (isset($response['posts'])) {
foreach ($response['posts'] as $post) {
my_add_specs($post); // Add specs to each post
}
} else if (isset($response['post'])) {
my_add_specs($response['post']); // Add a specs property
}
return $response;
}
function my_add_specs(&$post) {
$post->specs = get_field('specifications', $post->id);
}
Что добавляет пользовательское значение к выходу JSON API. Обратите внимание, что функция get_field из ACF отлично работает здесь для возврата массива значений повторителя.
Надеюсь, это поможет!
Ответ 3
Теперь есть небольшой плагин, который добавляет вам фильтр.
https://github.com/PanManAms/WP-JSON-API-ACF
Ответ 4
Обновление для Wordpress 4.7
С выпуском Wordpress 4.7 функциональность REST больше не предоставляется в виде отдельного плагина, а скорее ее вкатывается (плагин не требуется).
Предыдущие фильтры не работают. Однако следующий фрагмент делает (может быть в вашем functions.php
):
= PHP 5.3
add_filter('rest_prepare_post', function($response) {
$response->data['acf'] = get_fields($response->data['id']);
return $response;
});
< PHP 5.3
add_filter('rest_prepare_post', 'append_acf');
function append_acf($response) {
$response->data['acf'] = get_fields($response->data['id']);
return $response;
};
Обратите внимание, что фильтр представляет собой фильтр с дикими картами, применяемый как
apply_filters("rest_prepare_$type", ...
поэтому, если у вас несколько типов контента (пользовательский), вам нужно будет сделать:
add_filter('rest_prepare_multiple_choice', 'append_acf');
add_filter('rest_prepare_vocabularies', 'append_acf');
function append_acf($response) {
$response->data['acf'] = get_fields($response->data['id']);
return $response;
};
Примечание Похоже, что rest_prepare_x
вызывается для каждой записи. Поэтому, если вы пингоруете конечную точку индекса, она будет вызываться несколько раз (так что вам не нужно проверять, есть ли ее сообщения или сообщение)
Ответ 5
Я не уверен, что вы все еще заинтересованы в решении, но мне удалось изменить файлы json-api plugin models/post.php, чтобы отображать данные ретранслятора в виде массива. Это модификация модификации, сделанная http://wordpress-problem.com/marioario-on-plugin-json-api-fixed-get-all-custom-fields-the-right-way/
замените функцию set_custom_fields_value() следующим образом:
function set_custom_fields_value() {
global $json_api;
if ($json_api->include_value('custom_fields') && $json_api->query->custom_fields) {
// Query string params for this query var
$params = trim($json_api->query->custom_fields);
// Get all custom fields if true|all|* is passed
if ($params === "*" || $params === "true" || $params === "all") {
$wp_custom_fields = get_post_custom($this->id);
$this->custom_fields = new stdClass();
// Loop through our custom fields and place on property
foreach($wp_custom_fields as $key => $val) {
if (get_field($key)) {
$this->custom_fields->$key = get_field($key);
} else if ($val) {
// Some fields are stored as serialized arrays.
// This method does not support multidimensionals...
// but didn't see anything wrong with this approach
$current_custom_field = @unserialize($wp_custom_fields[$key][0]);
if (is_array($current_custom_field)) {
// Loop through the unserialized array
foreach($current_custom_field as $sub_key => $sub_val) {
// Lets append these for correct JSON output
$this->custom_fields->$key->$sub_key = $sub_val;
}
} else {
// Break this value of this custom field out of its array
// and place it on the stack like usual
$this->custom_fields->$key = $wp_custom_fields[$key][0];
}
}
}
} else {
// Well this is the old way but with the unserialized array fix
$params = explode(',', $params);
$wp_custom_fields = get_post_custom($this->id);
$this->custom_fields = new stdClass();
foreach ($params as $key) {
if (isset($wp_custom_fields[$key]) && $wp_custom_fields[$key][0] ) {
$current_custom_field = @unserialize($wp_custom_fields[$key][0]);
if (is_array($current_custom_field)) {
foreach($current_custom_field as $sub_key => $sub_val) {
$this->custom_fields->$key->$sub_key = $sub_val;
}
} else {
$this->custom_fields->$key = $wp_custom_fields[$key][0];
}
}
}
}
} else {
unset($this->custom_fields);
}
}
Ответ 6
Текущая версия ACF распечатывает объект custom_fields при вызове API JSON, содержащий все поля, относящиеся к сообщению или странице. Я отредактировал версию @Myke, чтобы добавить специальные пользовательские поля на странице параметров ACF для каждой публикации или страницы. К сожалению, для всей страницы параметров нет функции get_fields(), поэтому вам придется ее редактировать в зависимости от структуры полей.
add_filter('json_api_encode', 'json_api_encode_acf');
function json_api_encode_acf($response) {
if (isset($response['posts'])) {
foreach ($response['posts'] as $post) {
json_api_add_acf($post); // Add specs to each post
}
}
else if (isset($response['post'])) {
json_api_add_acf($response['post']); // Add a specs property
}
else if (isset($response['page'])) {
json_api_add_acf($response['page']); // Add a specs to a page
}
return $response;
}
function json_api_add_acf(&$post) {
$post->custom_fields->NAME_OF_YOUR_CUSTOM_FIELD = get_field( 'NAME_OF_YOUR_CUSTOM_FIELD', 'option' );
}