Crear un campo personalizado con menú desplegable en la página de nuevo post

23 dic 2012, 15:22:03
Vistas: 14.4K
Votos: 4

Estoy intentando crear un campo personalizado por defecto con un menú desplegable que muestre valores precargados desde la base de datos, visible al crear un nuevo Post o editar uno existente.

Sé cómo añadir un campo personalizado simple y he agregado algunos como sigue:

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

Esto funciona bien para mí y puedo ver el campo personalizado con su valor por defecto, pero no estoy seguro de cómo añadir un menú desplegable en lugar de un campo de texto simple. Intenté algo como esto pero parece que no funciona:

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

Debido a mi falta de conocimiento, no estoy seguro de dónde estoy fallando o qué necesito hacer para lograr esta tarea.

2
Comentarios

¿De qué manera no está funcionando?

s_ha_dum s_ha_dum
23 dic 2012 17:20:46

@s_ha_dum: el menú desplegable no se muestra

Umesh Awasthi Umesh Awasthi
23 dic 2012 20:01:13
Todas las respuestas a la pregunta 3
0

En lugar de definir valores predeterminados para campos personalizados, deberías hacer como dice Milo. Deberías tener algo como esto en tu functions.php. Intenté seguir lo que necesitas, pero no lo he probado.

<?php

// acción para añadir meta boxes
add_action( 'add_meta_boxes', 'voodoo_dropdown_metabox' );
// acción al guardar el post
add_action( 'save_post', 'voodoo_dropdown_save' );

// función que crea el nuevo metabox que se mostrará en el post
function voodoo_dropdown_metabox() {
    add_meta_box( 
        'voodoo_dropdown',  // ID único
        __( 'Desplegable Voodoo', 'mytheme_textdomain' ),  // título del metabox
        'voodoo_dropdown_display',  // callback para mostrar el desplegable
        'post'   // tipo de post
    );
}

// visualización del desplegable voodoo
function voodoo_dropdown_display( $post ) {

  // Usar nonce para verificación
  wp_nonce_field( basename( __FILE__ ), 'voodoo_dropdown_nonce' );

  // obtener valor actual
  $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'; ?>>Canadá</option>
        <option value="Mexico" <?php if($dropdown_value == 'Mexico') echo 'selected'; ?>>MÉXICO</option>
    </select>
  <?php
}

// guardado del desplegable
function voodoo_dropdown_save( $post_id ) {

    // si se está haciendo autoguardado, no hacer nada
  if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
      return;

  // verificar nonce
  if ( !wp_verify_nonce( $_POST['voodoo_dropdown_nonce'], basename( __FILE__ ) ) )
      return;


  // Verificar permisos
  if ( 'page' == $_POST['post_type'] ) 
  {
    if ( !current_user_can( 'edit_page', $post_id ) )
        return;
  }
  else
  {
    if ( !current_user_can( 'edit_post', $post_id ) )
        return;
  }

  // guardar el nuevo valor del desplegable
  $new_value = $_POST['voodoo_dropdown'];
  update_post_meta( $post_id, 'voodoo_dropdown', $new_value );
}
?>

Si crees que esto es demasiado complicado, puedes usar un plugin de metaboxes, busca uno en el directorio de plugins de WordPress que ya incluya desplegables.

23 dic 2012 19:07:30
0

Añade tu menú desplegable a la pantalla de edición de entradas en una caja meta mediante add_meta_box, luego en la acción save_post puedes verificar y guardar la opción seleccionada como meta de la entrada.

23 dic 2012 18:28:20
0

En una ocasión trabajé en un requisito similar, este es el código básico para eso, espero que te ayude.

<?php
add_action( 'add_meta_boxes', 'yss_custom_post_cat_add' );
function yss_custom_post_cat_add() {
 add_meta_box( 'my-meta-box-id', 'Mi Categoría Personalizada de Entrada', '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">Selecciona tu Categoría Personalizada de Entrada</label>
    <br>
    <select name="custom_post_cat_select" id="custom_post_cat_select">
     <option value="picture" <?php selected( $selected, 'none' ); ?>>(ninguna)</option>
     <option value="picture" <?php selected( $selected, 'picture' ); ?>>Imagen</option>
     <option value="video" <?php selected( $selected, 'video' ); ?>>Video</option>
     <option value="sports" <?php selected( $selected, 'sports' ); ?>>Deportes</option>
     <option value="guesswho" <?php selected( $selected, 'guesswho' ); ?>>Adivina Quién</option>
     <option value="decisionpoll" <?php selected( $selected, 'decisionpoll' ); ?>>Encuesta de Decisión</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 ) {
 // Cancelar si estamos haciendo un guardado automático
 if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
 // si nuestro nonce no está ahí, o no podemos verificarlo, cancelar
 if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'my_meta_box_nonce' ) ) return;
 // si nuestro usuario actual no puede editar esta entrada, cancelar
 if( !current_user_can( 'edit_post' ) ) return;
 // ahora podemos guardar los datos
 $allowed = array(
            'a' => array( // permitir solo etiquetas a
            'href' => array() // y esos anchors solo pueden tener atributo href
    )
 );

// Probablemente sea buena idea asegurarse de que tus datos están establecidos
 if( isset( $_POST['custom_post_cat_select'] ) )
  update_post_meta( $post_id, 'custom_post_cat_select', esc_attr( $_POST['custom_post_cat_select'] ) );
}
?>
16 sept 2013 12:09:53