web-dev-qa-db-fra.com

Afficher la liste des balises sous forme de menu déroulant ou de boutons radio dans une méta-boîte?

J'aimerais regrouper les publications d'un type de publication personnalisé en fonction de balises, mais la fonctionnalité par défaut ne convient pas au projet sur lequel je travaille.

Je souhaite que l'utilisateur puisse sélectionner une seule étiquette, et non plusieurs étiquettes, dans une liste de toutes les étiquettes entrées pour ce type d'article personnalisé (liste déroulante ou boutons radio).

L'utilisateur peut créer autant de balises qu'il le souhaite depuis la page pour ajouter une taxonomie personnalisée. Toutes ces balises seront répertoriées dans la boîte méta de la page de publication personnalisée unique.

Toute suggestion?

1
Mirko

Dans mon dernier projet, j'avais le même problème et je viens de l'utiliser:

commencez par obtenir la liste des balises d'une variable à l'aide de la fonction get_categories en passant la taxonomie appropriée, comme ceci:

    $args = array(

    'orderby'                  => 'name',
    'order'                    => 'ASC',
    'hide_empty'               => 0,
    'taxonomy'                 => 'post_tag'
    );
$categories=get_categories($args);
    foreach($categories as $category) { 
    $tags[] =  $category->name ;  
    }

puis créez les arguments pour la boîte à méta

$prefix = 'CPT_my_meta';
$meta_box = array(
    'id' => 'custom-meta-box',
    'title' => 'tags',
    'page' => 'CPT name',
    'context' => 'normal',
    'priority' => 'high',
    'fields' => array(
        array(
            'name' => 'tags',
            'desc' => 'select a tag',
            'id' => $prefix . 'name',
            'type' => 'select',
            'options' => $tags
        )))

puis ajoutez la meta box

add_action('admin_menu', 'add_my_box');

// Add meta box
function add_my_box() {
    global $meta_box;

    add_meta_box($meta_box['id'], $meta_box['title'], 'metabox_callback', $meta_box['page'], $meta_box['context'], $meta_box['priority']);
}

alors tout ce que vous avez à faire est de créer une fonction pour afficher la boîte méta

//show meta box
function metabox_callback(){
global $meta_box, $post;

    // Use nonce for verification
    echo '<input type="hidden" name="META_BOX_NONEC" value="', wp_create_nonce(basename(__FILE__)), '" />';

    echo '<table class="form-table">';

    foreach ($meta_box['fields'] as $field) {
        // get current post meta data
        $meta = get_post_meta($post->ID, $field['id'], true);

        echo '<tr>',
                '<th style="width:20%"><label for="', $field['id'], '">', $field['name'], '</label></th>',
                '<td>';
        switch ($field['type']) {
            case 'select':
                echo '<select name="', $field['id'], '" id="', $field['id'], '">';
                foreach ($field['options'] as $option) {
                    echo '<option', $meta == $option ? ' selected="selected"' : '', '>', $option, '</option>';
                }
                echo '</select>';
                break;
        }
        echo    '</td></tr>';
    }
    echo '</table>';
}

et enregistrez-le sur post save

//hook save function
add_action('save_post', 'save_my_meta_box');

// Save data from meta box
function save_my_meta_box($post_id) {
    global $meta_box;

    // verify nonce
    if (!wp_verify_nonce($_POST['META_BOX_NONEC'], basename(__FILE__))) {
        return $post_id;
    }

    // check autosave
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return $post_id;
    }

    // check permissions
    if ('page' == $_POST['post_type']) {
        if (!current_user_can('edit_page', $post_id)) {
            return $post_id;
        }
    } elseif (!current_user_can('edit_post', $post_id)) {
        return $post_id;
    }

    foreach ($meta_box['fields'] as $field) {
        $old = get_post_meta($post_id, $field['id'], true);
        $new = $_POST[$field['id']];

        if ($new && $new != $old) {
            update_post_meta($post_id, $field['id'], $new);
        } elseif ('' == $new && $old) {
            delete_post_meta($post_id, $field['id'], $old);
        }
    }
}

j'espère que cela t'aides

3
Bainternet

J'ai essayé d'afficher la liste et cela fonctionne si vous utilisez post_tag ou category, mais cela me donne la liste des balises ou catégories de type de publication par défaut.

Je souhaite avoir la liste des taxonomies personnalisées pour mes publications personnalisées. Mon type de message personnalisé est "au-gallery" et ma taxonomie personnalisée est "galerie" donc j'ai essayé

$args = array( 'type' => 'au-gallery', 'orderby' => 'name', 'order' => 'ASC', 'hide_empty' => 0, 'taxonomy' => 'gallery' );

mais je n'ai qu'une liste vide.

J'ai jeté un œil à get_the_term_list et get_the_terms, mais ces fonctions requièrent l'identifiant de la publication alors ... dois-je exécuter une boucle pour toutes mes publications personnalisées afin d'obtenir cette liste ou existe-t-il un meilleur moyen ??

0
Mirko

Pour les taxonomies personnalisées, j'ai trouvé une solution sans écrire de hook save_post. Lorsque vous enregistrez une taxonomie, vous devez spécifier 'meta_box_cb' => 'single_taxonomy_select_meta_box'

Pour plus de détails, veuillez télécharger ce résumé

/**
 * Meta box to select only one taxonomy value
 *
 * @param WP_Post $post
 * @param array   $box
 */
function single_taxonomy_select_meta_box( WP_Post $post, Array $box ) {

$taxonomy = $box['args']['taxonomy'];

$term_name_of_the_current_post = wp_get_object_terms( $post->ID, $taxonomy, [ 'fields' => 'names' ] )[0];

$all_term_names = get_terms( $taxonomy, [ 'fields' => 'names', 'hide_empty' => false ] );
?>
<label>
    <?php esc_html_e( 'Please choose:' ); ?>
    <select name="tax_input[<?php echo esc_attr( $taxonomy ); ?>]">
        <?php foreach ( $all_term_names as $term_name ) : ?>
            <option <?php selected( $term_name_of_the_current_post, $term_name ); ?>>
                <?php echo esc_html( $term_name ); ?>
            </option>
        <?php endforeach; ?>
    </select>
</label>
0
tivnet