Come rendere l’output di un elenco selezionato dipendente dall’elenco dei genitori?

Ho due array che hanno una categoria padre e una sottocategoria che appaiono in un elenco di selezione, come faccio a fare in modo che la sottocategoria mostri gli articoli solo dalla sua categoria padre?

 '', 'show_option_none' => ('All Makes'), 'orderby' => 'ID', 'order' => 'ASC', 'show_count' => 0, 'hide_empty' => 1, 'child_of' => 25, 'exclude' => 0, 'echo' => 1, 'selected' => 0, 'hierarchical' => 0, 'name' => 'cat', 'id' => '', 'class' => 'postform', 'depth' => 0, 'tab_index' => 0, 'taxonomy' => 'category', 'hide_if_empty' => false ); ?>  'subcat', 'hierarchical' => 1, 'parent' => get_cat_id('model'), 'show_option_none' => ('All Models'), 'hide_empty' => 0 ); ?>   

Ad esempio, è necessario mostrare solo i modelli di auto che appartengono alle auto

 Make=Toyota Model=Supra Model=Corolla Model=Tundra 

Ecco un esempio della struttura della categoria

 Make (parent category) -Toyota -Nissan -Mazda -Ford Model (parent category) -Supra -Skyline -Mustang -Rx7 -Corolla 

Ho sempre voluto fare un esercizio sulle selezioni concatenate usando Ajax, quindi, eccoci qui;)

Questo è un plugin completo e dovrebbe essere installato nella cartella wp-content/plugins/your-plugin-name . Consiste di tre file, il plugin stesso, il file Javascript e l’immagine del caricatore Ajax.

Installa il plug-in e triggers e inserisci quanto segue in qualche file modello di tema :

  

Inoltre, regola le due chiamate su wp_dropdown_categories come desiderato. Controlla i commenti del codice per i dettagli.

Il menu a discesa delle sottocategorie viene modificato in risposta alle modifiche nel menu a discesa delle categorie:

inserisci la descrizione dell'immagine qui

incatenato-categories.php

 Plugin Class Demo, by Thomas Scholz. * Use the dropdowns in the theme with this PHP method call: BRSFL_Chained_Selection::print_cats(); * Author: Rodolfo Buaiz * Author URI: http://wordpress.stackexchange.com/users/12615/brasofilo */ add_action( 'plugins_loaded', array ( BRSFL_Chained_Selection::get_instance(), 'plugin_setup' ) ); class BRSFL_Chained_Selection { /** * Plugin instance. * * @see get_instance() * @type object */ protected static $instance = NULL; /** * URL to this plugin's directory. * * @type string */ public $plugin_url = ''; /** * Path to this plugin's directory. * * @type string */ public $plugin_path = ''; /** * Access this plugin's working instance * * @wp-hook plugins_loaded * @since 2012.09.13 * @return object of this class */ public static function get_instance() { NULL === self::$instance and self::$instance = new self; return self::$instance; } /** * Used for regular plugin work. * * @wp-hook plugins_loaded * @since 2012.09.10 * @return void */ public function plugin_setup() { $this->plugin_url = plugins_url( '/', __FILE__ ); $this->plugin_path = plugin_dir_path( __FILE__ ); $this->load_language( 'chainedselections' ); add_action( 'wp_enqueue_scripts', array( $this, 'script_enqueuer' ) ); add_action( 'wp_ajax_custom_query', array( $this, 'custom_query' ) ); add_action( 'wp_ajax_nopriv_custom_query', array( $this, 'custom_query' ) ); } /** * Constructor. Intentionally left empty and public. * * @see plugin_setup() * @since 2012.09.12 */ public function __construct() {} /** * Enqueue frontend scripts */ public function script_enqueuer() { wp_register_script( 'ajax-quote' , plugin_dir_url( __FILE__ ) . '/ajax.js' , array( 'jquery' ) ); wp_enqueue_script( 'ajax-quote' ); wp_localize_script( 'ajax-quote' , 'wp_ajax' , array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) , 'ajaxnonce' => wp_create_nonce( 'ajax_chained_selection_validate' ) , 'icon' => plugin_dir_url( __FILE__ ) . '/ajax-loader.gif' ) ); } /** * Ajax create sub-categories dropdown */ public function custom_query() { // Security check_ajax_referer( 'ajax_chained_selection_validate', 'security' ); // Check if jQuery posted the data if( !isset( $_POST[ 'chained_subcat_id' ] ) ) return false; // Adjust parameters $carMakes = array( 'show_option_all' => '', 'show_option_none' => 'All ' . $_POST[ 'chained_subcat_name' ], 'orderby' => 'ID', 'order' => 'ASC', 'show_count' => 0, 'hide_empty' => 0, 'exclude' => 0, 'echo' => 1, 'selected' => 0, 'child_of' => $_POST[ 'chained_subcat_id' ], 'hierarchical' => 1, 'name' => 'chained-subcontainer', 'id' => '', 'class' => 'postform', 'depth' => 1, 'tab_index' => 0, 'taxonomy' => 'category', 'hide_if_empty' => false ); // Print sub-categories wp_dropdown_categories( $carMakes ); exit(); } /** * Loads translation file. * * Accessible to other classs to load different language files (admin and * front-end for example). * * @wp-hook init * @param string $domain * @since 2012.09.11 * @return void */ public function load_language( $domain ) { $locale = apply_filters( 'plugin_locale', get_locale(), $domain ); // Load translation from wp-content/languages if exist load_textdomain( $domain, WP_LANG_DIR . $domain . '-' . $locale . '.mo' ); // Load regular plugin translation load_plugin_textdomain( $domain, FALSE, $this->plugin_path . '/languages' ); } /** * Print the dropdown in the frontend */ public static function print_cats( $cat_id, $dropdown_text ) { // Adjust parameters $carMakes = array( 'show_option_all' => '', 'show_option_none' => $dropdown_text, 'orderby' => 'ID', 'order' => 'ASC', 'show_count' => 0, 'hide_empty' => 0, 'exclude' => 0, 'echo' => 1, 'selected' => 0, 'child_of' => $cat_id, 'hierarchical' => 1, 'name' => 'chained-categories', 'id' => '', 'class' => 'postform', 'depth' => 1, 'tab_index' => 0, 'taxonomy' => 'category', 'hide_if_empty' => false ); // Print categories wp_dropdown_categories( $carMakes ); // Empty dropdown for sub-categories echo '
