Afișarea unei taxonomii personalizate ca un dropdown în pagina de editare articole

24 apr. 2012, 16:16:46
Vizualizări: 22.5K
Voturi: 2

Când creezi o taxonomie personalizată, aparent singurele opțiuni sunt să o afișezi ca etichetă (non-ierarhică) sau categorie (ierarhică). Există vreo modalitate de a o afișa ca un meniu dropdown?

Înțeleg că acest lucru poate fi făcut folosind add_meta_box() și adăugând-o manual, dar caut o modalitate încorporată (dacă există), pentru a economisi mult cod! Mulțumesc.

0
Toate răspunsurile la întrebare 5
3
10

Puteți adăuga o nouă taxonomie cu propriul metabox începând cu WordPress 3.8 folosind meta_box_cb

"drop_cat()" - reconstruiește metabox-ul original de categorie din nucleu wp-admin/includes/meta-boxes.php

function realty_type() {
$args = array(
    'show_ui'                    => true,
    'meta_box_cb'                => 'drop_cat',
);
register_taxonomy( 'realty_type', array( 'YOUR_POST_TYPE' ), $args );

}

// Conectare la acțiunea 'init'
add_action( 'init', 'realty_type', 0 );


function drop_cat( $post, $box ) {
$defaults = array('taxonomy' => 'category');
if ( !isset($box['args']) || !is_array($box['args']) )
    $args = array();
else
    $args = $box['args'];
extract( wp_parse_args($args, $defaults), EXTR_SKIP );
$tax = get_taxonomy($taxonomy);
?>
<div id="taxonomy-<?php echo $taxonomy; ?>" class="acf-taxonomy-field categorydiv">

        <?php 
        $name = ( $taxonomy == 'category' ) ? 'post_category' : 'tax_input[' . $taxonomy . ']';
        echo "<input type='hidden' name='{$name}[]' value='0' />"; // Permite trimiterea unui set de termeni gol. 0 este un ID de Termen invalid și va fi ignorat de verificările empty().
        ?>
        <? $term_obj = wp_get_object_terms($post->ID, $taxonomy ); //_log($term_obj[0]->term_id)?>
        <ul id="<?php echo $taxonomy; ?>checklist" data-wp-lists="list:<?php echo $taxonomy?>" class="categorychecklist form-no-clear">
            <?php //wp_terms_checklist($post->ID, array( 'taxonomy' => $taxonomy) ) ?>
        </ul>

        <?php wp_dropdown_categories( array( 'taxonomy' => $taxonomy, 'hide_empty' => 0, 'name' => "{$name}[]", 'selected' => $term_obj[0]->term_id, 'orderby' => 'name', 'hierarchical' => 0, 'show_option_none' => '&mdash;' ) ); ?>

</div>
<?php
}
9 iun. 2014 02:45:50
Comentarii

Aceasta a funcționat bine pentru mine, dar a trebuit să fac o modificare în cod pentru WordPress 4.9.5 ... <?php wp_dropdown_categories( 'taxonomy' => $taxonomy, 'hide_empty' => 0, 'name' => "{$name}[]", 'selected' => $term_obj[0]->name, 'orderby' => 'name', 'hierarchical' => 0, 'show_option_none' => '—','option_none_value'=> '0', 'value_field' => 'name' ); ?>

Davey Davey
2 mai 2018 12:21:31

Acest cod va funcționa începând cu versiunea 3.8 și mai nouă

Alexufo Alexufo
3 mai 2018 12:34:23

a trebuit să înregistrezi un URL personalizat pentru tax_input pentru a redirecționa corect?

YarGnawh YarGnawh
6 iul. 2021 01:39:51
1

Uite codul:

<select>
    <?php
       $tax_terms = get_terms('numele_taxonomiei', array('hide_empty' => '0'));      
       foreach ( $tax_terms as $tax_term ):  
          echo '<option value="'.$tax_term->name.'">'.$tax_term->name.'</option>';   
       endforeach;
    ?>
