web-dev-qa-db-de.com

Tag-Schnittstelle für hierarchische Taxonomie verwenden?

Kundenspezifische Taxonomien sind großartig. Ich habe eine Reihe neuer Taxonomien registriert und einen Importer geschrieben, der unsere hierarchische Taxonomie in WordPress a la XML importiert. Das Problem ist, dass eine Taxonomie ungefähr 1.100 Begriffe hat und das Durchsuchen einer Checkliste mit 1.100 Dingen grausam und ungewöhnlich ist.

Gibt es eine Möglichkeit, eine hierarchische Taxonomie zu haben, aber stattdessen die Tag-Schnittstelle (Suchfeld mit automatischer Vervollständigung) zu verwenden?

Update:Dieser Code aus Bainternets Antwort findet den größten Weg dorthin (fügt eine Tag-Schnittstelle für die angegebene Taxonomie hinzu, mit funktionierender Autovervollständigung und korrekt ausgefüllter "am häufigsten verwendeter" Tag-Wolke), aber Begriffe werden nicht gespeichert auf dem Post speichern. Wenn der Beitrag zuvor Begriffe enthielt, werden diese beim Speichern gelöscht. Deshalb suche ich immer noch nach einer Antwort. (Derselbe Code speichert Begriffe in Ordnung, wenn die Taxonomie mit hierarchichalset auf false registriert ist. Der springende Punkt ist jedoch, die Tag-Schnittstelle für eine hierarchische Taxonomie zu verwenden.)

//remove default metabox
//change TAXONOMY_NAME to your taxonomy name
add_action( 'admin_menu' , 'remove_post_custom_fields' );
function remove_post_custom_fields() {
    remove_meta_box( 'issuediv' , 'post' , 'normal' ); 
}



//add our custom meta box
add_action( 'add_meta_boxes', 'my_add_custom_box' );

 function my_add_custom_box() {
    add_meta_box( 
//      'myplugin_sectionid',
        'tagsdiv-issue',
        __( 'New and Improved Issue Tags', 'textdomain' ),
        'tags_like_custom_tax',
        'post' 
    );
 }

 //call back function to display the metabox
 //change TAXONOMY_NAME to your taxonomy name 
 function tags_like_custom_tax(){
     $tax_name = 'issue';
     global $post;
     $taxonomy = get_taxonomy($tax_name);
     $disabled = !current_user_can($taxonomy->cap->assign_terms) ? 'disabled="disabled"' : '';
     ?>
     <div class="tagsdiv" id="<?php echo $tax_name; ?>">
        <div class="jaxtag">
            <div class="nojs-tags hide-if-js">
                <p><?php echo $taxonomy->labels->add_or_remove_items; ?></p>
                <textarea name="<?php echo "tax_input[$tax_name]"; ?>" rows="3" cols="20" class="the-tags" id="tax-input-<?php echo $tax_name; ?>" <?php echo $disabled; ?>><?php echo get_terms_to_edit( $post->ID, $tax_name ); // textarea_escaped by esc_attr() ?></textarea>
            </div>
            <?php if ( current_user_can($taxonomy->cap->assign_terms) ) { ?>
            <div class="ajaxtag hide-if-no-js">
                <label class="screen-reader-text" for="new-tag-<?php echo $tax_name; ?>"><?php echo $taxonomy->labels->name; ?></label>
                <div class="taghint"><?php echo $taxonomy->labels->add_new_item; ?></div>
                <p><input type="text" id="new-tag-<?php echo $tax_name; ?>" name="newtag[<?php echo $tax_name; ?>]" class="newtag form-input-tip" size="16" autocomplete="off" value="" />
                <input type="button" class="button tagadd" value="<?php esc_attr_e('Add'); ?>" tabindex="3" /></p>
            </div>
            <p class="howto"><?php echo esc_attr( $taxonomy->labels->separate_items_with_commas ); ?></p>
            <?php } ?>
        </div>
        <div class="tagchecklist"></div>
    </div>
          <?php if ( current_user_can($taxonomy->cap->assign_terms) ) { ?>
            <p class="hide-if-no-js"><a href="#titlediv" class="tagcloud-link" id="link-<?php echo $tax_name; ?>"><?php echo $taxonomy->labels->choose_from_most_used; ?></a></p>
          <?php } 
}

Die ursprüngliche Frage ist aus dem Wordpress-Forum-Beitrag hier entlehnt.

3
supertrue

So habe ich es gemacht. Fügen Sie einfach eine Bedingung hinzu, die prüft, ob die geladene Seite eine Administratorseite ist oder nicht. Wenn es sich um eine Administrationsseite handelt, setzen Sie hierarchical auf false, andernfalls setzen Sie hierarchical auf true. Wie so:

$args = array( 
    'hierarchical' => true,
    'labels' => $labels,
    'show_ui' => true,
    'query_var' => true,
    'rewrite' => array( 
          'slug' => 'genre'
    ), 
 )

if( is_admin() ) {
    $args['hierarchical'] = false;
}

register_taxonomy('genre', array('book'), $args);

