This repository has been archived on 2024-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
usergalaxy/cmb2/includes/types/CMB2_Type_Taxonomy_Base.php

88 lines
2.2 KiB
PHP

<?php
/**
* CMB Taxonomy base field type
*
* @since 2.2.2
*
* @category WordPress_Plugin
* @package CMB2
* @author WebDevStudios
* @license GPL-2.0+
* @link http://webdevstudios.com
*/
abstract class CMB2_Type_Taxonomy_Base extends CMB2_Type_Multi_Base {
/**
* Checks if we can get a post object, and if so, uses `get_the_terms` which utilizes caching.
* @since 1.0.2
* @return mixed Array of terms on success
*/
public function get_object_terms() {
if ( 'options-page' === $this->field->object_type ) {
return $this->options_terms();
}
if ( 'post' !== $this->field->object_type ) {
return $this->non_post_object_terms();
}
// WP caches internally so it's better to use
return get_the_terms( $this->field->object_id, $this->field->args( 'taxonomy' ) );
}
/**
* Gets the term objects for the terms stored via options boxes.
* @since 2.2.4
* @return mixed Array of terms on success
*/
public function options_terms() {
if ( empty( $this->field->value ) ) {
return array();
}
$terms = (array) $this->field->value;
foreach ( $terms as $index => $term ) {
$terms[ $index ] = get_term_by( 'slug', $term, $this->field->args( 'taxonomy' ) );
}
return $terms;
}
/**
* For non-post objects, wraps the call to wp_get_object_terms with transient caching.
* @since 2.2.4
* @return mixed Array of terms on success
*/
public function non_post_object_terms() {
$object_id = $this->field->object_id;
$taxonomy = $this->field->args( 'taxonomy' );
$cache_key = "cmb-cache-{$taxonomy}-{$object_id}";
// Check cache
$cached = get_transient( $cache_key );
if ( ! $cached ) {
$cached = wp_get_object_terms( $object_id, $taxonomy );
// Do our own (minimal) caching. Long enough for a page-load.
set_transient( $cache_key, $cached, 60 );
}
return $cached;
}
/**
* Wrapper for `get_terms` to account for changes in WP 4.6 where taxonomy is expected
* as part of the arguments.
* @since 2.2.2
* @return mixed Array of terms on success
*/
public function get_terms() {
return CMB2_Utils::wp_at_least( '4.5.0' )
? get_terms( array( 'taxonomy' => $this->field->args( 'taxonomy' ), 'hide_empty' => false ) )
: get_terms( $this->field->args( 'taxonomy' ), 'hide_empty=0' );
}
}