Creare câmp personalizat cu meniu derulant în pagina de postare nouă
Încerc să creez un câmp personalizat implicit cu meniu derulant care să afișeze valori predefinite din baza de date atunci când creez o postare nouă sau editez una existentă.
Sunt conștient de cum să adaug un câmp personalizat simplu și am adăugat câteva după cum urmează:
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);
}
}
Aceasta funcționează corect pentru mine și pot vedea câmpul personalizat cu valoarea implicită, dar nu sunt sigur cum să adaug un meniu derulant în locul unui simplu câmp text. Am încercat ceva de genul acesta, dar se pare că nu funcționează:
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 ;
}
Din cauza lipsei de cunoștințe, nu sunt sigur unde greșesc sau ce trebuie făcut pentru a realiza această sarcină.

În loc să definiți valori implicite pentru câmpurile personalizate, ar trebui să faceți cum spune Milo. Ar trebui să aveți ceva de genul acesta în functions.php. Am încercat să urmez ceea ce aveți nevoie, dar nu l-am testat.
<?php
// acțiune pentru adăugarea de metabox-uri
add_action( 'add_meta_boxes', 'voodoo_dropdown_metabox' );
// acțiune la salvarea postării
add_action( 'save_post', 'voodoo_dropdown_save' );
// funcție care creează noul metabox care va apărea pe postare
function voodoo_dropdown_metabox() {
add_meta_box(
'voodoo_dropdown', // id unic
__( 'Voodoo Dropdown', 'mytheme_textdomain' ), // titlul metabox-ului
'voodoo_dropdown_display', // callback pentru afișarea dropdown-ului
'post' // tipul de postare
);
}
// afișarea dropdown-ului voodoo
function voodoo_dropdown_display( $post ) {
// Utilizați nonce pentru verificare
wp_nonce_field( basename( __FILE__ ), 'voodoo_dropdown_nonce' );
// obțineți valoarea curentă
$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'; ?>>MEXICO</option>
</select>
<?php
}
// salvarea dropdown-ului
function voodoo_dropdown_save( $post_id ) {
// dacă se face autosave, nu faceți nimic
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
// verificați nonce
if ( !wp_verify_nonce( $_POST['voodoo_dropdown_nonce'], basename( __FILE__ ) ) )
return;
// Verificați permisiunile
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ți noua valoare a dropdown-ului
$new_value = $_POST['voodoo_dropdown'];
update_post_meta( $post_id, 'voodoo_dropdown', $new_value );
}
?>
Dacă credeți că acest lucru este prea complicat, puteți utiliza un plugin pentru metabox-uri, găsiți unul în directorul de plugin-uri WordPress care are deja dropdown-uri.

Adaugă dropdown-ul tău în ecranul de editare a postărilor într-o cutie meta folosind add_meta_box
, apoi în acțiunea save_post
poți verifica și salva opțiunea selectată ca meta pentru postare.

Odată am lucrat la o cerință similară, acesta este un cod brut pentru aceasta, sper că te va ajuta.
<?php
add_action( 'add_meta_boxes', 'yss_custom_post_cat_add' );
function yss_custom_post_cat_add() {
add_meta_box( 'my-meta-box-id', 'Categoria Mea Personalizată de Postări', 'yss_custom_post_cat', 'post', 'normal', 'high' );
}
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">Selectează categoria personalizată de postări</label>
<br>
<select name="custom_post_cat_select" id="custom_post_cat_select">
<option value="picture" <?php selected( $selected, 'none' ); ?>>(niciuna)</option>
<option value="picture" <?php selected( $selected, 'picture' ); ?>>Imagine</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' ); ?>>Ghicește Cine</option>
<option value="decisionpoll" <?php selected( $selected, 'decisionpoll' ); ?>>Sondaj de Decizie</option>
<option value="audio" <?php selected( $selected, 'audio' ); ?>>Audio</option>
</select>
</p>
<?php
}
add_action( 'save_post', 'yss_custom_post_cat_save' );
function yss_custom_post_cat_save( $post_id ) {
// Opriți dacă suntem în auto-salvare
if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
// dacă nonce-ul nostru nu este acolo sau nu îl putem verifica, opriți
if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'my_meta_box_nonce' ) ) return;
// dacă utilizatorul curent nu poate edita acest post, opriți
if( !current_user_can( 'edit_post' ) ) return;
// acum putem salva datele
$allowed = array(
'a' => array( // permitem doar tag-uri a
'href' => array() // iar aceste ancore pot avea doar atributul href
)
);
// Probabil că este o idee bună să vă asigurați că datele sunt setate
if( isset( $_POST['custom_post_cat_select'] ) )
update_post_meta( $post_id, 'custom_post_cat_select', esc_attr( $_POST['custom_post_cat_select'] ) );
}
?>
