web-dev-qa-db-fra.com

Metabox personnalisé avec liste déroulante de taxonomie - Problème d'enregistrement

Mon objectif était simple: créer un type de publication personnalisé avec une métabox personnalisée avec une simple liste déroulante de termes de taxonomie au lieu d'utiliser les balises ou les cases à cocher. La raison était de s'assurer que l'éditeur ne peut sélectionner qu'un seul terme de la liste de taxonomie.

Après des essais et des erreurs, j'ai finalement trouvé un moyen d'utiliser les excellents outils de création de métabox que j'utilise depuis WP-Alchemy (http://farinspace.com/wpalchemy-metabox/) pour créer mon métabox et de l'afficher termes dans une liste déroulante.

Le problème que je rencontre est que je n'arrive pas à obtenir une nouvelle sélection dans le menu déroulant pour enregistrer la valeur sélectionnée.

Pour être clair ... il est important qu'un seul terme soit associé à chaque publication dans ce type de publication personnalisé, ce qui signifie que chaque fois qu'une valeur différente est sélectionnée dans le menu déroulant et que la publication est enregistrée, elle doit être préservée pour que la sélection précédente soit non enregistrée.

Comme mentionné, je l'ai actuellement en train d'afficher la liste des termes dans un menu déroulant et de l'afficher correctement, quel que soit le terme associé.

Ce n’est que l’économie des nouvelles valeurs qui pose problème.

D'après des recherches approfondies, il semble "que" la solution implique l'utilisation des fonctions wordpress "wp_set_post_terms", qui sont expliquées plus en détail ici: http://codex.wordpress.org/Function_Reference/wp_set_post_terms Cependant, je ne sais pas comment l'utiliser correctement pour obtenir le résultat souhaité.

Ci-dessous, j'ai inclus le code que j'utilise. Il est très possible qu'il existe un meilleur moyen de le faire et j'apprécierais toutes les suggestions que vous auriez pu faire pour que les "contrôles" applicables soient effectués afin d'éviter que les données ne soient insérées par des utilisateurs non autorisés.

FUNCTIONS.PHP FILE (MONTRE LA CRÉATION DU CUSTOM POST TYPE ET TAXONOMIE CI-DESSOUS.

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

ICI IS O JE SUIS ENREGISTRE DE LA TAXONOMIE, J'ESSAIE DE TRAVAILLER

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

CECI IS LE RESTE DU CODE QUE J'UTILISE DANS LE FICHIER DE FONCTIONS ET LE CODE POUR CRÉER LE MÉTABOX À PARTIR DE WPALECHEMY. Dans cette tentative, j'ai essayé d'inclure 'save_filter' => "wp_set_post_terms ($ post-> ID, 'theme')", avec l'espoir que cela sauvegarderait les données applicables mais ce ne fut pas le cas.

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

J’aimerais également noter que DIMAS OVER AT WPALECHMEY A JUSTE AJOUTÉ UN NOUVEAU CODE DANS SA VERSION 1.3.2 DE GITHUB QUI PERMET AU CODE SUSMEN COMPRIS D’INCLURE UN

'save_filter' => "custom-function", 

Ce code vous permet de créer une fonction personnalisée ou d’appeler une fonction personnalisée qui s’exécute en appuyant sur le bouton Publier. C’est peut-être le meilleur moyen de sauvegarder les données?

Dans tous les cas, j'utilise le code suivant pour la métabox personnalisée pour afficher la liste déroulante réelle affichant les termes de taxonomie.

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

Je suppose que la sauvegarde des données devrait être simple comme bonjour, mais je suppose que je ne comprends pas comment y parvenir.

Comme mentionné, je vous serais reconnaissant de bien vouloir également fournir des suggestions sur le code afin de garantir que toutes les vérifications nécessaires sont effectuées afin de garantir que les données sont correctement enregistrées et que seules les personnes dûment autorisées sont enregistrées.

Doit merci d'avance!

3
NetConstructor.com

Pour ceux qui sont intéressés, j'ai répondu à cette question sur un autre post:

Enregistrement des termes de taxonomie

1
NetConstructor.com