array( $field_value => $field_label) (defaults to a checkbox) or, * style_id => array( $field_value => array( * 'type'=>'text|number|checkbox' default is checkbox. * 'label'=> label text or html string. * 'attrs'=> string og attributes to be added to the field. * )) * for other fields. */ protected $style_extras = array(); /** * @since 4.11.0 * @access protected * @var Array $other_extras array of extra fields added to the 'Other attributes' fieldset, can either be array( $field_value => $field_label) (defaults to a checkbox) or, * array( $field_value => array( * 'type'=>'text|number|checkbox' default is checkbox. * 'label'=> label text or html string. * 'attrs'=> string og attributes to be added to the field. * )) * for other fields. */ protected $other_extras = array(); /** * @since 4.11.0 * @access protected * @var String default checkbox, can be set to radio isntead for extra configuration fields using hte set_others_extras_radio(); */ protected $other_extras_type = 'checkbox'; /** * flag that determines if field can accepted nested lists such as hierarchical taxonomies. * @since 4.11.0 * @access protected * @var String default false, can be changed with allow_nesting() method; */ protected $nesting = false; /** * @since 4.10.0 * @access protected * @var Array $instances array of tag_id=>CF7SG_Dynamic_list objects to keep track of instances. */ protected static $instances; public function __construct($tag_id, $label){ $this->tag_id = $tag_id; $this->label = $label; $this->register(); } /** * set the stles for the tag manager. * @since 4.11.0 * @param Array $styles array of style fields available in the tag manager form. * @param Array $style_extras array of extra fields appended to each style field for further customisation, can either be style_id => array( $field_value => $field_label) (defaults to a checkbox) or, * style_id => array( $field_value => array( * 'type'=>'text|number|checkbox' default is checkbox. * 'label'=> label text or html string. * 'attrs'=> string og attributes to be added to the field. * )) * for other fields. */ public function set_styles($styles, $style_extras){ $this->styles = $styles; $this->style_extras = $style_extras; } /** * Set extra configuratino fields in the 'Other Attributes' fieldset of the tag manager form. * @since 4.11.0 * @param Array $extras array of extra fields added to the 'Other attributes' fieldset, can either be array( $field_value => $field_label) (defaults to a checkbox) or, * array( $field_value => array( * 'type'=>'text|number|checkbox' default is checkbox. * 'label'=> label text or html string. * 'attrs'=> string of attributes to be added to the field. * )) * for other fields. */ public function set_others_extras($extras){ $this->other_extras = $extras; } /** * Set the extra configuration fields to be radio fields instead of the default checkbox. * @since 4.11.0 */ public function set_others_extras_radio(){ $this->other_extras_type = 'radio'; } /** * This field can handle nesting of values (hierarchical lists) * *@since 4.11.0 */ public function allow_nesting(){ $this->nesting = true; } /** * Return the nesting boolean to determine if the list can display nested lists. *@since 4.11.0 *@return Boolean false or true. */ public function has_nesting(){ return $this->nesting; } /** * function returns an array of dynamic field styles value=>label pairs for the admin tag generator. * these styles will be radio fields on the tag generator form. The selected style for a given field * will be parametrised as a class on the dynamic field HTML element. * so for example the select2 jquery dropdown style would have a select2 class added to the select field. * @return Array value=>label pairs. */ public function get_tag_generator_styles(){ return $this->styles; } /** * get extra fields associated with a given style field to display in the tag manager form. * @since 4.11.0 * @param String $style style id */ public function get_style_extras($style){ $extras = array(); if(isset($this->style_extras[$style])) $extras = $this->style_extras[$style]; if(!is_array($extras)) $extras = array($extras); return $extras; } /** * get extra fields associated with a given style field to display in the tag manager form. * @since 4.11.0 * @param String $style style id */ public function get_other_extras(){ return $this->other_extras; } /** * get the extra fields type * *@since 4.11.0 *@return String checkbox | radio */ public function get_other_extras_type(){ return $this->other_extras_type; } /** * Function to get classes to be added to the form wrapper. * these classes will be passed in the resource enqueue action, allowing for specific js/css resources * to be queued up and loaded on the page where the form is being displayed. * @param WPCF7_FormTag $tag cf7 tag object for the form field. * @param int $form_id cf7 fomr post ID.. * @return Array an array of classes to be added to the form to which this tag belongs to. */ public function get_form_classes($tag, $form_id){ return apply_filters('cf7sg_save_dynamic_list_form_classes', array(), $tag, $form_id); } /** * function to register and track newly created dynamic list. */ protected function register(){ if(!isset(self::$instances)) self::$instances = array(); self::$instances[$this->tag_id] = $this; // debug_msg(self::$instances, 'registration '); } static public function get_instances($tag_id=null){ if(!isset(self::$instances)) self::$instances = array(); $instance = self::$instances; if(isset($tag_id)){ $instance = isset(self::$instances[$tag_id]) ? self::$instances[$tag_id]:false; } // debug_msg(self::$instances, 'get isntances '); // debug_msg($instance, 'get isntance '.$tag_id); return $instance; } /** * Function to register the admin tag. * called by the admin/class-cf7-grid-layout-admin.php cf7_shortcode_tags() method which is hooked to * 'wpcf7_admin_init'. */ public function register_cf7_tag(){ if ( class_exists( 'WPCF7_TagGenerator' ) ) { $tag_generator = WPCF7_TagGenerator::get_instance(); $tag_generator->add( $this->tag_id, //tag id $this->label, //tag button label array($this,'admin_tag_generator') //callback ); } } /** * Dynamic select screen displayt. * * This function is called by cf7 plugin, and is registered with a hooked function above * * @since 4.10.0 * @param WPCF7_ContactForm $contact_form the cf7 form object * @param array $args arguments for this form. */ public function admin_tag_generator( $contact_form, $args = ''){ $args = wp_parse_args( $args, array() ); do_action('cf7sg_display_dynamic_list_tag_manager', $this->tag_id, $this, $contact_form, $args); } /** * function to display taxonomy dropdown list for posts in tag generator */ public function cf7sg_terms_to_options($taxonomy, $is_hierarchical, $parent=0, $level=1){ $args = array('hide_empty' => 0); if($is_hierarchical){ $args['parent'] = $parent; } //check the WP version global $wp_version; if ( $wp_version >= 4.5 ) { $args['taxonomy'] = $taxonomy; $terms = get_terms($args); //WP>= 4.5 the get_terms does not take a taxonomy slug field }else{ $terms = get_terms($taxonomy, $args); } if( is_wp_error( $terms ) ){ debug_msg('Taxonomy '.$taxonomy.' does not exist'); return ''; }else if( empty($terms) ){ return''; } if(0==$parent) $class = 'parent'; else $class = 'child'; $script = ''; foreach($terms as $term){ $script .='' . PHP_EOL; if($is_hierarchical){ $script .= $this->cf7sg_terms_to_options($taxonomy, $is_hierarchical, $term->term_id, $level+1); } } return $script; } /** * Register the form front-end shortcode. * Called by public/class-cf7-grid-layout-public.php register_cf7_shortcode() methid * which is hooked on 'wpcf7_init'. * This function registers a callback function to expand the shortcode for the save button field. * @since 2.0.0 */ public function register_cf7_shortcode() { if( function_exists('wpcf7_add_form_tag') ) { //dynamic select wpcf7_add_form_tag( array( $this->tag_id, $this->tag_id.'*' ), array($this,'get_shortcode_html'), true //has name ); } } /** * Function to retrieve dynamic-dropdown data attributes * * @since 4.11.0 * @param WPCF7_FormTag $tag cf7 tag object of basetype dynamic list. * @return Array an array of data attributes . **/ public function get_data_attributes($tag){ if(is_array($tag) && isset($tag['basetype']) && $this->tag_id === $tag['basetype']){ $tag = new WPCF7_FormTag($tag); } if( !($tag instanceof WPCF7_FormTag) || $this->tag_id !== $tag['basetype']){ return false; } $attrs = array(); if(empty($tag->values)) debug_msg($tag, "CF7SG ERROR: malformed {$this->tag_id} tag, unable to retrieve values"); foreach($tag->values as $values){ if(false === stripos($values, 'data-')) continue; $a = explode(':',$values); if(isset($a[1])) $attrs[$a[0]] = $a[1]; } return $attrs; } /** * Function to retrieve dynamic-dropdown attributes * * @since 1.0.0 * @param WPCF7_FormTag $tag cf7 tag object of basetype dynamic_select. * @return array an array of attributes with 'source'=>[post|taxonomy|filter], . **/ public function get_dynamic_attributes($tag){ if(is_array($tag) && isset($tag['basetype']) && $this->tag_id === $tag['basetype']){ $tag = new WPCF7_FormTag($tag); } if( !($tag instanceof WPCF7_FormTag) || $this->tag_id !== $tag['basetype']){ return false; } $source = array(); if(empty($tag->values)) debug_msg($tag, "CF7SG ERROR: malformed {$this->tag_id} tag, unable to retrieve values"); foreach($tag->values as $values){ if(0 === strpos($values, 'slug:') ){ $source['source'] = "taxonomy"; $s = explode(':',$values); $source['taxonomy'] = $s[1]; $source['tree'] = isset($s[2]) && 'tree'==$s[2]; /** @since 4.11 */ } if(0 === strpos($values, 'source:post')){ $source['source'] = "post"; $source['post'] = str_replace('source:post:', '', $values); } if(0 === strpos($values, 'taxonomy:')){ if(empty($source['taxonomy'])){ $source['taxonomy'] = array(); } $values = str_replace('taxonomy:', '', $values); $exp = explode(":", $values); if(!empty($exp) && is_array($exp)){ $source['taxonomy'][$exp[1]] = $exp[0]; } } if(0 === strpos($values, 'source:filter')){ $source['source'] = "filter"; } } return $source; } /** * function to display the html field in the form. * @since 4.10.0 * @param String $field_name the tag field name designated in the tag help screen * @return String a set of html fields to capture the googleMap information */ public function get_shortcode_html($field_name){ $tag = new WPCF7_FormTag( $field_name ); // debug_msg($tag, 'tag object '); $source = $this->get_dynamic_attributes($tag); /** @since 4.11.0 enable data attributes */ $data_attrs = $this->get_data_attributes($tag); $validation_error = wpcf7_get_validation_error( $tag->name ); $class = wpcf7_form_controls_class( $tag->type, 'cf7sg-dynamic-list cf7sg-'.$this->tag_id ); if ( $validation_error ) { $class .= ' wpcf7-not-valid'; } $class = $tag->get_class_option( $class ); $id = $tag->get_id_option(); //attributes to be added to the dropdown select field $select_attributes = ''; //capture any attributes to be added to individual options in dropdpwn list. $option_attrs = array(); //other attrbutes captures in the tag manager. $other_attrs = array(); foreach($tag->options as $tag_option){ if(false !== stripos($tag_option, ':')) continue; $other_attrs[$tag_option] = true; } $options = array(); $cf7_form = wpcf7_get_current_contact_form(); $cf7_key = get_cf7form_key($cf7_form->id()); $filter_options = false; /** @since 4.11 enable branches in nesting lists */ $branch = ($this->nesting && is_taxonomy_hierarchical($source['taxonomy']) && $source['tree']) ? array(0):null; $selected=''; if(!empty($tag->values)){ if('taxonomy' == $source['source']){ $options = $this->get_taxonomy_terms($source, $branch, $tag, $cf7_key); // if(!empty($options)) $selected = array_key_first($options); $filter_options = true; }else if('post' == $source['source']){ $args = array( 'post_type' => $source['post'], 'post_status' => 'publish', 'posts_per_page' => -1 ); if(!empty($source['taxonomy'])){ $tax = array(); if(sizeof($source['taxonomy']) > 1){ $tax['relation'] = 'AND'; } foreach($source['taxonomy'] as $term => $taxonomy){ $tax[]=array( 'taxonomy' => $taxonomy, 'field' => 'slug', 'terms' => $term ); } if(count($tax)>1) $tax['relation']='AND'; $args['tax_query'] = $tax; } /** * Filter post query for dynamic dropdown options. * @param array $args an arra of query terms. * @param WPCF7_FormTag $tag the field name being populated. * @param String $cf7_key the form unique key. * @return array an arra of query terms. */ $args = apply_filters_deprecated('cf7sg_dynamic_dropdown_post_query', array( $args, $tag->name, $cf7_key ), '4.11.0', 'cf7sg_dynamic_list_post_query' ); $args = apply_filters('cf7sg_dynamic_list_post_query', $args, $tag->name, $cf7_key); $posts = get_posts($args); // debug_msg($posts, 'post query '); if(!empty($posts)){ $post_taxonomies = get_object_taxonomies($source['post']); // $selected = $posts[0]->post_name; foreach($posts as $post){ /** * Filter dropdown options labels. * @param String $label option label value. * @param mixed $post the post object being used to populate this option. * @param WPCF7_FormTag $tag the field name being populated. * @param String $cf7_key the form unique key. * @return String $label option label value. * @since 2.0.0 */ $label = $post->post_title; $label = apply_filters_deprecated('cf7sg_dynamic_dropdown_option_label', array( $label, $post, $tag->name, $cf7_key ), '4.11.0', "cf7sg_{$this->tag_id}_option_label" ); $label = apply_filters("cf7sg_{$this->tag_id}_option_label", $label, $post, $tag, $cf7_key); $attributes = array(); if( isset($other_attrs['permalinks']) ){ $attributes['data-permalink'] = get_permalink($post); } if( isset($other_attrs['thumbnails']) ){ $size = apply_filters("cf7sg_{$this->tag_id}_image_size", 'thumbnail', $post, $tag, $cf7_key); $attributes['data-thumbnail'] = get_the_post_thumbnail_url($post, $size); } $filter_attributes = apply_filters_deprecated( 'cf7sg_dynamic_dropdown_option_attributes', array( array(), $post, $tag->name, $cf7_key ), '4.11.0', "cf7sg_{$this->tag_id}_options_attributes" ); /** * Filter dropdown options attributes. * @param Array $attributes an array of =>$value pairs which will be used for populating select options, instead of a string $value, an array of values can be passed such as classes. * @param mixed either WP_Post or WP_Term object being used to populate this option. * @param WPCF7_FormTag $tag the field name being populated. * @param String $cf7_key the form unique key. * @return Array array of $value=>$name pairs which will be used for populating select options attributes. * @since 4.11.0 */ $filter_attributes = apply_filters("cf7sg_{$this->tag_id}_options_attributes", array(), $post, $tag, $cf7_key); if(is_array($filter_attributes)){ if(isset($filter_attributes['class'])){ if(!is_array($filter_attributes['class'])) $filter_attributes['class'] = array($filter_attributes['class']); $filter_attributes['class'][]='cf7sg-dl'; }else $filter_attributes['class']=array('cf7sg-dl'); }else $filter_attributes = array('class'=>array('cf7sg-dl')); //setup classes for existing post terms. if(apply_filters("cf7sg_{$this->tag_id}_include_post_terms_as_class", true, $tag, $cf7_key)){ foreach($post_taxonomies as $tx){ $ts = get_the_terms($post, $tx); if($ts && !is_wp_error($ts)) foreach($ts as $t) $filter_attributes['class'][]="$tx-$t->slug"; } } if(is_array($filter_attributes)){ $attributes = array_merge($attributes, $filter_attributes); } $options[$post->post_name] = array($label, $attributes, array()); } } $filter_options = true; }else if('filter' == $source['source']){ $options = apply_filters_deprecated( 'cf7sg_dynamic_dropdown_custom_options', array( '', $tag->name, $cf7_key ), '4.11.0', "cf7sg_custom_{$this->tag_id}" ); if(empty($options)) $options = array(); /** @since 4.11.0 more versatile to allow plugins to customise the option attributes */ $custom_options = apply_filters("cf7sg_custom_{$this->tag_id}", array(), $tag, $cf7_key); if(!empty($custom_options)) $options = $custom_options; } } if($filter_options){ //true if either taxonomy or post dropdpwn...but deprecated. /** * Allow filtering of options populated by posts or taxonomies. * @param array $options an array of $value=>$name pairs which will be used for populating select options. * @param WPCF7_FormTag $tag the field name being populated. * @param String $cf7_key the form unique key. * @return array array of $value=>$name pairs which will be used for populating select options. * @since 1.4.0 */ $options = apply_filters_deprecated('cf7sg_dynamic_dropdown_filter_options', array( $options, $tag->name, $cf7_key), '4.11.0'); } $tag_name = sanitize_html_class( $tag->name ); /** @since 3.3.0 enable custom attributes on select element*/ $attributes = apply_filters_deprecated('cf7sg_dynamic_dropdown_attributes', array(array(), $tag->name, $cf7_key), '4.11.0',"cf7sg_{$this->tag_id}_attributes"); $attributes = apply_filters("cf7sg_{$this->tag_id}_attributes", array(), $tag, $cf7_key); if(!empty($id)) $attributes['id']=$id; $attributes['name']=$tag->name; /** @since 4.0 */ if(isset($other_attrs['permalinks'])) $class.=' cf7sg-permalinks'; $attributes['class']=$class; /** * @since 2.2 allows custom filtered $options to be an html string. */ if(!is_array($options) && !is_string($options)) $options = array(); /** * Filter dynamic dropdown default empty value label. * @param String $label the label for the default value, this is null by default and not shown. * @param WPCF7_FormTag $tag the field name being populated. * @param String $cf7_key the form unique key. * @return String the label for the default value, returning a non-null value with display this as the first option. */ $default_value = apply_filters_deprecated('cf7sg_dynamic_dropdown_default_value', array( null, $tag->name, $cf7_key ),'4.11.0', "cf7sg_{$this->tag_id}_default_value"); $default_value = apply_filters("cf7sg_{$this->tag_id}_default_value", null, $tag, $cf7_key); if(!is_null($default_value)){ $options['']=array($default_value, array(), array()); $selected=''; } $other_classes=''; if(!empty($other_attrs)) $other_classes = ' cf7sg-dl-'.implode(' cf7sg-dl-', array_keys($other_attrs)); $html = '' . PHP_EOL; //add other attributes found in tag. $attributes = array_merge($attributes, $data_attrs); /** * Register a [dynamic_display] shortcode with CF7. * @since 4.11.0 * @param Array $attributes array of attribute key=>value pairs to be included in the html element tag. * @param Array $options array of $value=>array($label,$option_attributes, $children) pairs of options, where $option_attributes is an array of attributest to be added to the option element, and $children is an array of options with the same format representing the nested children of this option parent. * @param Array $other_attrs array of additional attributes $attr=>true (e.g. permalink=>1) added in the form field tag. * @param String $selected default selected value. * @return String an html string representing the input field to a=be added to the field wrapper and into the form. */ $html .= apply_filters("cf7sg_{$this->tag_id}_html_field", '', $attributes, $options, $other_attrs, $selected ); $html .= PHP_EOL . ''. PHP_EOL; return $html; } /** * Retrieve terms to list in dynamic lists. * *@since 4.11.0 *@param Array $source array of taxonomy attributes. *@param Array $branch array of term IDs representing the current branch. *@return Array array of WP_Term objects. */ protected function get_taxonomy_terms($source, $branch, $tag, $cf7_key){ $options = array(); $taxonomy_query= array('hide_empty' => false, 'taxonomy'=>$source['taxonomy']); if(!empty($branch)) $taxonomy_query['parent']=end($branch); $taxonomy_query = apply_filters_deprecated('cf7sg_dynamic_dropdown_taxonomy_query', array( $taxonomy_query, $tag->name, $cf7_key ), '4.11.0', "cf7sg_{$this->tag_id}_taxonomy_query" ); $taxonomy_query = apply_filters("cf7sg_{$this->tag_id}_taxonomy_query", $taxonomy_query, $branch, $tag, $cf7_key); //check the WP version if(empty($taxonomy_query)) return array(); //nothing more to be done here. global $wp_version; if ( $wp_version >= 4.5 ) { $terms = get_terms($taxonomy_query); //WP>= 4.5 the get_terms does not take a taxonomy slug field }else{ $terms = get_terms($source['taxonomy'], $taxonomy_query); } if( is_wp_error( $terms )) { debug_msg($terms, 'Unable to retrieve taxonomy '.$source['taxonomy'].' terms'); $terms = array(); }else{ foreach($terms as $term){ /** * Filter dropdown options labels. * @param String $label option label value. * @param mixed $term the term object being used to populate this option. * @param WPCF7_FormTag $tag the field name being populated. * @param String $cf7_key the form unique key. * @return String $label option label value. * @since 2.0.0 */ $label = $term->name; $label = apply_filters_deprecated('cf7sg_dynamic_dropdown_option_label', array( $label, $term, $tag->name, $cf7_key ), '4.11.0', "cf7sg_{$this->tag_id}_option_label" ); $label = apply_filters("cf7sg_{$this->tag_id}_option_label", $label, $term, $tag, $cf7_key); /** * Filter dropdown options attributes. * @param array $attributes an array of =>$value pairs which will be used for populating select options, instead of a string $value, an array of values can be passed such as classes. * @param mixed either WP_Post or WP_Term object being used to populate this option. * @param WPCF7_FormTag $tag the field name being populated. * @param String $cf7_key the form unique key. * @return Array array of $value=>$name pairs which will be used for populating select options attributes. * @since 2.0.0 */ $attributes = apply_filters_deprecated( 'cf7sg_dynamic_dropdown_option_attributes', array( array(), $term, $tag->name, $cf7_key ), '4.11.0', "cf7sg_{$this->tag_id}_options_attributes" ); /** @since 4.11.0 more versatile to allow plugins to customise the option attributes */ $attributes = apply_filters("cf7sg_{$this->tag_id}_options_attributes", array(), $term, $tag, $cf7_key); if(is_array($attributes)){ if(isset($attributes['class'])){ if(!is_array($attributes['class'])) $attributes['class'] = array($attributes['class']); $attributes['class'][]='cf7sg-dl'; }else $attributes['class']='cf7sg-dl'; }else $attributes = array('class'=>'cf7sg-dl'); $children = array(); //need to build hierarchy if branch is active. if(!empty($branch)){ $branch[]=$term->term_id; $children = $this->get_taxonomy_terms($source, $branch, $tag, $cf7_key); } $options[$term->slug] = array($label, $attributes, $children); } } return $options; } /** * Function to update form classes to track dependencies. * * @since 4.11.0 * @param mixed $class array of classes or string to set class for form and dependency loading . * @param Object $cf7_form cf7 post id against which set the c$lass . **/ public function update_form_classes($class, $cf7_id=null){ if(empty($cf7_id)){ //get latest form if(function_exists('wpcf7_get_current_contact_form')){ $cf7_form = wpcf7_get_current_contact_form(); if(!empty($cf7_form)) $cf7_id = $cf7_form->id(); } } if(empty($cf7_id)){ debug_msg('Unable to get Contact Form 7 ID to set class: '.$class); return; } $classes = get_post_meta($cf7_id, '_cf7sg_classes', true); if(empty($classes)){ $classes = array(); } if(is_array($class)){ foreach($class as $class_name){ $classes[$class_name] = true; } }else{ $classes[$class] = true; } update_post_meta($cf7_id, '_cf7sg_classes', $classes); return; } } if(!function_exists('cf7sg_get_dynamic_lists')){ function cf7sg_get_dynamic_lists($tag_id=null){ return CF7SG_Dynamic_list::get_instances($tag_id); } } /* build a dynamic select dropdown */ if( !function_exists('cf7sg_create_dynamic_select_tag') ){ function cf7sg_create_dynamic_select_tag(){ //check if there is an existing instance in memory. $dl = CF7SG_Dynamic_List::get_instances('dynamic_select'); if(false === $dl){ $dl = new CF7SG_Dynamic_List('dynamic_select',__( 'dynamic-dropdown', 'cf7-grid-layout' )); $dl->set_styles(array( 'select' => __('HTML Select field','cf7-grid-layout'), 'select2' => ''.__('jQuery Select2','cf7-grid-layout').'' ),array( 'select2'=>array( 'tags'=>array( 'label'=> ''.__('Enable user options','cf7-grid-layout').'', 'attrs'=>'disabled' ) ) )); $dl->set_others_extras(array( 'multiple'=> ''.__('Enable multiple selection','cf7-grid-layout').'' )); } return $dl; } } add_action('cf7sg_register_dynamic_lists', 'cf7sg_create_dynamic_select_tag'); /** * Dynamic checkbox * @since 4.11.0 */ if( !function_exists('cf7sg_create_dynamic_checkbox_tag') ){ function cf7sg_create_dynamic_checkbox_tag(){ //check if there is an existing instance in memory. $dl = CF7SG_Dynamic_List::get_instances('dynamic_checkbox'); if(false === $dl){ $dl = new CF7SG_Dynamic_List('dynamic_checkbox',__( 'dynamic-checkbox', 'cf7-grid-layout' )); $dl->set_styles(array( 'cf7sg-hybriddd'=> 'Hybrid Dropdown', 'cf7sg-treeview'=> sprintf(__('Treeview dropdown','cf7-grid-layout'),'https://aurovrata.github.io/hybrid-html-dropdown/examples/#hybrid-dropdown-with-treeview-selection'), 'cf7sg-imagehdd'=> sprintf(__('Image dropdown','cf7-grid-layout'),'https://aurovrata.github.io/hybrid-html-dropdown/examples/#dropdown-list-with-with-custom-labels-with-images'), 'cf7sg-imagegrid'=> sprintf(__('Image grid, no dropdown','cf7-grid-layout'),'https://aurovrata.github.io/hybrid-html-dropdown/examples/#dropdown-list-with-with-custom-labels-with-images') ),array( 'cf7sg-imagehdd'=>sprintf('('.__('Filter term images','cf7-grid-layout').')', 'javascript:void(0);'), 'cf7sg-imagegrid'=>sprintf('('.__('Filter term images','cf7-grid-layout').')', 'javascript:void(0);') )); $dl->set_others_extras_radio(); //default is checkbox. $dl->set_others_extras(array( 'limit'=> __('Limit selections','cf7-grid-layout').'', 'nolimit' => __('Unlimited selections','cf7-grid-layout') )); $dl->allow_nesting(); //flag as able to handle hierarchical lists. } return $dl; } } add_action('cf7sg_register_dynamic_lists', 'cf7sg_create_dynamic_checkbox_tag');