</select> 

Șterge al doilea argument al variabilei $tax_terms dacă nu dorești să afișezi termenii goi.

De asemenea, folosește selected dacă vrei să salvezi opțiunea selectată :)

24 apr. 2012 16:32:29
Comentarii

Mulțumesc @Wordpressor - încerc să fac asta fără a fi nevoie să adaug vreun metabox pe pagina de editare a postării dacă se poate, așa că am căutat modalități integrate folosind funcția wp_register_taxonomy(). Voi actualiza întrebarea mea!

David Gard David Gard
24 apr. 2012 16:50:55
1

Din păcate, nu există nicio modalitate de a face acest lucru cu wp_register_taxonomy(). Atunci când înregistrezi o taxonomie, caseta metabox implicită este fie casete de bifat (ierarhică), fie ca un nor (neierarhică).

Singura soluție este să anulezi înregistrarea metabox-ului existent și să adaugi unul nou în locul lui. Prin imitarea atentă a metabox-ului 'implicit' – nu va trebui să procesezi datele manual, ci vei lăsa WordPress să se ocupe automat de adăugarea/ștergerea termenilor.

Detaliile despre cum să faci acest lucru sunt prezentate în acest răspuns. De asemenea, s-ar putea să găsești util acest depozit GitHub (care acum include posibilitatea de a crea termeni în timp real în noul metabox). Resursele menționate se referă la crearea unui metabox cu butoane radio, dar ar putea fi ușor adaptat pentru meniuri drop-down.

24 apr. 2012 20:44:10
Comentarii

Mulțumesc Stephen, exact ce mă temeam! Ar fi minunat dacă WP ar implementa asta în viitor, ar economisi mult cod pentru oameni ca mine. Mulțumesc din nou.

David Gard David Gard
25 apr. 2012 14:08:25
0

Aveam dificultăți cu codul furnizat de Alexufo, așa că l-am rescris pe baza funcției actualizate din WP 4.1.2. Iată funcția mea actualizată drop_cat:

// funcția de mai jos a fost adaptată din wp-admin/includes/meta-boxes.php - post_categories_meta_box()
function drop_cat( $post, $box ) {
    $defaults = array( 'taxonomy' => 'category' );
    if ( ! isset( $box['args'] ) || ! is_array( $box['args'] ) ) {
        $args = array();
    } else {
        $args = $box['args'];
    }
    $r = wp_parse_args( $args, $defaults );
    $tax_name = esc_attr( $r['taxonomy'] );
    $taxonomy = get_taxonomy( $r['taxonomy'] );
    ?>
    <div id="taxonomy-<?php echo $tax_name; ?>" class="categorydiv">

    <?php // am eliminat filele pentru cea mai recentă variantă aici ?>

        <div id="<?php echo $tax_name; ?>-all">
            <?php
            $name = ( $tax_name == 'category' ) ? 'post_category' : 'tax_input[' . $tax_name . ']';
            echo "<input type='hidden' name='{$name}[]' value='0' />"; // Permite trimiterea unui set de termeni gol. 0 este un ID de Termen invalid și va fi ignorat de verificările empty().
            ?>
            <ul id="<?php echo $tax_name; ?>checklist" data-wp-lists="list:<?php echo $tax_name; ?>" class="categorychecklist form-no-clear">
                <?php //wp_terms_checklist( $post->ID, array( 'taxonomy' => $tax_name, 'popular_cats' => $popular_ids ) ); ?>
            </ul>

            <?php $term_obj = wp_get_object_terms($post->ID, $tax_name ); //_log($term_obj[0]->term_id) ?>
            <?php wp_dropdown_categories( array( 'taxonomy' => $tax_name, 'hide_empty' => 0, 'name' => "{$name}[]", 'selected' => $term_obj[0]->term_id, 'orderby' => 'name', 'hierarchical' => 0, 'show_option_none' => "Selectează $tax_name" ) ); ?>

        </div>
    <?php if ( current_user_can( $taxonomy->cap->edit_terms ) ) : 
            // am eliminat codul pentru adăugarea dinamică de termeni aici, deoarece acest lucru adăuga o căsuță de selectare deasupra noului meniu drop-down, meniul drop-down ar trebui să fie re-randat dinamic pentru a afișa noul termen adăugat ?>
        <?php endif; ?>

        <p><a href="<?php echo site_url(); ?>/wp-admin/edit-tags.php?taxonomy=<?php echo $tax_name ?>&post_type=YOUR_POST_TYPE">Adaugă nou</a></p>
    </div>
    <?php
}

