Skip to content

Instantly share code, notes, and snippets.

@electricbrick
Last active October 6, 2016 15:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save electricbrick/cec719bf650e535e143f518603dd38ed to your computer and use it in GitHub Desktop.
Save electricbrick/cec719bf650e535e143f518603dd38ed to your computer and use it in GitHub Desktop.
ACF Multisite Taxonomy Select (4.0 and lower)
<?php
class acf_ms_taxonomy extends acf_field
{
var $defaults;
/*
* __construct
*
* Set name / label needed for actions / filters
*
* @since 3.6
* @date 23/01/13
*/
function __construct()
{
// vars
$this->name = 'mstaxonomy';
$this->label = __("MS Taxonomy",'acf');
$this->category = __("Relational",'acf');
// settings
$this->defaults = array(
'taxonomy' => 'category',
'field_type' => 'checkbox',
'allow_null' => 0,
'load_save_terms' => 0,
'multiple' => 0,
'return_format' => 'id'
);
// do not delete!
parent::__construct();
}
/*
* load_value()
*
* This filter is appied to the $value after it is loaded from the db
*
* @type filter
* @since 3.6
* @date 23/01/13
*
* @param $value - the value found in the database
* @param $post_id - the $post_id from which the value was loaded from
* @param $field - the field array holding all the field options
*
* @return $value - the value to be saved in te database
*/
function load_value( $value, $post_id, $field )
{
// vars
$field = array_merge($this->defaults, $field);
if( $field['load_save_terms'] )
{
$value = array();
$terms = get_the_terms( $post_id, $field['taxonomy'] );
if( is_array($terms) ){ foreach( $terms as $term ){
$value[] = $term->term_id;
}}
}
return $value;
}
/*
* update_value()
*
* This filter is appied to the $value before it is updated in the db
*
* @type filter
* @since 3.6
* @date 23/01/13
*
* @param $value - the value which will be saved in the database
* @param $field - the field array holding all the field options
* @param $post_id - the $post_id of which the value will be saved
*
* @return $value - the modified value
*/
function update_value( $value, $post_id, $field )
{
// vars
$field = array_merge($this->defaults, $field);
if( is_array($value) )
{
$value = array_filter($value);
}
if( $field['load_save_terms'] )
{
// Parse values
$value = apply_filters( 'acf/parse_types', $value );
wp_set_object_terms( $post_id, $value, $field['taxonomy'], false );
}
return $value;
}
/*
* format_value_for_api()
*
* This filter is appied to the $value after it is loaded from the db and before it is passed back to the api functions such as the_field
*
* @type filter
* @since 3.6
* @date 23/01/13
*
* @param $value - the value which was loaded from the database
* @param $post_id - the $post_id from which the value was loaded
* @param $field - the field array holding all the field options
*
* @return $value - the modified value
*/
function format_value_for_api( $value, $post_id, $field )
{
// defaults
$field = array_merge($this->defaults, $field);
// temp convert to array
$is_array = true;
if( !is_array($value) )
{
$is_array = false;
$value = array( $value );
}
// format
if( $field['return_format'] == 'object' )
{
foreach( $value as $k => $v )
{
$value[ $k ] = get_term( $v, $field['taxonomy'] );
}
}
// de-convert from array
if( !$is_array && isset($value[0]) )
{
$value = $value[0];
}
// Note: This function can be removed if not used
return $value;
}
/*
* create_field()
*
* Create the HTML interface for your field
*
* @type action
* @since 3.6
* @date 23/01/13
*
* @param $field - an array holding all the field's data
*/
function create_field( $field )
{
global $blog_id, $original_blog_id;
// vars
$field = array_merge($this->defaults, $field);
$single_name = $field['name'];
// multi select?
if( $field['field_type'] == 'multi_select' )
{
$field['multiple'] = 1;
$field['field_type'] = 'select';
$field['name'] .= '[]';
}
elseif( $field['field_type'] == 'checkbox' )
{
$field['name'] .= '[]';
}
// value must be array!
if( !is_array($field['value']) )
{
$field['value'] = array( $field['value'] );
}
?>
<div class="acf-taxonomy-field">
<input type="hidden" name="<?php echo $single_name; ?>" value="" />
<?php if( $field['field_type'] == 'select' ): ?>
<select name="<?php echo $field['name']; ?>" <?php if( $field['multiple'] ): ?>multiple="multiple" size="5"<?php endif; ?>>
<?php if( $field['allow_null'] ): ?>
<option value=""><?php _e("None", 'acf'); ?></option>
<?php endif; ?>
<?php else: ?>
<div class="categorychecklist-holder">
<ul class="categorychecklist">
<?php if( $field['allow_null'] ): ?>
<li>
<label class="selectit">
<input type="<?php echo $field['field_type']; ?>" name="<?php echo $field['name']; ?>" value="" /> <?php _e("None", 'acf'); ?>
</label>
</li>
<?php endif; ?>
<?php endif; ?>
<?php
$original_blog_id = $blog_id;
if($blog_id != 1) {
switch_to_blog(1);
}
wp_list_categories( array(
'taxonomy' => $field['taxonomy'],
'hide_empty' => false,
'style' => 'none',
'walker' => new acf_ms_taxonomy_field_walker( $field ),
));
if($blog_id != $original_blog_id) {
restore_current_blog();
}
?>
<?php if( $field['field_type'] == 'select' ): ?>
</select>
<?php else: ?>
</ul>
</div>
<?php endif; ?>
</div>
<?php
}
/*
* create_options()
*
* Create extra options for your field. This is rendered when editing a field.
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
*
* @type action
* @since 3.6
* @date 23/01/13
*
* @param $field - an array holding all the field's data
*/
function create_options( $field )
{
global $blog_id, $original_blog_id;
// vars
$field = array_merge($this->defaults, $field);
$key = $field['name'];
?>
<tr class="field_option field_option_<?php echo $this->name; ?>">
<td class="label">
<label><?php _e("Taxonomy",'acf'); ?></label>
</td>
<td>
<?php
$original_blog_id = $blog_id;
if($blog_id != 1) {
switch_to_blog(1);
}
$choices = array();
$taxonomies = get_taxonomies( array('public' => true), 'objects' );
if($blog_id != $original_blog_id) {
restore_current_blog();
}
foreach($taxonomies as $taxonomy)
{
$choices[ $taxonomy->name ] = $taxonomy->labels->name;
}
// unset post_format (why is this a public taxonomy?)
if( isset($choices['post_format']) )
{
unset( $choices['post_format']) ;
}
do_action('acf/create_field', array(
'type' => 'select',
'name' => 'fields['.$key.'][taxonomy]',
'value' => $field['taxonomy'],
'choices' => $choices,
));
?>
</td>
</tr>
<tr class="field_option field_option_<?php echo $this->name; ?>">
<td class="label">
<label><?php _e("Field Type",'acf'); ?></label>
</td>
<td>
<?php
do_action('acf/create_field', array(
'type' => 'select',
'name' => 'fields['.$key.'][field_type]',
'value' => $field['field_type'],
'optgroup' => true,
'choices' => array(
__("Multiple Values",'acf') => array(
'checkbox' => __('Checkbox', 'acf'),
'multi_select' => __('Multi Select', 'acf')
),
__("Single Value",'acf') => array(
'radio' => __('Radio Buttons', 'acf'),
'select' => __('Select', 'acf')
)
)
));
?>
</td>
</tr>
<tr class="field_option field_option_<?php echo $this->name; ?>">
<td class="label">
<label><?php _e("Allow Null?",'acf'); ?></label>
</td>
<td>
<?php
do_action('acf/create_field', array(
'type' => 'radio',
'name' => 'fields['.$key.'][allow_null]',
'value' => $field['allow_null'],
'choices' => array(
1 => __("Yes",'acf'),
0 => __("No",'acf'),
),
'layout' => 'horizontal',
));
?>
</td>
</tr>
<tr class="field_option field_option_<?php echo $this->name; ?>">
<td class="label">
<label><?php _e("Load & Save Terms to Post",'acf'); ?></label>
</td>
<td>
<?php
do_action('acf/create_field', array(
'type' => 'true_false',
'name' => 'fields['.$key.'][load_save_terms]',
'value' => $field['load_save_terms'],
'message' => __("Load value based on the post's terms and update the post's terms on save",'acf')
));
?>
</td>
</tr>
<tr class="field_option field_option_<?php echo $this->name; ?>">
<td class="label">
<label><?php _e("Return Value",'acf'); ?></label>
</td>
<td>
<?php
do_action('acf/create_field', array(
'type' => 'radio',
'name' => 'fields['.$key.'][return_format]',
'value' => $field['return_format'],
'layout' => 'horizontal',
'choices' => array(
'object' => __("Term Object",'acf'),
'id' => __("Term ID",'acf')
)
));
?>
</td>
</tr>
<?php
}
}
class acf_ms_taxonomy_field_walker extends Walker
{
// vars
var $field = null,
$tree_type = 'category',
$db_fields = array ( 'parent' => 'parent', 'id' => 'term_id' );
// construct
function __construct( $field )
{
$this->field = $field;
}
// start_el
function start_el( &$output, $term, $depth = 0, $args = array(), $id = 0 )
{
// vars
$selected = in_array( $term->term_id, $this->field['value'] );
if( $this->field['field_type'] == 'checkbox' )
{
$output .= '<li><label class="selectit"><input type="checkbox" name="' . $this->field['name'] . '" value="' . $term->term_id . '" ' . ($selected ? 'checked="checked"' : '') . ' /> ' . $term->name . '</label>';
}
elseif( $this->field['field_type'] == 'radio' )
{
$output .= '<li><label class="selectit"><input type="radio" name="' . $this->field['name'] . '" value="' . $term->term_id . '" ' . ($selected ? 'checked="checkbox"' : '') . ' /> ' . $term->name . '</label>';
}
elseif( $this->field['field_type'] == 'select' )
{
$indent = str_repeat("&mdash;", $depth);
$output .= '<option value="' . $term->term_id . '" ' . ($selected ? 'selected="selected"' : '') . '>' . $indent . ' ' . $term->name . '</option>';
}
}
//end_el
function end_el( &$output, $term, $depth = 0, $args = array(), $id = 0 )
{
if( in_array($this->field['field_type'], array('checkbox', 'radio')) )
{
$output .= '</li>';
}
$output .= "\n";
}
// start_lvl
function start_lvl( &$output, $depth = 0, $args = array() )
{
// indent
//$output .= str_repeat( "\t", $depth);
// wrap element
if( in_array($this->field['field_type'], array('checkbox', 'radio')) )
{
$output .= '<ul class="children">' . "\n";
}
}
// end_lvl
function end_lvl( &$output, $depth = 0, $args = array() )
{
// indent
//$output .= str_repeat( "\t", $depth);
// wrap element
if( in_array($this->field['field_type'], array('checkbox', 'radio')) )
{
$output .= '</ul>' . "\n";
}
}
}
new acf_ms_taxonomy();
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment