web-dev-qa-db-fra.com

limiter la sélection des taxonomies personnalisées à une?

J'ai un site avec CPT (abréviation de type de message personnalisé) "bagp_deals" et les taxonomies personnalisées "ba_locations" et "ba_cats" essentiellement son type de message de "Transactions" avec "Lieu" et "Catégories" comme taxonomies hiérarchiques. Sur l'écran d'édition par défaut, je souhaite limiter la sélection à une seule de chaque (un emplacement et une catégorie) et j'essaie de le faire avec JQuery. Je remarque que la taxonomie personnalisée de ba_locations est nommée "tax_input [ba_locations] [] "et jusqu'ici j'ai ce code:

jQuery("input[name=tax_input[ba_locations][]]").click(function () {
    selected = jQuery("input[name=tax_input[ba_locations][]]").filter(":checked").length;
    if (selected > 1){
        jQuery("input[name=tax_input[ba_locations][]]").each(function () {
                jQuery(this).attr("checked", false);
        });
        jQuery(this).attr("checked", true);
    }
});

est supposé limiter le nombre de cases à cocher à un. Pour une raison quelconque, je ne peux pas obtenir que cela fonctionne.

La question

La question est donc: pourquoi ça ne marche pas? ou avez-vous une meilleure solution pour limiter la sélection à une seule?

toute aide est appréciée.

mettre à jour:

c'est le code de travail que j'ai utilisé:

jQuery("input[name=\"tax_input[ba_locations][]\"]").click(function () {
    selected = jQuery("input[name=\"tax_input[ba_locations][]\"]").filter(":checked").length;
    if (selected > 1){
        jQuery("input[name=\"tax_input[ba_locations][]\"]").each(function () {
                jQuery(this).attr("checked", false);
        });
        jQuery(this).attr("checked", true);
    }
});
7
Bainternet

Au lieu de la pirater avec jQuery, une solution plus fiable consisterait à remplacer la méta-boîte par la vôtre, en PHP.

Quoi qu'il en soit, le problème est probablement lié aux caractères '[' et ']' dans le sélecteur:

"input[name=tax_input[ba_locations][]]"

pourrait être réécrit comme

"input[name=tax_input\\[ba_locations\\]\\[\\]]"

Voir https://stackoverflow.com/questions/2786538/need-to-escape-a-special-character-in-a-jquery-selector-string

6
scribu

j'ai une solution php pour vous:

add_filter('wp_terms_checklist_args', 'htmlandcms_select_one_category');
function htmlandcms_select_one_category($args) {
    if (isset($args['taxonomy']) && $args['taxonomy'] == 'category_portfolio') {
        $args['walker'] = new Walker_Category_Radios;
        $args['checked_ontop'] = false;
    }
    return $args;
}

class Walker_Category_Radios extends Walker {
    var $tree_type = 'category';
    var $db_fields = array ('parent' => 'parent', 'id' => 'term_id');

    function start_lvl( &$output, $depth = 0, $args = array() ) {
        $indent = str_repeat("\t", $depth);
        $output .= "$indent<ul class='children'>\n";
    }

    function end_lvl( &$output, $depth = 0, $args = array() ) {
        $indent = str_repeat("\t", $depth);
        $output .= "$indent</ul>\n";
    }

    function start_el( &$output, $category, $depth, $args, $id = 0 ) {
        extract($args);
        if ( empty($taxonomy) )
            $taxonomy = 'category';

        if ( $taxonomy == 'category' )
            $name = 'post_category';
        else
            $name = 'tax_input['.$taxonomy.']';

        /** @var $popular_cats */
        $class = in_array( $category->term_id, $popular_cats ) ? ' class="popular-category"' : '';
        /** @var $selected_cats */
        $output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="radio" name="'.$name.'[]" id="in-'.$taxonomy.'-' . $category->term_id . '"' . checked( in_array( $category->term_id, $selected_cats ), TRUE, FALSE ) . disabled( empty( $args['disabled'] ), FALSE, FALSE ) . ' /> ' . esc_html( apply_filters('the_category', $category->name )) . '</label>';
    }

    function end_el( &$output, $category, $depth = 0, $args = array() ) {
        $output .= "</li>\n";
    }
}
8
zviryatko

C'est ce que j'ai jeté dans mes fonctions, mais je ne semble pas obtenir les résultats escomptés.

<?php add_action( 'admin_head', 'cat_sel' ); function cat_sel() {    ?>

<script type="text/javascript">
jQuery(document).ready(function($) {
  jQuery("input[name=\"tax_input[rooms][]\"]").click(function () {
    selected = jQuery("input[name=\"tax_input[rooms][]\"]").filter(":checked").length;
    if (selected > 1){
        jQuery("input[name=\"tax_input[rooms][]\"]").each(function () {
                jQuery(this).attr("checked", false);
        });
        jQuery(this).attr("checked", true);
    }
  });
});

</script>
<?php } ?>
1
Picard102

Je ne sais pas si vous avez déjà trouvé une solution à cela, mais je devais faire la même chose. J'ai pris votre jQuery et ajouté des citations pour le nom + leur échappé. Semble fonctionner correctement pour moi, alors merci pour le jQuery original :)

    jQuery("input[name=\"tax_input[location][]\"]").click(function () {
        selected = jQuery("input[name=\"tax_input[location][]\"]").filter(":checked").length;
        if (selected > 1){
            jQuery("input[name=\"tax_input[location][]\"]").each(function () {
                    jQuery(this).attr("checked", false);
            });
            jQuery(this).attr("checked", true);
        }
    });

Mon entrée de taxonomie était appelée location et non pas ba_locations.

1
Andrew

Une version simplifiée de la solution PHP de @sviryatko : =:

namespace {
    require_once(ABSPATH . 'wp-admin/includes/class-walker-category-checklist.php');
    class Walker_Category_Radioset extends Walker_Category_Checklist {
        public function start_el(&$output, $category, $depth = 0, $args = array(), $id = 0) {
            $parent_output = '';
            parent::start_el($parent_output, $category, $depth, $args, $id);
            $output .= str_replace('checkbox', 'radio', $parent_output);
        }
    }
}

et

add_filter(
    'wp_terms_checklist_args'
    , function($args) {
        if (isset($args['taxonomy']) && $args['taxonomy'] == YOUR_TAXONOMY) {
            $args['walker'] = new \Walker_Category_Radioset;
            $args['checked_ontop'] = false;
        }
        return $args;
    }
);
0
Walf