Creare un campo personalizzato con dropdown nella pagina di nuovo articolo
Sto cercando di creare un campo personalizzato predefinito con un menu a discesa contenente valori precompilati dal database da mostrare durante la creazione di un nuovo articolo o la modifica di uno esistente.
Conosco già come aggiungere un singolo campo personalizzato e ne ho aggiunti alcuni come segue:
add_action('wp_insert_post', 'set_default_custom_fields');
function set_default_custom_fields($post_id) {
if ( $_GET['post_type'] != 'page' ) {
add_post_meta($post_id, 'email', 'xyz@mail.com', true);
}
}
Questo funziona bene per me e riesco a vedere il campo personalizzato con il valore predefinito, ma non sono sicuro di come aggiungere un menu a discesa al posto di un singolo campo di testo. Ho provato qualcosa del genere ma sembra non funzionare:
add_action('wp_insert_post', 'set_default_custom_fields');
function set_default_custom_fields($post_id) {
if ( $_GET['post_type'] != 'page' ) {
<select name="voodoo_dropdown" id="voodoo_dropdown">
<option<?php selected( add_post_meta($post->ID, 'voodoo_dropdown', true), 'USA' ); ?>>USA</option>
<option<?php selected( add_post_meta($post->ID, 'voodoo_dropdown', true), 'Canada' ); ?>>Canada</option>
<option<?php selected( add_post_meta($post->ID, 'voodoo_dropdown', true), 'Mexico' ); ?>>Mexico</option>
</select>
}
return ;
}
A causa della mia scarsa conoscenza non sono sicuro di dove sto sbagliando o cosa devo fare per completare questo compito.

Invece di definire i valori predefiniti per i campi personalizzati, dovresti fare come dice Milo. Dovresti avere qualcosa come questo nel tuo functions.php. Ho cercato di seguire ciò di cui hai bisogno, ma non l'ho testato.
<?php
// azione per aggiungere meta box
add_action( 'add_meta_boxes', 'voodoo_dropdown_metabox' );
// azione al salvataggio del post
add_action( 'save_post', 'voodoo_dropdown_save' );
// funzione che crea il nuovo metabox che verrà mostrato nel post
function voodoo_dropdown_metabox() {
add_meta_box(
'voodoo_dropdown', // id univoco
__( 'Voodoo Dropdown', 'mytheme_textdomain' ), // titolo del metabox
'voodoo_dropdown_display', // callback per mostrare il dropdown
'post' // tipo di post
);
}
// visualizzazione del dropdown voodoo
function voodoo_dropdown_display( $post ) {
// Usa nonce per la verifica
wp_nonce_field( basename( __FILE__ ), 'voodoo_dropdown_nonce' );
// ottieni il valore corrente
$dropdown_value = get_post_meta( get_the_ID(), 'voodoo_dropdown', true );
?>
<select name="voodoo_dropdown" id="voodoo_dropdown">
<option value="USA" <?php if($dropdown_value == 'USA') echo 'selected'; ?>>USA</option>
<option value="Canada" <?php if($dropdown_value == 'Canada') echo 'selected'; ?>>Canada</option>
<option value="Mexico" <?php if($dropdown_value == 'Mexico') echo 'selected'; ?>>MESSICO</option>
</select>
<?php
}
// salvataggio del dropdown
function voodoo_dropdown_save( $post_id ) {
// se è in corso un autosave non fare nulla
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
// verifica il nonce
if ( !wp_verify_nonce( $_POST['voodoo_dropdown_nonce'], basename( __FILE__ ) ) )
return;
// Controlla i permessi
if ( 'page' == $_POST['post_type'] )
{
if ( !current_user_can( 'edit_page', $post_id ) )
return;
}
else
{
if ( !current_user_can( 'edit_post', $post_id ) )
return;
}
// salva il nuovo valore del dropdown
$new_value = $_POST['voodoo_dropdown'];
update_post_meta( $post_id, 'voodoo_dropdown', $new_value );
}
?>
Se pensi che questo sia troppo complicato puoi usare un plugin per metabox, ne trovi uno nella directory dei plugin di Wordpress che ha già i dropdown.

Aggiungi il tuo menu a tendina alla schermata di modifica del post tramite una meta box usando add_meta_box
, quindi nell'azione save_post
puoi verificare e salvare l'opzione selezionata come meta del post.

Una volta ho lavorato su un requisito simile, questo è il codice grezzo per quello, spero che possa aiutare.
<?php
// Aggiunge un meta box per le categorie personalizzate dei post
add_action( 'add_meta_boxes', 'yss_custom_post_cat_add' );
function yss_custom_post_cat_add() {
add_meta_box( 'my-meta-box-id', 'Mia Categoria Personalizzata', 'yss_custom_post_cat', 'post', 'normal', 'high' );
}
// Mostra il metabox con le opzioni delle categorie
function yss_custom_post_cat( $post ) {
$values = get_post_custom( $post->ID );
$selected = isset( $values['custom_post_cat_select'] ) ? esc_attr( $values['custom_post_cat_select'][0] ) : '';
wp_nonce_field( 'my_meta_box_nonce', 'meta_box_nonce' );
?>
<p>
<label for="custom_post_cat_select">Seleziona la tua categoria personalizzata</label>
<br>
<select name="custom_post_cat_select" id="custom_post_cat_select">
<option value="picture" <?php selected( $selected, 'none' ); ?>>(nessuna)</option>
<option value="picture" <?php selected( $selected, 'picture' ); ?>>Immagine</option>
<option value="video" <?php selected( $selected, 'video' ); ?>>Video</option>
<option value="sports" <?php selected( $selected, 'sports' ); ?>>Sport</option>
<option value="guesswho" <?php selected( $selected, 'guesswho' ); ?>>Indovina Chi</option>
<option value="decisionpoll" <?php selected( $selected, 'decisionpoll' ); ?>>Sondaggio Decisionale</option>
<option value="audio" <?php selected( $selected, 'audio' ); ?>>Audio</option>
</select>
</p>
<?php
}
// Salva i dati della categoria personalizzata
add_action( 'save_post', 'yss_custom_post_cat_save' );
function yss_custom_post_cat_save( $post_id ) {
// Interrompi se è in corso un salvataggio automatico
if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
// Se il nonce non è presente o non può essere verificato, interrompi
if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'my_meta_box_nonce' ) ) return;
// Se l'utente corrente non può modificare questo post, interrompi
if( !current_user_can( 'edit_post' ) ) return;
// Array di elementi consentiti
$allowed = array(
'a' => array( // permette solo tag a
'href' => array() // e solo con attributo href
)
);
// Verifica che i dati siano impostati prima di salvare
if( isset( $_POST['custom_post_cat_select'] ) )
update_post_meta( $post_id, 'custom_post_cat_select', esc_attr( $_POST['custom_post_cat_select'] ) );
}
?>
