C'è un modo per impostare campi personalizzati predefiniti durante la creazione di un post?


11

Quando sto creando un nuovo post, subito dopo aver fatto clic su "Aggiungi nuovo" , quando viene visualizzato l'editor dei post, invece di dover utilizzare il menu a discesa e scegliere un campo personalizzato da utilizzare, vorrei avere già alcuni input di campo personalizzati predefiniti finale aperto.

Visivamente, invece di:

inserisci qui la descrizione dell'immagine

Mi piacerebbe avere qualcosa del tipo:

inserisci qui la descrizione dell'immagine

So che ci sono plugin per questo (CPT, Altri campi, ecc.) Ma mi piacerebbe un modo semplice per farlo con una funzione di base.

Ho provato qualcosa del genere (sto usando un tipo di post personalizzato 'prodotto'):

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

Ma questo non sembra funzionare. Penso che l'hook sia probabilmente sbagliato (perché edit_postarriva dopo un aggiornamento), ma non vedo alcun hook per "nuovo post" (subito dopo che l'utente fa clic su "nuovo post" in wp admin). C'è qualche ?

O forse l'idea è sbagliata e c'è un altro modo?

Risposte:


9

L'hook dell'azione save_postviene chiamato al salvataggio, ma non so se è possibile aggiungere metadati in questo momento. Ma dovrebbe essere possibile creare / aggiornare i tuoi metadati dopo che il post è stato salvato con il hook di azione updated_post_meta.

MODIFICARE

Per preselezionare alcuni meta-campi (campi personalizzati) nella schermata di creazione post, devi prima aggiungere questi meta-valori con un valore vuoto.

Se guardi la post_custom_meta_box()funzione (che è il callback per il metabox usato postcustom) nel file wp-admin/includes/meta-boxes.php, puoi vedere che la funzione sta usando list_meta()per creare i meta campi preselezionati.

Ora diamo un'occhiata al flusso del programma fino a quando non viene visualizzato questo metabox (stiamo cercando un hook di azione / filtro che possiamo usare qui):

  1. WordPress carica il file post-new.php
  2. Questo file genera un post predefinito nel database in linea 39con la funzione get_default_post_to_edit(). Bello. Fondamentalmente il post è già nel database come bozza automatica. Purtroppo al momento non esiste alcun hook per modificare questi dati o aggiungere qualcosa di nuovo.
  3. Come passaggio successivo, il file edit-form-advaned.phpè incluso. Questo file genererà la pagina di amministrazione del foro e include tutti i metabox richiesti in base al supportsparametro del tipo di post.
  4. On line sono inclusi i 136campi personalizzati metabox postcustome viene chiamata la funzione sopra. Ancora una volta, nessun gancio di azione che potremmo usare.

Conclusione

Penso che l'unico modo che puoi fare sia usare jQuery o sovraccaricare il postcustommetabox e aggiungere i meta valori prima di eseguire la list_meta()funzione.

Per esempio

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()
}

Il fatto è che non sto cercando di aggiungere nulla su Salva per ora, sto cercando di mostrare alcuni input di campo personalizzati già aperti quando l'utente accede alla pagina di modifica (vedi aggiornamenti con schermate)
mike23

Ah. Ora capisco il tuo problema. Ho modificato la mia risposta.
rofflox,

3

Questo è il metodo corretto per aggiungere il supporto di campi personalizzati (non si ottengono i campi vuoti quando si modificano i messaggi)

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

1

È necessario utilizzare l'azione save_post e isolare l'operazione controllando il tipo di post in quanto viene eseguito su tutti i tipi di post. C'è ovviamente qualche logica in più che dovrai costruire in questo per farlo funzionare per te. Probabilmente dovresti impostare un campo meta post che controlla se hai impostato le impostazioni predefinite una volta in modo che i tuoi utenti non siano frustrati se desiderano lasciare vuoto un campo meta post.

Se si desidera che i valori predefiniti siano nulli (come mostrato nell'esempio di codice), non creare una funzione perché ciò aggiunge semplicemente campi overhead e post meta non popolati con valori per impostazione predefinita.

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

1

Sto cercando di avere una meta descrizione unica per ogni post personalizzato su un sito WP che sto sviluppando. Quindi stavo anche cercando un campo personalizzato predefinito e sono arrivato qui.

So che questo è un post piuttosto vecchio, ma ho pensato di pubblicare la semplice risposta che ho trovato su mariokostelac.com .

kg è il mio spazio dei nomi, puoi nominare la funzione come preferisci. Sono piuttosto nuovo agli hook e alla personalizzazione di WP in generale, ma credo che wp_insert_post sia l'hook che stai cercando.

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

FYI: C'è get_post_type(). Inoltre, quando si esegue un confronto libero, è necessario utilizzare la sintassi delle condizioni di stile YODA.
Kaiser

@kaiser cosa intendi con stile YODA? Anche perché è get_post_type($post_id) meglio di $_GET['post_type']?
Aziz,

1
Utilizzare il valore di prima del confronto: 'page' === $_GET['post_type']. Altrimenti, quando si dimentica un singolo, =si potrebbe finire in una situazione in cui si assegna un valore invece di confrontare due valori. E questo finirà come immondizia nel tuo database. Potresti anche voler usare === il confronto sicuro dei tipi (è il valore page? Ed è il valore del tipo string?)
kaiser

1
@kasier Vedo - in modo che il codice finale è qualcosa di simile: 'page' === get_post_type($post_id) ?
Aziz,

-1

se qualcuno ha bisogno di prendere il campo personalizzato per tipo di posta lascio il codice qui sotto come ho fatto e funziona bene per me :)

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.