tutorial - ¿Cómo obtener la clave del campo Campos personalizados avanzados de la base de datos de WordPress?
mostrar campos personalizados wordpress (7)
ACF proporciona algunas formas fáciles de ayudar a mantener sincronizados varios entornos: puede registrar sus campos con PHP o un archivo JSON local. Hacer esto le permitiría seguir usando get_field_object () con una sola clave de campo en múltiples entornos. Ver:
http://www.advancedcustomfields.com/resources/register-fields-via-php/
http://www.advancedcustomfields.com/resources/local-json/
Normalmente hago mi desarrollo de ACF con la interfaz de usuario y luego exporto todos los grupos de campos como PHP para implementar en múltiples entornos.
ACTUALIZAR con un ejemplo sencillo: puede agregar esto a functions.php o un complemento personalizado para agregar su campo a múltiples entornos mediante programación ... luego, llame a get_field_object () con una clave de campo común en todos los entornos
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'',
),
),
),
));
}
Estoy usando campos personalizados avanzados con post-tipo. Tengo algunos campos personalizados seleccionados, y quiero mostrar todas las opciones de etiquetas de cada campo.
Lo he intentado de esta manera.
$field = get_field_object(''hair_color'');
$hair = $field["choices"];
foreach($hair as $value){
Haciendo un
var_dump (campo $)
aparece vacío
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)
}
La única manera de llenarlo es que:
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)
}
Pero tengo 3 entornos y no quiero codificar la clave de campo.
¿Hay alguna solución? Gracias por adelantado.
Aquí hay una versión modificada de la respuesta proporcionada por @BFDatabaseAdmin que coincide con el meta_valor exacto en "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);
}
Estoy lanzando otra opción en la mezcla. Creo que las respuestas existentes son buenas, pero a menos que mire al grupo principal, nunca obtendrá una clave de campo confiable porque el nombre del campo puede existir en múltiples grupos.
Por ejemplo, supongamos que tiene dos grupos personalizados: uno para libros de tipo de publicación y otro para películas de tipo de publicación personalizado. Ambos grupos han añadido un campo llamado título.
En la base de datos, ambos se almacenan con post_except = ''title''
y post_type = ''acf-field''
. Dos entradas con el mismo post_except
, por lo que cualquier consulta que se base únicamente en post_except
será incorrecta, con comodín o no.
Cualquier consulta que se base en la ID de la publicación tampoco es muy buena, ya que puede que no exista una publicación para pasar.
Por lo tanto, debe pasar una combinación de campo y grupo para obtener la clave de campo del nombre. Este fragmento me funciona bien:
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));
}
}
Devolverá la clave de campo de nombre y grupo, o nulo si no existe ninguna.
Uso:
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
La forma en que funciona ACF realmente debe utilizar la clave.
de ( http://www.advancedcustomfields.com/resources/get_field_object/ )
"Puedes y debes usar la $ field_key el 100% del tiempo.
El problema con el uso de $ field_name es que si la referencia no existe, ACF no podrá encontrar el objeto de campo y no podrá guardar el valor. Esta situación se produciría si hubiera utilizado un código para insertar una publicación.
Además, es más eficiente usar la clave de campo como el primer parámetro en la función de actualización de campo, ya que omite la consulta de referencia ".
No hay forma de recuperar la clave de forma confiable usando el nombre, porque el nombre es metadatos, y por lo tanto está abierto a cambios, mientras que la clave (al menos sin editar la base de datos manualmente) no lo es.
Sin embargo, esta función funcionará con la versión más reciente de ACF, con un par de advertencias. ACF crea grupos de campos dentro de las publicaciones como un tipo de publicación personalizado de ACF, pero todos los datos sobre los campos se guardan dentro de la tabla 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%'';
");
}
Una advertencia: debido a que el nombre del campo se almacena como parte de una matriz, al encontrarlo a través de SQL, tiene que confiar en una búsqueda de comodín, que está abierta a errores. Mientras todos sus campos tengan nombres completamente diferentes, está bien, pero si, por ejemplo, tiene un campo llamado "granja" y otro llamado "agricultor", esto generará un error porque encontrará ambos campos.
La única forma confiable de actualizar los campos es codificar manualmente la clave, aunque esto es algo incómodo, que es lo que me llevó aquí, para empezar.
Traté de hacer esto yo mismo, así que hice una investigación. Parece que cada campo y grupo de campos para ACF se almacenan en la tabla wp_posts en la base de datos como tipos de publicaciones personalizadas. los campos son ''acf-field'' y los grupos son ''acf-field-group''.
Pude usar esta función para obtener la clave de campo y luego usar update_field ($ field_key, $ value) en publicaciones que aún no tenían el campo.
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'';
");
}
Entonces pude usar:
update_field(get_acf_key(''my_field_name''), ''some value'', $post_id);
Para actualizar el campo para las publicaciones que ya lo tenían o agregar el campo y su referencia clave a las publicaciones que aún no tenían el campo.
Tuvo el mismo problema, también terminé usando una clave que me llevó a otro callejón sin salida sin una forma normal de obtener un valor clave, pero afortunadamente encontré esto.
Tomado de - https://wordpress.stackexchange.com/questions/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);
}
Donde acf_updateValue simula cómo lo hace ACF cuando lo guarda manualmente. Dado que solo update_field no es suficiente para las columnas ACF