'; } }

ajax.js

 jQuery( document ).ready( function( $ ) { var data = { action: 'custom_query', security: wp_ajax.ajaxnonce }; $( "#chained-categories" ).on( "change", function( e ) { // Add specific data to the variable, used to query the sub-categories data[ 'chained_subcat_id' ] = $( this ).val(); data[ 'chained_subcat_name' ] = $( '#chained-categories option[value=' + $( this ).val() + ']' ).text(); // A sub-category was selected if( $( this ).val() > 0 ) { // Ajax loader icon $( '#chained-subcontainer' ).html( '' ); // Ajax call $.post( wp_ajax.ajaxurl, data, // No error checking is being done with the response function( response ) { $( '#chained-subcontainer' ).html( response ); } ); } // No selection, show default else { $( '#chained-subcontainer' ).html( '' ); } }); } ); 

ajax-loader.gif

caricatore ajax

Perché non usare oggetti? Hai bisogno di una fabbrica per build automobili.

un ottimo riferimento: http://sourcemaking.com/creational_patterns

Mi piace anche pensare di mantenere gli oggetti piccoli, semplici e fare il meno ansible. Rompe le funzioni fino a concetti semplici come “make” e “show”. Ciò li rende intercambiabili ed estensibili. Alla fine sarai in grado di chiedere $ this-> model->

Mi avvicinerei a questo:

1 object per organizzare il modello // dati

un altro per build il tuo // controller di righe

un altro per visualizzare // view

Per iniziare a guardarlo in quel modo, scrivi prima alcune funzioni per capire cosa vuoi sapere.

 foreach (make)->show(models); 

Potresti scoprire che hai bisogno di interrogare i dati in modo diverso … In altre parole, fai una domanda più specifica al db in anticipo, piuttosto che filtrala dopo averla ricevuta. Forse il filtraggio ora sembra più veloce, ma quante altre domande e filtri dovrai fare in seguito?

Un altro commento: php è più controller e javascript sembra più visibile. Dico risolvere i problemi nel loro contesto più appropriato e più semplice con php su questo problema.

L’unico modo per farlo senza AJAX è quello di ottenere un elenco di tutte le categorie “Crea”, quindi generare un menu a discesa per ciascun “Modello” di ciascun “Make” utilizzando wp_dropdown_categories () con il parametro child_of. Nascondere tutti i menu a discesa “Crea” al caricamento della pagina, associare un gestore di eventi di modifica al menu a discesa “Crea” e quando viene chiamato, mostrare il menu a discesa “Modello” appropriato nascondendo tutto il resto. La visualizzazione / nascondimento può essere eseguita con jQuery o JS puro. Ogni menu a discesa “Modello” dovrà avere un ID univoco che può essere utilizzato per identificare a quale “Marca” appartiene.