¿Hay alguna forma de establecer campos personalizados predeterminados al crear una publicación?

24 sept 2011, 19:46:22
Vistas: 18.6K
Votos: 13

Cuando estoy creando una nueva publicación, justo después de hacer clic en "Añadir nuevo", cuando aparece el editor de publicaciones, en lugar de tener que usar el menú desplegable y elegir un campo personalizado, me gustaría tener algunos campos personalizados predeterminados ya abiertos.

Visualmente, en lugar de:

Interfaz predeterminada de campos personalizados

Me gustaría tener algo como:

Interfaz con campos personalizados predeterminados visibles

Sé que hay plugins para eso (CPT, More fields, etc.) pero me gustaría una forma simple de hacerlo con una función básica.

Intenté algo como esto (estoy usando un tipo de publicación personalizado 'producto'):

function registrar_campos_personalizados( $post_ID ) {

    global $wpdb;

        if( !wp_is_post_revision( $post_ID ) ) {

            add_post_meta( $post_ID, 'referencia', '', true);
            add_post_meta( $post_ID, 'precio', '', true);

        }

}

add_action('edit_product', 'registrar_campos_personalizados');

Pero eso no parece funcionar. Creo que el hook probablemente está mal (porque edit_post ocurre después de una actualización), pero no veo ningún hook para "nueva publicación" (justo después de que el usuario hace clic en "nueva publicación" en el admin de WP). ¿Existe alguno?

¿O tal vez toda la idea está equivocada y hay otra forma?

0
Todas las respuestas a la pregunta 5
2

El hook de acción save_post se llama al guardar, pero no sé si puedes agregar metadatos en este momento. Sin embargo, debería ser posible crear/actualizar tus metadatos después de que el post se haya guardado con el hook de acción updated_post_meta.

EDITAR

Para preseleccionar algunos campos meta (campos personalizados) en la pantalla de creación de posts, primero debes agregar estos valores meta con un valor vacío.

Si observas la función post_custom_meta_box() (que es el callback para el metabox utilizado postcustom) en el archivo wp-admin/includes/meta-boxes.php, puedes ver que la función usa list_meta() para crear los campos meta preseleccionados.

Ahora veamos el flujo del programa hasta que se muestra este metabox (estamos buscando un hook de acción/filtro que podamos usar aquí):

  1. WordPress carga el archivo post-new.php
  2. Este archivo genera un post por defecto en la base de datos en la línea 39 con la función get_default_post_to_edit(). Eso es bueno. Básicamente, el post ya está en la base de datos como un borrador automático. Desafortunadamente, no hay ningún hook en este momento para alterar estos datos o agregar algo nuevo.
  3. Como siguiente paso, se incluye el archivo edit-form-advanced.php. Este archivo generará toda la página de administración e incluirá todos los metaboxes necesarios basados en el parámetro supports del tipo de post.
  4. En la línea 136 se incluye el metabox de campos personalizados postcustom y se llama a la función mencionada. Nuevamente, no hay ningún hook de acción que podamos usar.

Conclusión

Creo que la única forma de hacerlo es usar jQuery o sobrecargar el metabox postcustom y agregar los valores meta antes de ejecutar la función list_meta().

Ejemplo:

add_action('admin_menu', 'wpse29358_replaceMetaBoxes'); // quizás el hook add_meta_boxes
function wpse29358_replaceMetaBoxes() {
    remove_meta_box('postcustom', {POST_TYPE}, 'normal');
    add_meta_box('postcustom', __('Campos Personalizados'), 'wpse29358_postcustomMetabox', {POST_TYPE}, 'normal', 'core');
}

function wpse29358_postcustomMetabox($post) {
    // Agrega tus metadatos al post con el ID $post->ID
    add_post_meta($post->ID, 'clave', 'valor');

    // y luego copia y pega el contenido del metabox de la función post_custom_meta_box()
}
24 sept 2011 20:26:48
Comentarios

El problema es que no estoy intentando añadir nada al guardar por ahora, estoy intentando mostrar algunos campos personalizados ya abiertos cuando el usuario llega a la página de edición (ver actualizaciones con capturas de pantalla)

mike23 mike23
25 sept 2011 16:19:11

