Cómo obtener todos los campos personalizados de cualquier tipo de entrada
Tengo varios tipos de entrada. Quiero obtener todos los campos personalizados asociados con ese tipo de entrada.
Ejemplo:
Entrada
-- imagen
-- Imagen destacada
-- cuerpo
Necesito obtener todos los campos o campos personalizados en un array. Encontré una solución desde aquí, pero no sirve para mi propósito:
// Muestra el array de campos personalizados
echo '<pre>';
print_r(get_post_custom($post_id));
echo '</pre>';

Características de los Tipos de Entrada
Existen varias opciones para obtener una lista de "características" que soporta un tipo de entrada en particular. La más sencilla es usar la función get_all_post_type_supports()
:
$post_type_features = get_all_post_type_supports( 'post' );
print_r( $post_type_features );
/* Array
* (
* [0] => author
* [1] => editor
* [2] => thumbnail
* [3] => excerpt
* [4] => trackbacks
* [5] => custom-fields
* [6] => comments
* [7] => revisions
* [8] => post-formats
* [9] => title
* )
*/
También puedes usar post_type_supports()
para ver si un tipo de entrada soporta características específicas.
Otra forma de verificar las características de un tipo de entrada es obtener su objeto de tipo de entrada y simplemente revisar la propiedad $supports
:
$post_type_object = get_post_type_object( 'post' );
print_r( $post_type_object->supports );
Campos Personalizados
Dado que los campos personalizados son metadatos de entrada asociados entrada por entrada en lugar de por tipo de entrada, no existe una forma directa de recuperar una lista de nombres de campos personalizados utilizados por un tipo de entrada en particular.
En su lugar, tendrías que compilar un array manualmente recorriendo cada entrada del tipo de entrada en cuestión y usando get_metadata( $post_id )
o get_post_custom_keys( $post_id )
para recuperar cada campo personalizado almacenado para esa entrada. Esta es potencialmente una operación muy costosa y debería hacerse con la menor frecuencia posible - si estás considerando hacer esto más de una vez por semana o mes, recomendaría encarecidamente que busques otros medios para alcanzar tu objetivo final.
También es posible usar una consulta SQL personalizada para determinar esta información, y sin duda sería significativamente más eficiente que consultar metadatos para cada entrada de un tipo de entrada.

Añade el siguiente código en el functions.php
para acf
function get_all_meta($type){
global $wpdb;
$result = $wpdb->get_results($wpdb->prepare(
"SELECT post_id,meta_key,meta_value FROM wp_posts,wp_postmeta WHERE post_type = %s
AND wp_posts.ID = wp_postmeta.post_id", $type
), ARRAY_A);
return $result;
}
function acf(){
$options = array();
$acf = get_all_meta('acf');
foreach($acf as $key => $value){
$options['post_type'][$value['post_id']]['post_id'] = $value['post_id'];
$test = substr($value['meta_key'], 0, 6);
if($test === 'field_'){
$post_types = maybe_unserialize( $value['meta_value'] );
$options['post_type'][$value['post_id']]['key'][] = $post_types['key'];
$options['post_type'][$value['post_id']]['key'][] = $post_types['name'];
$options['post_type'][$value['post_id']]['key'][] = $post_types['type'];
}
if($value['meta_key'] == 'rule'){
$post_types = maybe_unserialize( $value['meta_value'] );
$options['post_type'][$value['post_id']]['post_types'] = $post_types['value'];
}
}
return $options;
}
Esto te dará el valor del array de la meta key para acf.
Cómo usarlo
foreach(acf() as $key => $value){
update_post_meta(76, $value['type'], 'Steve');
}
Para pods
function pods(){ global $wpdb; //obtener el id de los post types de pods.
$result = $wpdb->get_results($wpdb->prepare(
"SELECT ID,post_title,post_parent FROM wp_posts WHERE post_type = %s", $type
), ARRAY_A);
// cada campo de pods para un post type crea un post type separado, así que hacemos otra consulta para obtener el resultado del post type del campo.
$pods_field_post_type = array();
foreach($result as $value){
$pods_field_post_type = $wpdb->get_results($wpdb->prepare(
"SELECT ID,post_title,post_name FROM wp_posts WHERE post_type = %s
AND post_parent = %d
", '_pods_field',$value["ID"]
), ARRAY_A);
}
$fields = array();
foreach($pods_field_post_type as key => $value):
$podsAPI = new PodsAPI();
$pod = $podsAPI->load_pod( array( 'name' => '
post' ));
$fields[] = $pod['fields'][$value['post_name']]['type'];
endforeach;
}
print_r($fields);
Cómo usarlo
foreach($fields as $key => $value){
update_post_meta(76, $value, 'Steve');
}
Las funciones acf() y pods() te dan la meta key exacta de ese post type. Si copias y pegas el código puede que no funcione.
Espero que esta respuesta te ayude y también a otros.
Déjame saber si tienes algún problema.
