programing

선택 목록의 출력을 부모 목록에 종속시키려면 어떻게 해야 합니까?

newsource 2023. 2. 18. 20:36

선택 목록의 출력을 부모 목록에 종속시키려면 어떻게 해야 합니까?

상위 카테고리와 하위 카테고리가 각각 선택 목록에 표시되는 2개의 배열이 있습니다. 하위 카테고리는 상위 카테고리의 항목만 표시하도록 하려면 어떻게 해야 합니까?

 <?php $carMakes = array(
 'show_option_all'    => '',
 '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
); ?>

<?php $carModels = array(
 'name'               => 'subcat',
 'hierarchical'       => 1,
 'parent'             => get_cat_id('model'),
 'show_option_none'   => ('All Models'),
 'hide_empty'   => 0  ); 
?>

<?php wp_dropdown_categories($carMakes); ?> 

<?php wp_dropdown_categories($carModels); ?>

예를 들어, 자동차에 속하는 모델만 보여주면 된다.

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

카테고리 구조의 예를 다음에 나타냅니다.

Make (parent category)
     -Toyota
     -Nissan
     -Mazda
     -Ford

    Model (parent category)
     -Supra
     -Skyline
     -Mustang
     -Rx7
     -Corolla

항상 Ajax를 사용한 체인 선택과 관련된 연습을 하고 싶었기 때문에, 이것으로 끝입니다.

이 플러그인은 풀 플러그인이므로 다음 위치에 설치해야 합니다.wp-content/plugins/your-plugin-name폴더입니다.플러그인 자체, Javascript 파일 및 Ajax 로더 이미지의 3가지 파일로 구성됩니다.

플러그인을 설치하고 활성화한 후 일부 테마 템플릿 파일에 다음을 삽입합니다.

<?php 
if( class_exists( 'BRSFL_Chained_Selection' ) ) {
    // Parameters: ( $cat_id, $dropdown_text )
    BRSFL_Chained_Selection::print_cats( 1, 'All Makes' ); 
}
?>

또, 2개의 콜을 조정해 주세요.wp_dropdown_categories원하는 대로상세한 것에 대하여는, 코드의 코멘트를 참조해 주세요.

하위 카테고리 드롭다운은 카테고리 드롭다운 변경에 따라 변경됩니다.

여기에 이미지 설명 입력

연쇄 카테고리php

<?php
/**
 * Plugin Name: Chained Categories
 * Plugin URI: http://stackoverflow.com/q/15748968/1287812
 * Description: Demonstration of chained categories with Ajax. 
 *   Plugin structure based on <a href="https://gist.github.com/3804204">Plugin Class Demo</a>, 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 classes 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 '<div id="chained-subcontainer">
                <select name="chained-subcategories" id="chained-subcategories">
                    <option value="">- Select a category first -</option>
                </select>
            </div>';
    }
}

에이잭스

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( '<img src="' + wp_ajax.icon + '">' );

            // 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( '<select name="chained-subcategories" id="chained-subcategories"><option value="">- Select a category first -</option></select>' );
        }           
    });
} );

ajax-module.gif

아약스 로더

오브젝트를 사용하면 어떨까요?차를 만들려면 공장이 필요해요.

참고 자료: http://sourcemaking.com/creational_patterns

저는 또한 사물을 작고 단순하게 유지하고 가능한 한 적게 하는 것을 좋아합니다.기능을 "make" 및 "show"와 같은 단순한 개념으로 분류합니다.이를 통해 상호 교환과 확장이 가능합니다.최종적으로 $this->model->을 요구할 수 있습니다.

저는 이렇게 접근합니다.

데이터 //모델을 구성하는 개체 1개

행/컨트롤러를 구축하기 위한 다른 솔루션

표시할 다른 것 //보기

그렇게 보기 위해서는 먼저 여러분이 알고 싶은 것을 이해할 수 있는 함수를 써보세요.

foreach (make)->show(models);

데이터를 다르게 쿼리해야 할 수 있습니다.즉, db를 받은 후 필터링하지 말고 먼저 보다 구체적인 질문을 합니다.지금은 필터링이 빠른 것 같습니다만, 그 외에 몇 가지 질문이나 필터링을 나중에 해야 합니까?

또 한 가지 코멘트는 php가 더 컨트롤러적이고 javascript가 더 보기 좋게 느껴집니다.가장 적절하고 간단한 문맥으로 문제를 해결하라 - 이 문제에 대해서는 php를 고수하라.

AJAX를 사용하지 않는 유일한 방법은 모든 "Make" 카테고리의 목록을 가져온 다음 wp_dropdown_categories()와 child_of 파라미터를 사용하여 각 "Make"의 각 "Model"에 대한 드롭다운을 생성하는 것입니다.페이지 로드 시 "Make" 드롭다운을 모두 숨기고 "Make" 드롭다운에 변경 이벤트 핸들러를 연결한 후 호출되면 나머지 모든 드롭다운을 숨기고 적절한 "Model" 드롭다운을 표시합니다.표시/숨김은 jQuery 또는 순수 JS로 수행할 수 있습니다.각 "모델" 드롭다운에는 해당 모델이 속한 "메이크"를 식별하는 데 사용할 수 있는 고유한 ID가 있어야 합니다.

언급URL : https://stackoverflow.com/questions/15748968/how-to-make-output-of-a-select-list-be-dependant-on-parent-list