Auswahl von benutzerdefinierten Taxonomien auf eins beschränken?


7

Ich habe eine Site mit CPT (kurz für benutzerdefinierten Beitragstyp) "bagp_deals" und benutzerdefinierten Taxonomien "ba_locations" und "ba_cats". Grundsätzlich ist der Beitragstyp "Deals" mit "Location" und "Categories" als hierarchischen Taxonomien. Auf dem Standard-Bearbeitungsbildschirm möchte ich die Auswahl auf jeweils nur einen beschränken (einen Ort und eine Kategorie) und ich versuche dies mit JQuery zu tun. Ich stelle fest, dass die benutzerdefinierte Taxonomie für ba_locations im Feld "tax_input [ba_locations] heißt. [] "und bis jetzt habe ich diesen 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);
    }
});

Es wird angenommen, dass die Auswahl der Kontrollkästchen auf eins beschränkt ist. Aus irgendeinem Grund kann ich das nicht zum Laufen bringen.

Die Frage

Die Frage ist also, warum das nicht funktioniert. oder haben Sie eine bessere Lösung, um die Auswahl auf nur eine zu beschränken?

Jede Hilfe wird geschätzt.

aktualisieren:

Dies ist der Arbeitscode, den ich verwendet habe:

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);
    }
});

Vielleicht
möchten

Ich habe es bereits herausgefunden, aber danke.
Bainternet

Antworten:


6

Anstatt es mit jQuery zu hacken, wäre eine zuverlässigere Lösung, die Meta-Box in PHP durch Ihre eigene zu ersetzen.

Wie auch immer, das Problem liegt höchstwahrscheinlich bei den Zeichen '[' und ']' in der Auswahl:

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

könnte umgeschrieben werden als

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

Siehe /programming/2786538/need-to-escape-a-special-character-in-a-jquery-selector-string


Danke, aber nein, das ist es nicht. Das habe ich schon versucht. Aber ich glaube, ich habe keine andere Möglichkeit, als die Meta-Box durch meine eigene zu ersetzen.
Bainternet

8

Ich habe eine PHP-Lösung für Sie:

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";
    }
}

Ich danke Ihnen lieber Herr! Das einzige Problem, das ich dabei sehe, ist, dass der Benutzer weiterhin mehrere Kategorien unter "Am beliebtesten" auswählen kann. Wie auch immer, um das darauf auszudehnen?
JacobTheDev

Ändern Sie den Metabox-Rückruf für "post_categories_meta_box", kopieren Sie diese Funktion und ändern Sie den Aufruf von "wp_popular_terms_checklist" in Ihre Kopie dieser Funktion, in der Sie das Kontrollkästchen "Typ" in "Radio" ändern.
Zviryatko

1

Ich bin mir nicht sicher, ob Sie jemals eine Lösung dafür gefunden haben, aber ich musste das Gleiche tun. Ich nahm Ihre jQuery und fügte Zitate für den Namen hinzu + entkam ihnen. Scheint gut für mich zu funktionieren, also danke für die ursprüngliche jQuery :)

    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);
        }
    });

Meine Taxonomieeingabe hieß location und nicht ba_locations.


1

Dies ist, was ich in meine Funktionen geworfen habe, aber ich scheine nicht die erwarteten Ergebnisse zu erzielen.

<?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 } ?>

0

Eine vereinfachte Version der PHP-Lösung von @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);
        }
    }
}

und

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;
    }
);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.