Singura problemă pe care o am (așa cum am indicat în comentariile din funcția de mai sus), este că nu pot folosi funcționalitatea de bază din WP pentru adăugarea de termeni/categorii în căsuța meta, deoarece implicit adaugă noii termeni ca o căsuță de selectare deasupra meniului meu de selectare. Pentru a funcționa cu un meniu de selectare, meniul va trebui să fie re-randat după adăugarea noului termen. Ceva ce sunt sigur că aș putea rezolva, dar voi lăsa pentru o altă zi.

15 mai 2015 03:29:42
0

Codul de mai sus avea câteva probleme la mine, permiteți-mi să pun codul corect care a funcționat pentru mine

 'meta_box_cb' => 'drop_cat',

definiția categoriei dumneavoastră, apoi puneți acest cod aici

nu uitați să adăugați

function drop_cat( $post, $box ) {
    if ( ! isset( $box['args'] ) || ! is_array( $box['args'] ) ) {
        $args = array();
    } else {
        $args = $box['args'];
    }
    $r = wp_parse_args( $args, $defaults );
    $tax_name = esc_attr( $r['taxonomy'] );
    $taxonomy = get_taxonomy( $r['taxonomy'] );
    ?>
    <div id="taxonomy-<?php echo $tax_name; ?>" class="categorydiv">

    <?php //am eliminat tab-urile pentru cele mai recente aici ?>

        <div id="<?php echo $tax_name; ?>-all">
            <?php
            $name = ( $tax_name == 'category' ) ? 'post_category' : 'tax_input[' . $tax_name . ']';
            echo "<input type='hidden' name='{$name}[]' value='0' />"; // Permite trimiterea unui set de termeni gol. 0 este un ID de Termen invalid și va fi ignorat de verificările empty().
            ?>
            <ul id="<?php echo $tax_name; ?>checklist" data-wp-lists="list:<?php echo $tax_name; ?>" class="categorychecklist form-no-clear">
                <?php //wp_terms_checklist( $post->ID, array( 'taxonomy' => $tax_name, 'popular_cats' => $popular_ids ) ); ?>
            </ul>

            <?php $term_obj = wp_get_object_terms($post->ID, $tax_name ); //_log($term_obj[0]->term_id) 
          
            ?>
            <?php wp_dropdown_categories( array( 'taxonomy' => $tax_name, 'option_none_value' => 0 ,'id'=>$term_obj[0]->term_id, 'value_field'=> 'slug' , 'hide_empty' => 0, 'name' => "{$name}[]", 'selected' => $term_obj[0]->slug, 'orderby' => 'name', 'hierarchical' => 0, 'show_option_none' => "Selectează $tax_name" ) ); ?>

        </div>
    <?php if ( current_user_can( $taxonomy->cap->edit_terms ) ) : 
            // am eliminat codul pentru adăugarea dinamică a termenilor aici, deoarece făcând asta adăuga o căsuță de selectare deasupra meniului drop-down nou adăugat, meniul drop-down ar trebui să fie re-randat dinamic pentru a afișa noul termen adăugat ?>
        <?php endif; ?>

        <p><a href="<?php echo site_url(); ?>/wp-admin/edit-tags.php?taxonomy=<?php echo $tax_name ?>&post_type=YOUR_POST_TYPE">Adaugă nou</a></p>
    </div>
    <?php
    }
21 aug. 2020 14:06:27