Dropdown-Filter extrem langsam

Ich habe zwei Dropdowns auf meiner Startseite. Das erste Dropdown-Menü wählt einen benutzerdefinierten Post-Typ aus und das zweite wählt einen Speicherort aus. Das zweite Dropdown wird basierend auf der Auswahl des ersten Dropdown-Menüs gefiltert (dh es werden nur Standorte angezeigt, die das ausgewählte CPT enthalten). Das Problem ist, wenn eine Option im ersten Dropdown ausgewählt wird, dauert es sehr lange, die zweiten Dropdown-Optionen zu laden. Wenn jemand meinen Code sehen und mir vielleicht helfen könnte, herauszufinden, was die Verzögerung verursacht, werde ich sehr dankbar sein! (Unten ist der Code aus meiner functions.php Datei und front-page.php)

functionen.php:

function my_dropdown_categories( $taxonomy, $current_selected = '', $include = null ) { // Get all terms of the chosen taxonomy $terms = get_terms($taxonomy, array('orderby' => 'name')); // our content variable $list_of_terms = ''; if ( ! is_wp_error( $terms ) ) foreach($terms as $term){ // If include array set, exclude unless in array. if ( is_array( $include ) && ! in_array( $term->slug, $include ) ) continue; $select = ($current_selected == $term->slug) ? "selected" : ""; // Note: == if ($term->parent == 0 ) { // get children of current parent. $tchildren = get_term_children($term->term_id, $taxonomy); $children = array(); foreach ($tchildren as $child) { $cterm = get_term_by( 'id', $child, $taxonomy ); // If include array set, exclude unless in array. if ( is_array( $include ) && ! in_array( $cterm->slug, $include ) ) continue; $children[$cterm->name] = $cterm; } ksort($children); // OPTGROUP FOR PARENTS if (count($children) > 0 ) { // $list_of_terms .= 'name .'">'; if ($term->count > 0) $list_of_terms .= 'slug.'" '.$select.'>' . $term->name .' '; } else $list_of_terms .= 'slug.'" '.$select.'>'. $term->name .' '; //$i++; // now the CHILDREN. foreach($children as $child) { $select = ($current_selected == $child->slug) ? "selected" : ""; // Note: child, not cterm $list_of_terms .= 'slug.'" '.$select.'>'. $child->name.' '; } //end foreach if (count($children) > 0 ) { $list_of_terms .= ""; } } } $list_of_terms .= ''; return $list_of_terms; } add_action( 'wp_ajax_wpse158929_get_terms_for_cpt', 'wpse158929_get_terms_for_cpt' ); add_action( 'wp_ajax_nopriv_wpse158929_get_terms_for_cpt', 'wpse158929_get_terms_for_cpt' ); function wpse158929_get_terms_for_cpt() { $ret = array( 'html' => '', 'error' => false ); if ( ! check_ajax_referer( 'wpse158929_get_terms_for_cpt_submit_', 'nonce', false /*die*/ ) ) { $ret['error'] = __( 'Permission error', 'wpfm' ); } else { $post_type = isset( $_REQUEST['post_type'] ) ? $_REQUEST['post_type'] : ''; $taxonomy = isset( $_REQUEST['taxonomy'] ) ? $_REQUEST['taxonomy'] : ''; $current_selected = isset( $_REQUEST['current_selected'] ) ? $_REQUEST['current_selected'] : ''; if ( ! $post_type || ! $taxonomy ) { $ret['error'] = __( 'Params error', 'wpfm' ); } else { global $wpdb; $sql = $wpdb->prepare( 'SELECT t.slug FROM ' . $wpdb->terms . ' t' . ' JOIN ' . $wpdb->term_taxonomy . ' AS tt ON tt.term_id = t.term_id' . ' JOIN ' . $wpdb->term_relationships . ' AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id' . ' JOIN ' . $wpdb->posts . ' AS p ON p.ID = tr.object_id' . ' WHERE tt.taxonomy = %s AND p.post_type = %s AND p.post_status = %s' . ' GROUP BY t.slug' , $taxonomy, $post_type, 'publish' ); $include = $wpdb->get_col($sql); $ret['html'] = preg_replace( '/]*>/', '', my_dropdown_categories( $taxonomy, $current_selected, $include ) ); } } wp_send_json( $ret ); } 

Titelseite.php

 <form action="" method="get">  true, '_builtin' => false ); $output = 'objects'; // names or objects, note names is the default $operator = 'and'; // 'and' or 'or' $post_types = get_post_types($args, $output, $operator); ksort($post_types); echo ''; foreach ( $post_types as $post_type ) { $exclude = array('custom_type','shelf'); if(TRUE === in_array($post_type->name,$exclude)){ continue; } // Note: I think you need to use query_var here, rather than slug. echo 'query_var.'">' . ucfirst($post_type->labels->singular_name) . ''; } echo ""; ?>   

  jQuery(document).ready(function($) { $('select[name="post_type"]').change(function (event) { $("#location").prop("disabled", false); $('.submit-button').prop('disabled', false); $('.submit-button').removeClass("disabled"); $('select[name="location"]').html("Loading..."); $(".selectboxSingle").trigger("chosen:updated"); if($('select[name="post_type"]').val() === 'book'){ $('#location').prop('disabled', true); } $.post("", { action: 'wpse158929_get_terms_for_cpt', post_type: $(this).val(), taxonomy: , current_selected: $('select[name="location"]').val(), nonce:  }, function( response ) { if ( response && !response.error ) { $('select[name="location"]').html(response.html); $("#location-dropdown").prop("disabled", false); $(".selectboxSingle").trigger("chosen:updated"); } }, 'json' ); }); // Remove if you don't want to call change immediately. $('select[name="post_type"]').change(); $('select[name="location"]').html("Your location:"); $('.submit-button').prop('disabled', true); $("#location").prop("disabled", true); $('.submit-button').addClass("disabled"); if ($('select[name="post_type"]').val() !== '') { $('.submit-button').prop('disabled', false); $('.submit-button').removeClass("disabled"); $("#location").prop("disabled", false); } }); 

Solutions Collecting From Web of "Dropdown-Filter extrem langsam"

Ich bin überrascht, dass es so langsam ist, aber Sie können alle bis auf einen der databaseaufrufe und den Großteil der Schleife entfernen, indem Sie den Begriff Daten anstelle von nur Slugs an my_dropdown_categories() so dass get_terms() nicht aufgerufen werden muss ein paar andere Verbesserungen (siehe Kommentare) zB:

  function my_dropdown_categories( $taxonomy, $current_selected = '', $terms = null, $no_select = false ) { // If all terms ever needed, uncomment following line. //if ( $terms === null ) $terms = get_terms($taxonomy, array('orderby' => 'name')); // our content variable - use array (& join at end) for efficiency $ret = array(); if ( ! $no_select ) { // If not required, don't wrap in select. $ret[] = ''; } return implode( "\n", $ret ); } add_action( 'wp_ajax_wpse158929_get_terms_for_cpt', 'wpse158929_get_terms_for_cpt' ); add_action( 'wp_ajax_nopriv_wpse158929_get_terms_for_cpt', 'wpse158929_get_terms_for_cpt' ); function wpse158929_get_terms_for_cpt() { $ret = array( 'html' => '', 'error' => false ); if ( ! check_ajax_referer( 'wpse158929_get_terms_for_cpt_submit_', 'nonce', false /*die*/ ) ) { $ret['error'] = __( 'Permission error', 'wpfm' ); } else { $post_type = isset( $_REQUEST['post_type'] ) ? $_REQUEST['post_type'] : ''; $taxonomy = isset( $_REQUEST['taxonomy'] ) ? $_REQUEST['taxonomy'] : ''; $current_selected = isset( $_REQUEST['current_selected'] ) ? $_REQUEST['current_selected'] : ''; if ( ! $post_type || ! $taxonomy ) { $ret['error'] = __( 'Params error', 'wpfm' ); } else { global $wpdb; // Get bare minimum of required data from database. $sql = $wpdb->prepare( 'SELECT t.term_id, t.name, t.slug, tt.parent FROM ' . $wpdb->terms . ' t' . ' JOIN ' . $wpdb->term_taxonomy . ' AS tt ON tt.term_id = t.term_id' . ' JOIN ' . $wpdb->term_relationships . ' AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id' . ' JOIN ' . $wpdb->posts . ' AS p ON p.ID = tr.object_id' . ' WHERE tt.taxonomy = %s AND p.post_type = %s AND p.post_status = %s' . ' GROUP BY t.slug' . ' ORDER BY t.name' , $taxonomy, $post_type, 'publish' ); $terms = $wpdb->get_results( $sql ); $ret['html'] = my_dropdown_categories( $taxonomy, $current_selected, $terms, true /*no_select*/ ); } } wp_send_json( $ret ); } 

Wahrscheinlich brauchen Sie auch nicht den Aufruf $('select[name="post_type"]').change(); im Javascript sehen, da überschreibst du das select sofort danach …