È possibile impostare campi personalizzati predefiniti durante la creazione di un articolo?

24 set 2011, 19:46:22
Visualizzazioni: 18.6K
Voti: 13

Quando creo un nuovo articolo, subito dopo aver cliccato "Aggiungi nuovo", quando appare l'editor, invece di dover usare il menu a tendina per selezionare un campo personalizzato, vorrei avere alcuni campi predefiniti già aperti.

Visivamente, invece di:

Editor WordPress con campi personalizzati chiusi

Vorrei ottenere qualcosa come:

Editor WordPress con campi personalizzati aperti per default

So che esistono plugin per questo (CPT, More fields, ecc.) ma vorrei una soluzione semplice con una funzione base.

Ho provato qualcosa del genere (sto usando un custom post type 'product'):

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

        }

}

// Aggiunge l'azione al hook 'edit_product'
add_action('edit_product', 'register_custom_fields');

Ma non sembra funzionare. Penso che l'hook sia probabilmente sbagliato (perché edit_post viene chiamato dopo un aggiornamento), ma non trovo alcun hook per "nuovo articolo" (subito dopo che l'utente clicca su "nuovo articolo" nell'admin di WordPress). Esiste?

O forse l'intero approccio è sbagliato e c'è un altro modo?

0
Tutte le risposte alla domanda 5
2

L'hook di azione save_post viene chiamato al salvataggio, ma non so se sia possibile aggiungere metadati in questo momento. Tuttavia dovrebbe essere possibile creare/aggiornare i metadati dopo che il post è stato salvato utilizzando l'hook di azione updated_post_meta.

MODIFICA

Per pre-selezionare alcuni campi meta (campi personalizzati) nella schermata di creazione del post, è necessario prima aggiungere questi valori meta con un valore vuoto.

Se osservi la funzione post_custom_meta_box() (che è il callback per il metabox utilizzato postcustom) nel file wp-admin/includes/meta-boxes.php, puoi vedere che la funzione utilizza list_meta() per creare i campi meta pre-selezionati.

Ora esaminiamo il flusso del programma fino a quando viene visualizzato questo metabox (Cerchiamo un hook di azione/filtro che possiamo utilizzare qui):

  1. WordPress carica il file post-new.php
  2. Questo file genera un post predefinito nel database alla riga 39 con la funzione get_default_post_to_edit(). Questo è utile. Fondamentalmente il post è già nel database come bozza automatica. Sfortunatamente non c'è alcun hook in questo momento per modificare questi dati o aggiungere qualcosa di nuovo.
  3. Come passo successivo, viene incluso il file edit-form-advanced.php. Questo file genera l'intera pagina di amministrazione e include tutti i metabox necessari in base al parametro supports del tipo di post.
  4. Alla riga 136 viene incluso il metabox dei campi personalizzati postcustom e viene chiamata la funzione sopra citata. Ancora una volta, nessun hook di azione che possiamo utilizzare.

CONCLUSIONE

Penso che l'unico modo possibile sia utilizzare jQuery o sovrascrivere il metabox postcustom e aggiungere i valori meta prima di eseguire la funzione list_meta().

Ad esempio:

add_action('admin_menu', 'wpse29358_replaceMetaBoxes'); // forse hook add_meta_boxes
function wpse29358_replaceMetaBoxes() {
    remove_meta_box('postcustom', {POST_TYPE}, 'normal');
    add_meta_box('postcustom', __('Campi Personalizzati'), 'wpse29358_postcustomMetabox', {POST_TYPE}, 'normal', 'core');
}

function wpse29358_postcustomMetabox($post) {
    // Aggiungi i tuoi metadati al post con ID $post->ID
    add_post_meta($post->ID, 'chiave', 'valore');

    // e poi copia&incolla il contenuto del metabox dalla funzione post_custom_meta_box()
}
24 set 2011 20:26:48
Commenti

Il punto è che per ora non sto cercando di aggiungere nulla al salvataggio, sto cercando di mostrare alcuni campi personalizzati già aperti quando l'utente arriva sulla pagina di modifica (vedi aggiornamenti con screenshot)

mike23 mike23
25 set 2011 16:19:11

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

Roman Roman
25 set 2011 19:41:02
0

Questo è il metodo corretto per aggiungere il supporto ai campi personalizzati (non otterrai campi vuoti quando modifichi gli articoli)

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

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 namespace, puoi chiamare la funzione come preferisci. Sono abbastanza 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-descrizione', '', true);
    }

    return true;
}
13 set 2012 15:01:41
Commenti

Per tua informazione: Esiste get_post_type(). Inoltre, quando fai confronti non stretti, dovresti usare la sintassi condizionale in stile YODA.

kaiser kaiser
4 ott 2012 12:41:37

@kaiser cosa intendi con stile YODA? Inoltre perché get_post_type($post_id) è migliore di $_GET['post_type']?

Aziz Aziz
3 mag 2016 19:47:03

Usa il valore prima del confronto: 'page' === $_GET['post_type']. Altrimenti, quando dimentichi un singolo = potresti ritrovarti in una situazione in cui assegni un valore invece di confrontare due valori. E questo finirà come spazzatura nel tuo database. Potresti anche voler usare il confronto type safe === (il valore è page? e il valore è di tipo string?)

kaiser kaiser
3 mag 2016 19:51:21

@kasier Capisco - quindi il codice finale è qualcosa tipo: 'page' === get_post_type($post_id) ?

Aziz Aziz
3 mag 2016 19:52:18
0

Dovresti utilizzare l'azione save_post e isolare la tua operazione verificando il tipo di post, poiché questa viene eseguita su tutti i tipi di post. Ovviamente dovrai implementare ulteriore logica per farlo funzionare nel tuo caso specifico. Probabilmente dovresti impostare un campo post meta che verifichi se hai già impostato i valori predefiniti, per evitare di frustrare gli utenti che desiderano lasciare vuoto un campo post meta.

Se desideri che i valori predefiniti siano null (come nel tuo esempio di codice), allora non creare una funzione perché questo aggiungerebbe solo overhead e i campi post meta non sono popolati con valori per impostazione predefinita.

function register_custom_fields( $post_ID ) {
    //Effettua qui il controllo del nonce
    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');
25 set 2011 07:42:46
0

se qualcuno ha bisogno di ottenere un campo personalizzato per tipo di post, lascio qui sotto il codice che ho usato e che 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');

19 mag 2016 21:27:35