Visualizzare una tassonomia personalizzata come menu a discesa nella pagina di modifica dei post

24 apr 2012, 16:16:46
Visualizzazioni: 22.5K
Voti: 2

Quando crei una tassonomia personalizzata, apparentemente le uniche opzioni sono visualizzarla come tag (non gerarchica) o categoria (gerarchica). Esiste un modo per visualizzarla come menu a discesa?

Mi rendo conto che questo può essere fatto usando add_meta_box() e aggiungendolo manualmente, ma sto cercando un modo integrato (se esiste) per risparmiare molto codice! Grazie.

0
Tutte le risposte alla domanda 5
3
10

Puoi aggiungere una nuova tassonomia con il tuo metabox personalizzato da WordPress 3.8 utilizzando meta_box_cb

"drop_cat()" - consiste nella ricostruzione del metabox categoria originale del core 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 );

}

// Hook into the 'init' action
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' />"; // Consente l'invio di un set di termini vuoto. 0 è un Term ID non valido e verrà ignorato dai controlli 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 giu 2014 02:45:50
Commenti

Questo ha funzionato bene per me, ma ho dovuto apportare una modifica al codice per 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 mag 2018 12:21:31

Questo codice funzionerà dalla versione 3.8 in poi

Alexufo Alexufo
3 mag 2018 12:34:23

hai dovuto registrare un URL personalizzato per tax_input per reindirizzare correttamente?

YarGnawh YarGnawh
6 lug 2021 01:39:51
1

Ecco qui:

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

Elimina il secondo argomento di $tax_terms se non vuoi visualizzare i termini vuoti.

Usa anche selected se vuoi salvare l'opzione selezionata :)

24 apr 2012 16:32:29
Commenti

Grazie @Wordpressor - Sto cercando di farlo senza dover aggiungere metabox alla pagina di modifica del post se possibile, quindi stavo cercando soluzioni integrate utilizzando la funzione wp_register_taxonomy(). Aggiornerò la mia domanda!

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

Sfortunatamente, non è possibile farlo con wp_register_taxonomy(). Quando registri una tassonomia, il metabox predefinito è costituito da caselle di controllo (gerarchico) o da un cloud (non gerarchico).

L'unico modo per aggirare questo problema è annullare la registrazione del metabox esistente e aggiungerne uno nuovo al suo posto. Mimando attentamente il metabox "predefinito", non dovrai elaborare i dati manualmente, ma lascerai che WordPress gestisca automaticamente l'aggiunta/rimozione dei termini.

I dettagli su come fare questo sono forniti in questa risposta. Potresti anche trovare utile questo repository GitHub (che ora include la possibilità di creare termini al volo nel nuovo metabox). Le risorse collegate si riferiscono alla creazione di un metabox con pulsanti radio, ma potrebbe essere facilmente adattato per menu a discesa.

24 apr 2012 20:44:10
Commenti

Grazie Stephen, è come temevo! Sarebbe fantastico se WP implementasse questa funzionalità in futuro, risparmierebbe molto codice a persone come me. Grazie ancora.

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

Stavo avendo difficoltà con il codice fornito da Alexufo, quindi l'ho riscritto basandomi sulla funzione aggiornata in WP 4.1.2. Ecco la mia funzione drop_cat aggiornata:

//funzione riadattata da 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 //rimossi i tab per i più recenti qui ?>

        <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' />"; // Permette l'invio di un set di termini vuoto. 0 è un Term ID invalido che verrà ignorato dai controlli 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' => "Seleziona $tax_name" ) ); ?>

        </div>
    <?php if ( current_user_can( $taxonomy->cap->edit_terms ) ) : 
            // rimosso il codice per aggiungere termini dinamicamente qui, perché così facendo veniva aggiunta una checkbox sopra il menu a discesa, il menu a discesa avrebbe bisogno di essere ri-renderizzato dinamicamente per mostrare il nuovo termine aggiunto ?>
        <?php endif; ?>

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

L'unico problema che sto riscontrando (come indicato nei miei commenti nella funzione sopra), è che non posso utilizzare la funzionalità di aggiunta termini/categorie di WP nel meta box, perché di default aggiunge dinamicamente i nuovi termini come una checkbox sopra il mio menu a discesa. Per funzionare con un menu a discesa, il menu dovrebbe essere ri-renderizzato dopo l'aggiunta del nuovo termine. Qualcosa che sono sicuro di poter risolvere ma che lascerò per un altro giorno.

15 mag 2015 03:29:42
0

Il codice sopra presentava alcuni problemi per me, lasciami inserire il codice corretto che ha funzionato nel mio caso

 'meta_box_cb' => 'drop_cat',

nella definizione della tua categoria, poi inserisci questo codice qui

ricordati di aggiungere

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 //ho rimosso le tabs per la versione più recente qui ?>

        <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' />"; // Permette l'invio di un set di termini vuoto. 0 è un Term ID non valido e verrà ignorato dai controlli 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' => "Seleziona $tax_name" ) ); ?>

        </div>
    <?php if ( current_user_can( $taxonomy->cap->edit_terms ) ) : 
            // ho rimosso il codice per aggiungere termini dinamicamente qui, perché così facendo veniva aggiunto un checkbox sopra il menu a discesa, che avrebbe bisogno di essere ri-renderizzato dinamicamente per mostrare il nuovo termine aggiunto ?>
        <?php endif; ?>

        <p><a href="<?php echo site_url(); ?>/wp-admin/edit-tags.php?taxonomy=<?php echo $tax_name ?>&post_type=IL_TUO_POST_TYPE">Aggiungi Nuovo</a></p>
    </div>
    <?php
    }
21 ago 2020 14:06:27