¿Hay alguna forma de establecer campos personalizados predeterminados al crear una publicación?
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:
Me gustaría tener algo como:
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?

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í):
- WordPress carga el archivo
post-new.php
- Este archivo genera un post por defecto en la base de datos en la línea
39
con la funciónget_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. - 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ámetrosupports
del tipo de post. - En la línea
136
se incluye el metabox de campos personalizadospostcustom
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()
}

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)

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');

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;
}

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 ¿a qué te refieres con estilo YODA? También, ¿por qué es mejor get_post_type($post_id)
que $_GET['post_type']
?

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
?)

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');

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');
