Frage

Mein Ziel war einfach ---, um einen benutzerdefinierten Post-Typ mit einem benutzerdefinierten Metabox mit einer einfachen Dropdown-Liste von Taxonomiebegriffen zu erstellen, anstatt die Tags oder Kontrollkästchen zu verwenden. Der Grund war, sicherzustellen, dass der Editor nur einen einzigen Begriff aus der Taxonomieliste auswählen kann.

Nach Versuch und Irrtum habe ich es endlich geschafft, einen Weg zu finden, um die hervorragenden Tools für die Erstellung von Metaboxen zu verwenden, die ich von WP-Alchemy (http://farinspace.com/wpalchemy-metabox/) verwende Begriffe in einer Dropdown -Liste.

Das Problem, das ich habe, ist, dass ich aus dem Dropdown -Menü keine neue Auswahl erhalten kann, um den ausgewählten Wert zu speichern.

Um klar zu sein ... Es ist wichtig, dass jeder Beitrag in diesem benutzerdefinierten Post -Typ nur ein einzelner Begriff zugeordnet wird, was bedeutet, dass wenn immer ein anderer Wert aus dem Dropdown -Menü ausgewählt wird und der Beitrag gespeichert wird, um sicherzustellen, dass die vorherige Auswahl nicht registriert ist.

Wie bereits erwähnt, habe ich derzeit die Liste der Begriffe in einem Dropdown -Bereich und ich habe auch korrekt angezeigt, wie der Begriff zugeordnet ist.

Nur das Speichern der neuen Werte ist, wo ich Probleme habe.

Aus umfangreichen Forschungsergebnissen scheint es "wie die Lösung die Verwendung der WordPress" WP_SET_POST_TERMS "-Funktionen zu verwenden, was hier weiter erklärt wird:http://codex.wordpress.org/function_reference/wp_set_post_termsIch bin mir jedoch nicht sicher, wie ich es richtig einsetzen soll, um mein gewünschtes Ergebnis zu erzielen.

Im Folgenden habe ich den Code, den ich verwende. Es ist sehr möglich, dass es eine bessere Möglichkeit gibt, dies zu tun, und ich würde mich an alle Vorschläge freuen, die ihr vielleicht auch sicherstellen könnte, dass die anwendbaren "Überprüfungen" durchgeführt werden, um sicherzustellen, dass Daten nicht von Benutzern eingefügt werden, die nicht autorisiert sind.

Funktionen.php -Datei (zeigt die Erstellung des benutzerdefinierten Post -Typs und der Taxonomie unten.

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

Hier regiere ich die Taxonomie, mit der ich arbeiten möchte

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

Dies ist der Rest des Code, den ich in der Funktionsdatei verwende, und des Code, um das Metabox basierend auf Wpalechemy zu erstellen. In diesem Versuch habe ich versucht, 'Save_filter' => "wp_set_post_terms ($ post-> id, 'thema') einzuschließen, mit der Hoffnung, dass dies die anwendbaren Daten speichern würde, dies jedoch nicht.

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

Ich sollte auch beachten, dass Dimas bei Wpalechmey nur einen neuen Code in seine 1.3.2 -Version von GitHub hinzugefügt hat, mit der der obige Code a einbezogen wird

'save_filter' => "custom-function", 

Mit diesem Code können Sie eine benutzerdefinierte Funktion erstellen, oder rufen Sie wohl eine benutzerdefinierte Funktion auf, die beim Drücken der Schaltfläche Veröffentlichung ausgeführt wird. Vielleicht ist dies möglicherweise der beste Weg, um die Daten zu speichern?

In jedem Fall verwende ich den folgenden Code für das benutzerdefinierte Metabox, um die tatsächliche Dropdown -Liste anzuzeigen, in der die Taxonomie -Begriffe angezeigt werden.

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

Ich gehe davon aus, dass das Speichern der Daten einfach sein sollte wie Kuchen, aber ich denke, ich verwechsle mich selbst, wie ich dies erreichen kann.

Wie bereits erwähnt, würde ich mich freuen, wenn Sie auch Vorschläge zum Code vorlegen könnten, um sicherzustellen, dass die erforderlichen Überprüfungen durchgeführt werden, um sicherzustellen, dass die Daten korrekt gespeichert werden und nur die richtig autorisierten Personen sind.

Muss im Voraus danken!

War es hilfreich?

Lösung

Für alle, die interessiert sind, habe ich diese Frage in einem anderen Beitrag beantwortet:

Sparen von Taxonomie

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top