È possibile impostare campi personalizzati predefiniti durante la creazione di un articolo?
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:
Vorrei ottenere qualcosa come:
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?

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):
- WordPress carica il file
post-new.php
- Questo file genera un post predefinito nel database alla riga
39
con la funzioneget_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. - 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 parametrosupports
del tipo di post. - Alla riga
136
viene incluso il metabox dei campi personalizzatipostcustom
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()
}

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)

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

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

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

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

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

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

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