Das sollte dir die Idee geben. Der Nachteil dabei ist, dass Sie keine übergeordneten Beziehungen zu Begriffen über die Administrationsoberfläche hinzufügen können. Sie können in der Bedingung is_admin() eine genauere Angabe machen, z. B. nachsehen, ob die Anforderung post-new.php oder post.php enthält.

1
kingkool68

Die einzige Möglichkeit, die ich gefunden habe, besteht darin, die Standard-Metabox zu entfernen und eine eigene zu erstellen. Hier ist der verwendete Code:

//remove default metabox
//change TAXONOMY_NAME to your taxonomy name
add_action( 'admin_menu' , 'remove_post_custom_fields' );
function remove_post_custom_fields() {
    remove_meta_box( 'TAXONOMY_NAMEdiv' , 'post' , 'normal' ); 
}



//add our custom meta box
add_action( 'add_meta_boxes', 'my_add_custom_box' );

 function my_add_custom_box() {
    add_meta_box( 
        'myplugin_sectionid',
        __( 'My Taxonomy Section Title', 'textdomain' ),
        'tags_like_custom_tax',
        'post' 
    );
 }

 //call back function to display the metabox
 //change TAXONOMY_NAME to your taxonomy name 
 function tags_like_custom_tax(){
     $tax_name = 'TAXONOMY_NAME';
     global $post;
     $taxonomy = get_taxonomy($tax_name);
     $disabled = !current_user_can($taxonomy->cap->assign_terms) ? 'disabled="disabled"' : '';
     ?>
     <div class="tagsdiv" id="<?php echo $tax_name; ?>">
        <div class="jaxtag">
            <div class="nojs-tags hide-if-js">
                <p><?php echo $taxonomy->labels->add_or_remove_items; ?></p>
                <textarea name="<?php echo "tax_input[$tax_name]"; ?>" rows="3" cols="20" class="the-tags" id="tax-input-<?php echo $tax_name; ?>" <?php echo $disabled; ?>><?php echo get_terms_to_edit( $post->ID, $tax_name ); // textarea_escaped by esc_attr() ?></textarea>
            </div>
            <?php if ( current_user_can($taxonomy->cap->assign_terms) ) { ?>
            <div class="ajaxtag hide-if-no-js">
                <label class="screen-reader-text" for="new-tag-<?php echo $tax_name; ?>"><?php echo $box['title']; ?></label>
                <div class="taghint"><?php echo $taxonomy->labels->add_new_item; ?></div>
                <p><input type="text" id="new-tag-<?php echo $tax_name; ?>" name="newtag[<?php echo $tax_name; ?>]" class="newtag form-input-tip" size="16" autocomplete="off" value="" />
                <input type="button" class="button tagadd" value="<?php esc_attr_e('Add'); ?>" tabindex="3" /></p>
            </div>
            <p class="howto"><?php echo esc_attr( $taxonomy->labels->separate_items_with_commas ); ?></p>
            <?php } ?>
        </div>
        <div class="tagchecklist"></div>
    </div>
          <?php if ( current_user_can($taxonomy->cap->assign_terms) ) { ?>
            <p class="hide-if-no-js"><a href="#titlediv" class="tagcloud-link" id="link-<?php echo $tax_name; ?>"><?php echo $taxonomy->labels->choose_from_most_used; ?></a></p>
          <?php } 
}

Zum Speichern müssen Sie sich keine Gedanken machen, WordPress erledigt das für Sie.

Update , ich habe es gerade mit Kategorien getestet und es funktioniert gut:

enter image description here

1
Bainternet

Ich denke, wir können eine versteckte Eingabe hinzufügen, die den term_id des ausgewählten Tags über jQuery (AJAX) abruft und ihn mit der Funktion wp_set_object_terms als Post-Begriff speichert.

Ich habe eine weitere Frage zu diesem Problem gestellt: WP native tag suggest metabox. Wie wird die Tag-ID verarbeitet?

0
Adige72

Ich finde eine Lösung, wiedie Tag-Schnittstelle für eine hierarchische Taxonomie verwendet wird.

Als erstes müssen wir die Funktion is_edit_page () erstellen:

/**
 * is_edit_page 
 * function to check if the current page is a post edit page
 * 
 * @author Ohad Raz <[email protected]>
 * 
 * @param  string  $new_edit what page to check for accepts new - new post page ,edit - edit post page, null for either
 * @return boolean
 */
function is_edit_page($new_edit = null){
    global $pagenow;
    //make sure we are on the backend
    if (!is_admin()) return false;


    if($new_edit == "edit")
        return in_array( $pagenow, array( 'post.php',  ) );
    elseif($new_edit == "new") //check for new post page
        return in_array( $pagenow, array( 'post-new.php' ) );
    else //check for either new or edit
        return in_array( $pagenow, array( 'post.php', 'post-new.php' ) );
}

* Code aus hier .

Jetzt können Sie den Code von kingkool68 verwenden:

$args = array(
    //...
    'hierarchical' => true,
    //...
);
if( is_edit_page() ) {
    $args['hierarchical'] = false;
}

Die hierarchische Struktur wird gespeichert, Taxonomien werden jedoch auf Bearbeitungsseiten wie Tags (durch Kommas getrennt) angezeigt.

0
Bogdan