it-swarm-es.com

Metabox personalizado con taxonomía desplegable: problema de ahorro

Mi objetivo era simple: crear un tipo de publicación personalizada con un metabox personalizado con una simple lista desplegable de términos de taxonomía en lugar de utilizar las etiquetas o casillas de verificación. El motivo fue garantizar que el editor solo pueda seleccionar un solo término de la lista de taxonomía.

Después de la prueba y el error, finalmente logré encontrar una forma de utilizar las excelentes herramientas de creación de metabox que estoy usando de WP-Alchemy (http://farinspace.com/wpalchemy-metabox/) para crear mi metabox y hacer que muestre el términos en una lista desplegable.

El problema que tengo es que parece que no puedo obtener una nueva selección del menú desplegable para guardar el valor seleccionado.

Para que quede claro ... es importante que solo se asocie un solo término a cada publicación en este tipo de publicación personalizada, lo que significa que cada vez que se seleccione un valor diferente en el menú desplegable y se guarde la publicación, es necesario asegurarse de que no se haya registrado la selección anterior.

Como se mencionó, actualmente lo tengo mostrando la lista de términos en un menú desplegable y también lo tengo mostrando correctamente cualquier término que pueda estar asociado.

Solo el ahorro de los nuevos valores es donde estoy teniendo problemas.

A partir de una extensa investigación, "parece" que la solución involucra el uso de las funciones wordpress "wp_set_post_terms" que se explican aquí: http://codex.wordpress.org/Function_Reference/wp_set_post_terms Sin embargo, no estoy seguro de cómo utilizarlo correctamente Para lograr mi resultado deseado.

A continuación he incluido el código que estoy utilizando. Es muy posible que haya una mejor manera de hacer esto y agradecería cualquier sugerencia que puedan tener para asegurarnos de que se realicen las "comprobaciones" correspondientes para garantizar que los usuarios que no están autorizados no puedan insertar datos.

FUNCTIONS.PHP ARCHIVO (MUESTRA LA CREACIÓN DEL PERSONALIZADO POST TIPO Y TAXONOMÍA A CONTINUACIÓN.

//////////////////////////////////////////////////////////////////////////////
// CUSTOM POSTTYPE FOR -- SERVICES  
//////////////////////////////////////////////////////////////////////////////

add_action('init', 'services');
function services() {
 register_post_type('services', array(
  'labels' => array(
   'name'   => __('Services'),
   'singular_label'  => __('Service'),
   'new_item'   => __('Add a Service'),
   'add_new'   => __('Add a Service'),
   'add_new_item'  => __('Add a Service'),
   'edit'   => __('Edit Service'),
   'edit_item'   => __('Edit Service'),
   'view'   => __('View Service'),
   'view_item'   => __('View Service'),
   'search_items'  => __('Search Services'),
   'not_found'   => __('No Services Found'),
   'not_found_in_trash' => __('No Services Found in Trash'),
       'parent_item'  => __('Parent Service'),
   'parent_item_colon' => __('Parent Service:')
   ),
  'can_export'    => true,
  'menu_position'   => 7,
  'public'    => false,
  'show_ui'    => true,
  'publicly_queryable'  => true,
  'hierarchical'   => true,
  'query_var'    => true,
  'capability_type'   => 'post',
  'exclude_from_search'  => false,
  'supports' => array(
   'title',
   'editor',
   'revisions',
   'page-attributes'
   ),
  'rewrite' => array( 
   'slug'   => 'disability-services', 
   'with_front'   => false
   )
 ));
}

AQUÍ IS DONDE INSCRIBO LA TAXONOMÍA EN LA QUE ESTOY TRATANDO PARA TRABAJAR

// CUSTOM TAXONOMY METABOX POSTTYPE - AGE GROUPS
   register_taxonomy('theme', array('services'), array(
    'hierarchical'          => false, 
    'singular_label'            => 'Age Group', 
    'query_var'                 => 'theme',
    'public'                => true,
    'show_ui'               => true,
    'show_tagcloud'             => false,
    'show_in_nav_menus'             => true,    
    'rewrite'               => array( 'slug' => 'age-groups', 'with_front' => false ),
    'labels' => array(
        'name'          => __( 'Age Groups' ),
        'singular_name'         => __( 'Age Groups' ),
        'search_items'      => __( 'Search Age Groups' ),
        'all_items'             => __( 'All Age Groups' ),
        'parent_item'       => __( 'Parent Age Group' ),
        'parent_item_colon'         => __( 'Parent Age Group:' ),
        'edit_item'             => __( 'Edit Age Group' ), 
        'update_item'       => __( 'Update Age Group' ),
        'add_new_item'      => __( 'Add Age Group' ),
        'new_item_name'         => __( 'New Name of Age Group' ),
        'popular_items'         => __( 'Popular Age Groups' ),
        'separate_items_with_commas'=> __( 'Separate Age Groups with commas' ),
        'add_or_remove_items'   => __( 'Add or remove Age Groups' ),
        'choose_from_most_used' => __( 'Select Popular Age Groups' ), 
        ),
   ));
   wp_insert_term('Kids', 'theme');
   wp_insert_term('Teens', 'theme');
   wp_insert_term('Adults', 'theme');

ESTE IS EL RESTANTE DEL CÓDIGO QUE ESTÉ UTILIZANDO EN EL ARCHIVO DE FUNCIONES Y EL CÓDIGO PARA CREAR EL METABOX BASADO EN WPALECHEMY. En este intento, intenté incluir 'save_filter' => "wp_set_post_terms ($ post-> ID, 'theme')", con la esperanza de que esto guarde los datos aplicables pero no lo hizo.

// CUSTOM METABOX POSTTYPE - SERVICE DETAILS
   $custom_metabox_service_details = new WPAlchemy_MetaBox(array (
    'id'        => '_service_details-metaboxes',        // underscore prefix hides fields from the custom fields area
    'title'     => 'Age Groups',            // title added automatically to the custom metabox
    'types'     => array('services'),           // added only for custom post type "name-of-post-type" can also be "page" or "post"
    'context'   => 'normal',                    // same as above, defaults to "normal" but can use "advanced" or "side"
    'priority'  => 'high',                  // same as above, defaults to "high" but can use "low" as well
    'mode'  => WPALCHEMY_MODE_EXTRACT,
    'save_filter' => "wp_set_post_terms( $post->ID, 'theme' )",
    'template'  => TEMPLATEPATH . '/admin-metabox/service_details-metaboxes.php'  // contents for the meta box
    ));

TAMBIÉN DEBERÍA TENER EN CUENTA QUE DIMAS SOBRE AT WPALECHMEY SOLO HA AGREGADO ALGUNO NUEVO CÓDIGO EN SU 1.3.2 VERSIÓN DE GITHUB QUE PERMITE QUE EL CÓDIGO ANTERIOR INCLUYA A

'save_filter' => "custom-function", 

Este código le permite crear una función personalizada o supongo que llamar a una función personalizada que se ejecuta al presionar el botón de publicación, ¿tal vez esa es la mejor manera de guardar los datos?

En cualquier caso, estoy utilizando el siguiente código para que el metabox personalizado muestre la lista desplegable real que muestra los términos de taxonomía.

<?php 
// This function gets called in edit-form-advanced.php
echo '<input type="hidden" name="taxonomy_noncename" id="taxonomy_noncename" value="' . wp_create_nonce( 'taxonomy_theme' ) . '" />';

// Get all theme taxonomy terms
$themes = get_terms('theme', 'hide_empty=0'); 
?>

<select name='post_theme' id='post_theme'>
// DISPLAY TERMS AS DROP DOWN OPTIONS
<?php $names = wp_get_object_terms($post->ID, 'theme'); ?>
<option class='theme-option' value='' <?php if (!count($names)) echo "selected";?>>None</option>
<?php foreach ($themes as $theme) {
 if (!is_wp_error($names) && !empty($names) && !strcmp($theme->slug, $names[0]->slug)) 
 echo "<option class='theme-option' value='" . $theme->slug . "' selected>" . $theme->name . "</option>\n"; 
 else
 echo "<option class='theme-option' value='" . $theme->slug . "'>" . $theme->name . "</option>\n"; 
}
?>
</select>

Supongo que guardar los datos debería ser simple, pero creo que me estoy confundiendo sobre cómo lograr esto.

Como se mencionó, agradecería que también brindara sugerencias sobre el código para garantizar que se realicen las comprobaciones necesarias para garantizar que los datos se guarden correctamente y que solo sean las personas autorizadas correctamente.

Deben agradecer de antemano!

3
NetConstructor.com

Para cualquier persona interesada, respondí esta pregunta en otra publicación:

Términos de ahorro de taxonomía

1
NetConstructor.com