Cómo obtener todos los campos personalizados de cualquier tipo de entrada

17 mar 2017, 13:35:31
Vistas: 19.9K
Votos: 8

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>';
8
Comentarios

Necesito todos los campos con un tipo de post. Puede ser la imagen destacada o el cuerpo, campos personalizados. No para un post. :)

ejemplo: array( 'post_type'=>array('image,body,title,featured_image')) el tipo de post puede ser página, post o cualquier cosa.

Espero que ahora quede claro.

user115277 user115277
17 mar 2017 17:43:16

¿Tienes algún fragmento de código, otra vez? Un fragmento para mostrarnos. Aquí no hay nadie para escribir código por ti.

Max Yudin Max Yudin
17 mar 2017 19:17:31

No estoy codificando nada. Necesito una idea. No le estoy pidiendo a nadie que codifique por mí. He buscado mucho tiempo para encontrar soluciones. Ahora estoy buscando en el núcleo de WordPress cómo recuperan los campos con otros campos personalizados en un post o página. Si lo encuentro, responderé aquí.

Gracias

user115277 user115277
17 mar 2017 19:33:11

Por favor publica tu código para encontrar errores. De lo contrario eliminaré tu publicación por no cumplir con los requisitos de este sitio.

Max Yudin Max Yudin
17 mar 2017 19:47:38

Ok, puedes hacerlo. No eres capaz de entender lo que quiero... :)

user115277 user115277
17 mar 2017 20:28:24

Deberías aclarar tu pregunta. Creo que quieres campos personalizados registrados y otros campos por defecto para un tipo de entrada personalizada. Si es así, es posible. Si usas ACF o Pods, o Types puedo darte soluciones. Porque guardan registro en la base de datos y puedes obtener fácilmente valores usando consultas. La solución es compleja y si no conoces la estructura de WordPress, no podrás lograr esta solución.

Faysal Mahamud Faysal Mahamud
23 mar 2017 09:03:03

@user115277 házme saber si interpreté correctamente tu pregunta con mi respuesta, y editaré tu pregunta para aclarar la confusión

bosco bosco
25 mar 2017 05:50:43

gracias, @bosco ambas soluciones me ayudaron mucho. En realidad necesitaba todos los campos personalizados asociados con un tipo de publicación usando Advanced Custom Fields (acf).

user115277 user115277
25 mar 2017 10:56:06
Mostrar los 3 comentarios restantes
Todas las respuestas a la pregunta 2
0

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.

25 mar 2017 05:38:40
0

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.

23 mar 2017 09:25:52