선택 목록의 출력을 부모 목록에 종속시키려면 어떻게 해야 합니까?
상위 카테고리와 하위 카테고리가 각각 선택 목록에 표시되는 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
'programing' 카테고리의 다른 글
HTTP를 통해 javascript로 바이너리 데이터 전송 (0) | 2023.03.01 |
---|---|
워드프레스에서 상위 페이지의 모든 하위 페이지를 가져오려면 어떻게 해야 합니까? (0) | 2023.03.01 |
Jackson Json Type Info 。As.EXTERNAL_PROPERTY가 예상대로 작동하지 않습니다. (0) | 2023.02.15 |
Date Time을 사용할 수 있는 이유MinValue가 UTC보다 이전 시간대로 일련화되지 않았습니까? (0) | 2023.02.15 |
각도에서의 ScrollTo 함수JS (0) | 2023.02.15 |