Как получить поле "Дополнительные пользовательские поля" из базы данных WordPress?
Im, используя дополнительные пользовательские поля с пост-типом. У меня есть определенные пользовательские поля, и я хочу показать все варианты ярлыков из каждого поля.
Ive пробовал этот путь.
$field = get_field_object('hair_color');
$hair = $field["choices"];
foreach($hair as $value){
Выполнение
var_dump ($ поле)
он выглядит пустым:
array(18) {
["key"] => string(16) "field_hair_color"
["label"] => string(0) ""
["name"] => string(10) "hair_color"
["_name"] => string(10) "hair_color"
["type"]=> string(4) "text"
["order_no"]=> int(1)
["instructions"]=> string(0) ""
["required"]=> int(0)
["id"] => string(20) "acf-field-hair_color"
["class"] => string(4) "text"
["conditional_logic"] => array(3) {
["status"] => int(0)
["allorany"]=> string(3) "all"
["rules"]=> int(0)
}
["default_value"] => string(0) ""
["formatting"] => string(4) "html"
["maxlength"] => string(0) ""
["placeholder"] => string(0) ""
["prepend"] => string(0) ""
["append"] => string(0) ""
["value"] => bool(false)
}
Единственный способ заполнить это:
get_field_object ( 'field_51ac9d333d704');
array(17) {
["key"] => string(19) "field_51ac9d333d704"
["label"] => string(13) "Color de pelo"
["name"] => string(10) "hair_color"
["_name"] => string(10) "hair_color"
["type"] => string(6) "select"
["order_no"] => int(9)
["instructions"] => string(27) "Selecciona el color de pelo"
["required"] => int(0)
["id"] => string(20) "acf-field-hair_color"
["class"] => string(6) "select"
["conditional_logic"] => array(3) {
["status"] => int(0)
["rules"] => array(1) {
[0] => array(3) {
["field"] => string(19) "field_5195ef9879361"
["operator"] => string(2) "=="
["value"] => string(5) "small"
}
}
["allorany"] => string(3) "all"
}
["choices"] => array(5) {
["bald"] => string(5) "Calvo"
["brown"] => string(8) "Castaño"
["brunette"] => string(6) "Moreno"
["red"] => string(9) "Pelirrojo"
["blonde"] => string(5) "Rubio"
}
["default_value"] => string(0) ""
["allow_null"] => int(1)
["multiple"] => int(0)
["field_group"] => int(90679)
["value"]=> bool(false)
}
Но у меня есть 3 среды, и я не хочу жестко кодировать поле.
Есть ли какое-нибудь решение?
Спасибо заранее.
Ответы
Ответ 1
Вот измененная версия ответа, предоставленная @BFDatabaseAdmin, соответствующая точной meta_value в "LIKE"
function get_acf_key($field_name) {
global $wpdb;
$length = strlen($field_name);
$sql = "
SELECT `meta_key`
FROM {$wpdb->postmeta}
WHERE `meta_key` LIKE 'field_%' AND `meta_value` LIKE '%\"name\";s:$length:\"$field_name\";%';
";
return $wpdb->get_var($sql);
}
Ответ 2
Просто пытаясь сделать это сам, поэтому я провел некоторое расследование. Кажется, что каждое поле и группа полей для ACF хранятся в таблице wp_posts в базе данных как пользовательские типы сообщений. поля "acf-field", а группы - "acf-field-group".
Я смог использовать эту функцию, чтобы получить ключ поля, а затем использовать update_field ($ field_key, $value) на сообщениях, у которых уже не было поля.
function get_acf_key($field_name){
global $wpdb;
return $wpdb->get_var("
SELECT post_name
FROM $wpdb->posts
WHERE post_type='acf-field' AND post_excerpt='$field_name';
");
}
Тогда я смог использовать:
update_field(get_acf_key('my_field_name'), 'some value', $post_id);
Чтобы обновить поле для сообщений, у которых оно уже было, или добавить поле и его ключевую ссылку на сообщения, которые еще не имеют поля.
Ответ 3
Я бросаю еще один вариант в микс. Я думаю, что существующие ответы хороши, но если вы не посмотрите на родительскую группу, вы никогда не получите надежный ключ поля, потому что имя поля может существовать в нескольких группах.
Например, скажем, у вас есть две настраиваемые группы: одна для книг типа post и одна для пользовательских фильмов типа post. Обе группы добавили поле под названием title.
В базе данных оба сохраняются с post_except = 'title'
и post_type = 'acf-field'
. Две записи с тем же post_except
, поэтому любой запрос, полагающийся только на post_except
, будет неправильным, подстановочным знаком или нет.
Любой запрос, полагающийся на почтовый идентификатор, тоже невелик, поскольку сообщение может не всегда существовать, чтобы пройти.
Поэтому вам нужно передать комбинацию поля и группы, чтобы получить ключ поля от имени. Этот снипп хорошо работает для меня:
if (! function_exists('acf_field_from_name')) {
function acf_field_from_name($field, $group)
{
global $wpdb;
return $wpdb->get_var($wpdb->prepare("
SELECT post.post_name as field_name
FROM $wpdb->posts AS post
LEFT JOIN $wpdb->posts AS parent
ON post.post_parent = parent.id
WHERE post.post_excerpt = %s
AND post.post_type = 'acf-field'
AND parent.post_excerpt = %s
AND parent.post_type = 'acf-field-group'
", $field, $group));
}
}
Вернет ключ поля из имени и группы, или null, если он не существует.
Использование:
acf_field_from_name('title', 'movie-fields'); // returns field_3333333333333
acf_field_from_name('title', 'book-fields'); // returns field_4444444444444
acf_field_from_name('plumbus', 'movie'); // returns null
Ответ 4
ACF предоставляет несколько простых способов помочь синхронизировать несколько сред - вы можете зарегистрировать свои поля с помощью PHP или локального файла JSON. Это позволит вам продолжать использовать get_field_object() с одним ключом поля в нескольких средах. См:
http://www.advancedcustomfields.com/resources/register-fields-via-php/
http://www.advancedcustomfields.com/resources/local-json/
Я обычно делаю свою разработку ACF с пользовательским интерфейсом, а затем экспортирую все свои группы полей в PHP для развертывания в нескольких средах.
ОБНОВЛЕНИЕ с простым примером:
Вы можете добавить это в functions.php или пользовательский плагин для программного добавления поля в несколько сред. Затем вы вызываете get_field_object() с общим ключом field_key для всех сред.
add_action('acf/init', 'wp123_add_local_acf_fields');
function wp123_add_local_acf_fields() {
acf_add_local_field_group(array(
'key' => 'group_1',
'title' => 'My Group',
'fields' => array (
array (
'key' => 'field_51ac9d333d704',
'label' => 'Color de pelo',
'name' => 'hair_color',
'type' => 'select',
'instructions' => 'Selecciona el color de pelo'
'required' => 0,
'choices' => array (
'bald' => 'Calvo',
'brown' => 'Castaño',
'brunette' => 'Moreno',
'red' => 'Pelirrojo',
'blonde' => 'Rubio',
),
'default_value' => array (
),
'allow_null' => 1,
'multiple' => 0,
)
),
'location' => array (
array (
array (
'param' => 'post_type',
'operator' => '==',
'value' => 'post',
),
),
),
));
}
Ответ 5
Как работает ACF, вы действительно должны использовать ключ.
from (http://www.advancedcustomfields.com/resources/get_field_object/)
"Вы можете и должны использовать $field_key 100% времени.
Проблема с использованием $field_name заключается в том, что если ссылка еще не существует, ACF не сможет найти объект поля и не сможет сохранить значение. Эта ситуация возникла бы, если бы вы использовали код для вставки сообщения.
Кроме того, более эффективно использовать field_key в качестве первого параметра в функции update_field, поскольку он обходит обратный поиск вверх. "
Ответ 6
Невозможно надежно получить ключ, используя имя, потому что имя является метаданным и, следовательно, открытым для изменения, тогда как ключ (по крайней мере, без редактирования базы данных вручную) не является.
Однако эта функция будет работать с самой последней версией ACF с несколькими предостережениями. ACF создает группы полей в сообщениях как пользовательский тип сообщений ACF, но все данные о самих полях хранятся в таблице post_meta.
function get_acf_key($field_name) {
global $wpdb;
return $wpdb->get_var("
SELECT `meta_key`
FROM $wpdb->postmeta
WHERE `meta_key` LIKE 'field_%' AND `meta_value` LIKE '%$field_name%';
");
}
Предупреждение:, потому что имя поля сохраняется как часть массива, при поиске через SQL вам приходится полагаться на поиск подстановочных знаков, который открыт для ошибок. Пока все поля имеют совершенно разные имена, все в порядке, но если у вас есть одно поле под названием "ферма", а другое - "фермер", это будет ошибкой, потому что оно найдет оба поля.
Единственный надежный способ обновления полей - это вручную закодировать ключ, хотя это, по общему признанию, неуклюже, что и привело меня сюда.
Ответ 7
Правильный путь - использовать функцию acf_maybe_get_field
, вот так:
acf_maybe_get_field( 'field_name', false, false );
Аргументы: field name
, post id
(по умолчанию это текущая запись) и самый важный strict
, который по умолчанию равен true
, но мы установили его на false
, чтобы получить объект поля даже если он еще не существует для этой должности.
Относится к программному получению ключа поля ACF по имени поля
Ответ 8
Had same problem, also ended up using key which lead me just to another dead end with no normal way to get key value, but luckily encountered this.
У меня была та же проблема, также в конечном итоге использовался ключ, который привел меня просто в другой тупик без нормального способа получить значение ключа, но, к счастью, столкнулся с этим.Взято из - https://wordpress.stackexchange.com/info/248006/acf-add-fields-values-to-newly-inserted-post
function acf_getValue($fieldname, $post_id){
if(($value = get_field($fieldname, $post_id)))
return $value;
$value = get_post_meta($post_id, $fieldname);
return $value[0];
}
function acf_updateValue($fieldname, $value, $post_id){
$field_key = 'field_' . uniqid();
update_post_meta($post_id, $fieldname, $value);
update_post_meta($post_id, '_'.$fieldname, $field_key);
update_field($field_key, $value, $post_id);
}
Где acf_updateValue имитирует, как это делается самим ACF при сохранении вручную. Поскольку для столбцов ACF недостаточно только update_field