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

11

Cuando estoy creando una nueva publicación, justo después de hacer clic en "Agregar nueva" , cuando aparece el editor de publicaciones, en lugar de tener que usar el menú desplegable y elegir un campo personalizado para usar, me gustaría tener algunas entradas de campo personalizadas predeterminadas Final abierto.

Visualmente, en lugar de:

ingrese la descripción de la imagen aquí

Me gustaría tener algo como:

ingrese la descripción de la imagen aquí

Sé que hay complementos para eso (CPT, más campos, 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 mensaje personalizado 'producto'):

function register_custom_fields( $post_ID ) {

    global $wpdb;

        if( !wp_is_post_revision( $post_ID ) ) {

            add_post_meta( $post_ID, 'reference', '', true);
            add_post_meta( $post_ID, 'price', '', true);

        }

}

add_action('edit_product', 'register_custom_fields');

Pero eso no parece funcionar. Creo que el enlace probablemente está mal (porque edit_postviene después de una actualización), pero no veo ningún enlace para "nueva publicación" (justo después de que el usuario haga clic en "nueva publicación" en wp admin). Hay alguna ?

¿O tal vez toda la idea está mal y hay otra manera?

mike23
fuente

Respuestas:

9

El gancho de acción save_postse llama al guardar, pero no sé si puede agregar metadatos en este momento. Pero debería ser posible crear / actualizar sus metadatos después de que la publicación se guardó con el gancho de acción updated_post_meta.

EDITAR

Para preseleccionar algunos metacampos (campos personalizados) en la pantalla de creación posterior, primero debe agregar estos metavalores con un valor vacío.

Si observa la post_custom_meta_box()función (que es la devolución de llamada para el metabox utilizado postcustom) en el archivo wp-admin/includes/meta-boxes.php, puede ver que la función se está utilizando list_meta()para crear los metacampos preseleccionados.

Ahora echemos un vistazo al flujo del programa hasta que se muestre este metabox (Estamos buscando un enlace de acción / filtro que podamos usar aquí):

  1. WordPress carga el archivo post-new.php
  2. Este archivo genera una publicación predeterminada en la base de datos en línea 39con la función get_default_post_to_edit(). Eso es bueno. Básicamente, la publicación ya está en la base de datos como un borrador automático. Desafortunadamente, no hay ningún enlace en este momento para alterar estos datos o agregar algo nuevo.
  3. Como siguiente paso, edit-form-advaned.phpse incluye el archivo . Este archivo generará la página de administración del agujero e incluye todos los metaboxes necesarios basados ​​en el supportsparámetro del tipo de publicación.
  4. En línea se incluye el 136metabox de campos personalizados postcustomy se llama a la función anterior. De nuevo, no hay gancho de acción que podamos usar.

Conclusión

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

P.ej

add_action('admin_menu', 'wpse29358_replaceMetaBoxes'); // maybe add_meta_boxes hook
function wpse29358_replaceMetaBoxes() {
    remove_meta_box('postcustom', {POST_TYPE}, 'normal');
    add_meta_box('postcustom', __('Custom Fields'), 'wpse29358_postcustomMetabox', {POST_TYPE}, 'normal', 'core');
}

function wpse29358_postcustomMetabox($post) {
    // Add your meta data to the post with the ID $post->ID
    add_post_meta($post->ID, 'key', 'value');

    // and then copy&past the metabox content from the function post_custom_meta_box()
}
rofflox
fuente
La cosa es que no estoy tratando de añadir nada en guardar por ahora, estoy tratando de mostrar algunas entradas de campo personalizado ya se abre cuando el arrvies usuario en la página de edición (ver actualizaciones con capturas de pantalla)
mike23
Ah Ahora entiendo tu problema. He editado mi respuesta.
rofflox
3

Este es el método adecuado para agregar compatibilidad con campos personalizados (no se obtienen los campos en blanco al editar publicaciones)

function set_default_meta($post_ID){
    $current_field_value = get_post_meta($post_ID,'Sort Order',true);
    $default_meta = '100'; // value
    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');
Yuri Korolov
fuente
1

Debe usar la acción save_post y aislar su operación comprobando el tipo de publicación, ya que se ejecuta en todos los tipos de publicación. Obviamente, hay algo más de lógica que tendrá que incorporar a esto para que funcione para usted. Probablemente debería establecer un metacampo de publicación que verifique si ha configurado los valores predeterminados una vez para que sus usuarios no se sientan frustrados si desean dejar un metacampo de publicación en blanco.

Si desea que los valores predeterminados sean nulos (como se ve en su ejemplo de código), no cree una función porque esto solo agrega sobrecarga y los metacampos de publicación no se rellenan con valores de forma predeterminada.

function register_custom_fields( $post_ID ) {
    //Do nonce checking here
    if( !wp_is_post_revision( $post_ID ) ) {
        if('product' === $_REQUEST['post_type']){
            $reference = $_REQUEST['reference'] ? esc_html($_REQUEST['reference']) : 'default_value';
            $price = $_REQUEST['price'] ? esc_html($_REQUEST['price']) : 'default_value';
            update_post_meta( $post_ID, 'reference', $reference);
            update_post_meta( $post_ID, 'price', $price);
        }
    }
}
add_action('save_post', 'register_custom_fields');
Brian Fegter
fuente
1

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

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

kg es mi espacio de nombres, puedes nombrar la función como quieras. Soy bastante nuevo en ganchos y personalización de WP en general, pero creo que wp_insert_post es el gancho 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;
}
kaplan
fuente
FYI: hay get_post_type(). Además, al hacer una comparación flexible, debe usar la sintaxis de condición de estilo YODA.
Kaiser
@kaiser, ¿qué quieres decir con el estilo YODA? Además, ¿por qué es get_post_type($post_id) mejor que $_GET['post_type']?
Aziz
1
Utilice el valor antes de la comparación: 'page' === $_GET['post_type']. De lo contrario, cuando olvide uno solo =, podría terminar en una situación en la que asigna un valor en lugar de comparar dos valores. Y eso terminará como basura en su base de datos. También es posible que desee utilizar === la comparación de tipos seguros (¿es el valor page? Y ¿es el valor del tipo string?)
kaiser
1
@kasier Ya veo, así que el código final es algo así como 'page' === get_post_type($post_id) :?
Aziz
-1

si alguien necesita tomar 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');

Edgardo Aleman
fuente