Ah. Ahora entiendo tu problema. He editado mi respuesta.

Roman Roman
25 sept 2011 19:41:02
0

Este es el método correcto para agregar soporte de campos personalizados (no obtendrás campos vacíos al editar entradas)

function set_default_meta($post_ID){
    $current_field_value = get_post_meta($post_ID,'Sort Order',true);
    $default_meta = '100'; // valor por defecto
    if ($current_field_value == '' && !wp_is_post_revision($post_ID)){
            add_post_meta($post_ID,'Sort Order',$default_meta,true);
    }
    return $post_ID;
}
add_action('wp_insert_post','set_default_meta');
13 feb 2013 02:34:21
4

Estoy buscando tener una meta descripción única para cada publicación personalizada en un sitio WP que estoy desarrollando. También estaba buscando un campo personalizado predeterminado y terminé aquí.

Sé que esta es una publicación bastante antigua, pero pensé en compartir la respuesta simple que encontré en mariokostelac.com.

kg es mi espacio de nombres, puedes nombrar la función como prefieras. Soy bastante nuevo en hooks y personalización de WP en general, pero creo que wp_insert_post es el hook que estás buscando.

add_action('wp_insert_post', 'kg_set_default_custom_fields');

function kg_set_default_custom_fields($post_id)
{
    if ( $_GET['post_type'] != 'page' ) {
        add_post_meta($post_id, 'meta-description', '', true);
    }

    return true;
}
13 sept 2012 15:01:41
Comentarios

Para tu información: Existe get_post_type(). Además, al hacer comparaciones no estrictas, deberías usar la sintaxis de condición estilo YODA.

kaiser kaiser
4 oct 2012 12:41:37

@kaiser ¿a qué te refieres con estilo YODA? También, ¿por qué es mejor get_post_type($post_id) que $_GET['post_type']?

Aziz Aziz
3 may 2016 19:47:03

Usa el valor antes de la comparación: 'page' === $_GET['post_type']. De lo contrario, cuando olvidas un solo = podrías terminar en una situación donde asignas un valor en lugar de comparar dos valores. Y eso terminará como basura en tu base de datos. También podrías considerar usar la comparación estricta de tipos === (¿el valor es page? y ¿el valor es de tipo string?)

kaiser kaiser
3 may 2016 19:51:21

@kasier Ya veo - entonces el código final es algo como: 'page' === get_post_type($post_id) ?

Aziz Aziz
3 may 2016 19:52:18
0

Debes usar la acción save_post y aislar tu operación verificando el tipo de publicación, ya que esto se ejecuta en todos los tipos de publicación. Obviamente, tendrás que agregar más lógica para que funcione según tus necesidades. Probablemente deberías establecer un campo de metadatos que verifique si ya configuraste los valores predeterminados, para no frustrar a los usuarios si desean dejar un campo de metadatos vacío.

Si deseas que los valores predeterminados sean nulos (como se ve en tu ejemplo de código), entonces no crees una función porque esto solo agrega carga innecesaria y los campos de metadatos no se llenan con valores por defecto.

function register_custom_fields( $post_ID ) {
    // Aquí verificar el nonce
    if( !wp_is_post_revision( $post_ID ) ) {
        if('product' === $_REQUEST['post_type']){
            $reference = $_REQUEST['reference'] ? esc_html($_REQUEST['reference']) : 'valor_predeterminado';
            $price = $_REQUEST['price'] ? esc_html($_REQUEST['price']) : 'valor_predeterminado';
            update_post_meta( $post_ID, 'reference', $reference);
            update_post_meta( $post_ID, 'price', $price);
        }
    }
}
add_action('save_post', 'register_custom_fields');
25 sept 2011 07:42:46
0

Si alguien necesita obtener un campo personalizado por tipo de publicación, dejo el código a continuación de la forma en que lo hice y funciona bien para mí :)

function awh_field_type($post_id){
$awh_f_post = get_post_type($post_id);
$meta_value = '';
$meta_name = 'custom';
    if($awh_f_post == 'product'){
        add_post_meta($post_id,$meta_name,$meta_value,true);
    }
return $awh_f_post;

} add_action('wp_insert_post','awh_field_type');

19 may 2016 21:27:35