Last active
April 12, 2020 05:12
-
-
Save jtsternberg/5959920 to your computer and use it in GitHub Desktop.
Removes and replaces the built-in taxonomy metabox with our radio-select metabox.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
if ( !class_exists( 'WDS_Taxonomy_Radio' ) ) { | |
/** | |
* Removes and replaces the built-in taxonomy metabox with our radio-select metabox. | |
* @link http://codex.wordpress.org/Function_Reference/add_meta_box#Parameters | |
*/ | |
class WDS_Taxonomy_Radio { | |
// Post types where metabox should be replaced (defaults to all post_types associated with taxonomy) | |
public $post_types = array(); | |
// Taxonomy slug | |
public $slug = ''; | |
// Taxonomy object | |
public $taxonomy = false; | |
// New metabox title. Defaults to Taxonomy name | |
public $metabox_title = ''; | |
// Metabox priority. (vertical placement) | |
// 'high', 'core', 'default' or 'low' | |
public $priority = 'high'; | |
// Metabox position. (column placement) | |
// 'normal', 'advanced', or 'side' | |
public $context = 'side'; | |
// Set to true to hide "None" option & force a term selection | |
public $force_selection = false; | |
/** | |
* Initiates our metabox action | |
* @param string $tax_slug Taxonomy slug | |
* @param array $post_types post-types to display custom metabox | |
*/ | |
public function __construct( $tax_slug, $post_types = array() ) { | |
$this->slug = $tax_slug; | |
$this->post_types = is_array( $post_types ) ? $post_types : array( $post_types ); | |
add_action( 'add_meta_boxes', array( $this, 'add_radio_box' ) ); | |
} | |
/** | |
* Removes and replaces the built-in taxonomy metabox with our own. | |
*/ | |
public function add_radio_box() { | |
foreach ( $this->post_types() as $key => $cpt ) { | |
// remove default category type metabox | |
remove_meta_box( $this->slug .'div', $cpt, 'core' ); | |
// remove default tag type metabox | |
remove_meta_box( 'tagsdiv-'.$this->slug, $cpt, 'core' ); | |
// add our custom radio box | |
add_meta_box( $this->slug .'_radio', $this->metabox_title(), array( $this, 'radio_box' ), $cpt, $this->context, $this->priority ); | |
} | |
} | |
/** | |
* Displays our taxonomy radio box metabox | |
*/ | |
public function radio_box() { | |
// uses same noncename as default box so no save_post hook needed | |
wp_nonce_field( 'taxonomy_'. $this->slug, 'taxonomy_noncename' ); | |
// get terms associated with this post | |
$names = wp_get_object_terms( get_the_ID(), $this->slug ); | |
// get all terms in this taxonomy | |
$terms = (array) get_terms( $this->slug, 'hide_empty=0' ); | |
// filter the ids out of the terms | |
$existing = ( !is_wp_error( $names ) && !empty( $names ) ) | |
? (array) wp_list_pluck( $names, 'term_id' ) | |
: array(); | |
// Check if taxonomy is hierarchical | |
// Terms are saved differently between types | |
$h = $this->taxonomy()->hierarchical; | |
// default value | |
$default_val = $h ? 0 : ''; | |
// input name | |
$name = $h ? 'tax_input['. $this->slug .'][]' : 'tax_input['. $this->slug .']'; | |
echo '<div style="margin-bottom: 5px;"> | |
<ul id="'. $this->slug .'_taxradiolist" data-wp-lists="list:'. $this->slug .'_tax" class="categorychecklist form-no-clear">'; | |
// If 'category,' force a selection, or force_selection is true | |
if ( $this->slug != 'category' && !$this->force_selection ) { | |
// our radio for selecting none | |
echo '<li id="'. $this->slug .'_tax-0"><label><input value="'. $default_val .'" type="radio" name="'. $name .'" id="in-'. $this->slug .'_tax-0" '; | |
checked( empty( $existing ) ); | |
echo '> '. sprintf( __( 'No %s', 'wds' ), $this->taxonomy()->labels->singular_name ) .'</label></li>'; | |
} | |
// loop our terms and check if they're associated with this post | |
foreach ( $terms as $term ) { | |
$val = $h ? $term->term_id : $term->slug; | |
echo '<li id="'. $this->slug .'_tax-'. $term->term_id .'"><label><input value="'. $val .'" type="radio" name="'. $name .'" id="in-'. $this->slug .'_tax-'. $term->term_id .'" '; | |
// if so, they get "checked" | |
checked( !empty( $existing ) && in_array( $term->term_id, $existing ) ); | |
echo '> '. $term->name .'</label></li>'; | |
} | |
echo '</ul></div>'; | |
} | |
/** | |
* Gets the taxonomy object from the slug | |
* @return object Taxonomy object | |
*/ | |
public function taxonomy() { | |
$this->taxonomy = $this->taxonomy ? $this->taxonomy : get_taxonomy( $this->slug ); | |
return $this->taxonomy; | |
} | |
/** | |
* Gets the taxonomy's associated post_types | |
* @return array Taxonomy's associated post_types | |
*/ | |
public function post_types() { | |
$this->post_types = !empty( $this->post_types ) ? $this->post_types : $this->taxonomy()->object_type; | |
return $this->post_types; | |
} | |
/** | |
* Gets the metabox title from the taxonomy object's labels (or uses the passed in title) | |
* @return string Metabox title | |
*/ | |
public function metabox_title() { | |
$this->metabox_title = !empty( $this->metabox_title ) ? $this->metabox_title : $this->taxonomy()->labels->name; | |
return $this->metabox_title; | |
} | |
} | |
$custom_tax_mb = new WDS_Taxonomy_Radio( 'custom-tax-slug' ); | |
// Update optional properties | |
// $custom_tax_mb->priority = 'low'; | |
// $custom_tax_mb->context = 'normal'; | |
// $custom_tax_mb->metabox_title = __( 'Custom Metabox Title', 'yourtheme' ); | |
// $custom_tax_mb->force_selection = true; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@helenhousandi Awesome pointers. Thanks for taking the time to look over the snippet & write your thoughts.