all-in-one-event-calendar/app/model/taxonomy.php
2017-11-09 17:36:04 +01:00

196 lines
No EOL
6.1 KiB
PHP

<?php
/**
* Model used for storing/retrieving taxonomy.
*
* @author Time.ly Network, Inc.
* @since 2.0
* @package Ai1EC
* @subpackage Ai1EC.Html
*/
class Ai1ec_Taxonomy extends Ai1ec_Base {
/**
* @var array Map of taxonomy values.
*/
protected $_taxonomy_map = array(
'events_categories' => array(),
'events_tags' => array(),
);
/**
* Callback to pre-populate taxonomies before exporting ics.
* All taxonomies which are not tags are exported as event_categories
*
* @param array $post_ids List of Post IDs to inspect.
*
* @return void
*/
public function prepare_meta_for_ics( array $post_ids ) {
$taxonomies = get_object_taxonomies( AI1EC_POST_TYPE );
$categories = array();
$excluded_categories = array(
'events_tags' => true,
'events_feeds' => true
);
foreach ( $taxonomies as $taxonomy ) {
if ( isset( $excluded_categories[$taxonomy] ) ) {
continue;
}
$categories[] = $taxonomy;
}
foreach ( $post_ids as $post_id ) {
$post_id = (int)$post_id;
$this->_taxonomy_map['events_categories'][$post_id] = array();
$this->_taxonomy_map['events_tags'][$post_id] = array();
}
$tags = wp_get_object_terms(
$post_ids,
array( 'events_tags' ),
array( 'fields' => 'all_with_object_id' )
);
foreach ( $tags as $term ) {
$this->_taxonomy_map[$term->taxonomy][$term->object_id][] = $term;
}
$category_terms = wp_get_object_terms(
$post_ids,
$categories,
array( 'fields' => 'all_with_object_id' )
);
foreach ( $category_terms as $term ) {
$this->_taxonomy_map['events_categories'][$term->object_id][] = $term;
}
}
/**
* Callback to pre-populate taxonomies before processing.
*
* @param array $post_ids List of Post IDs to inspect.
*
* @return void
*/
public function update_meta( array $post_ids ) {
foreach ( $post_ids as $post_id ) {
$post_id = (int)$post_id;
$this->_taxonomy_map['events_categories'][$post_id] = array();
$this->_taxonomy_map['events_tags'][$post_id] = array();
}
$terms = wp_get_object_terms(
$post_ids,
array( 'events_categories', 'events_tags' ),
array( 'fields' => 'all_with_object_id' )
);
foreach ( $terms as $term ) {
$this->_taxonomy_map[$term->taxonomy][$term->object_id][] = $term;
}
}
/**
* Re-fetch category entries map from database.
*
* @return array Map of category entries.
*/
public function fetch_category_map() {
$category_map = array();
$records = (array)$this->_registry->get( 'dbi.dbi' )->select(
'ai1ec_event_category_meta',
array( 'term_id', 'term_image', 'term_color' )
);
foreach ( $records as $row ) {
$image = $color = null;
if ( $row->term_image ) {
$image = $row->term_image;
}
if ( $row->term_color ) {
$color = $row->term_color;
}
$category_map[(int)$row->term_id] = compact( 'image', 'color' );
}
return $category_map;
}
/**
* Get taxonomy values for specified post.
*
* @param int $post_id Actual Post ID to check.
* @param string $taxonomy Name of taxonomy to retrieve values for.
*
* @return array List of terms (stdClass'es) associated with post.
*/
public function get_post_taxonomy( $post_id, $taxonomy ) {
$post_id = (int)$post_id;
if ( ! isset( $this->_taxonomy_map[$taxonomy][$post_id] ) ) {
$definition = wp_get_post_terms( $post_id, $taxonomy );
if ( empty( $definition ) || is_wp_error( $definition ) ) {
$definition = array();
}
$this->_taxonomy_map[$taxonomy][$post_id] = $definition;
}
return $this->_taxonomy_map[$taxonomy][$post_id];
}
/**
* Get post (event) categories taxonomy.
*
* @param int $post_id Checked post ID.
*
* @return array List of categories (stdClass'es) associated with event.
*/
public function get_post_categories( $post_id ) {
return $this->get_post_taxonomy( $post_id, 'events_categories' );
}
/**
* Get post (event) tags taxonomy.
*
* @param int $post_id Checked post ID.
*
* @return array List of tags (stdClass'es) associated with event.
*/
public function get_post_tags( $post_id ) {
return $this->get_post_taxonomy( $post_id, 'events_tags' );
}
/**
* Get cached category description field.
*
* @param int $term_id Category ID.
* @param string $field Name of field, one of 'image', 'color'.
*
* @return string|null Field value or null if entry is not found.
*/
public function get_category_field( $term_id, $field ) {
static $category_meta = null;
if ( null === $category_meta ) {
$category_meta = $this->fetch_category_map();
}
$term_id = (int)$term_id;
if ( ! isset( $category_meta[$term_id] ) ) {
return null;
}
return $category_meta[$term_id][$field];
}
/**
* Returns the color of the Event Category having the given term ID.
*
* @param int $term_id The ID of the Event Category.
*
* @return string|null Color to use
*/
public function get_category_color( $term_id ) {
return $this->get_category_field( $term_id, 'color' );
}
/**
* Returns the image of the Event Category having the given term ID.
*
* @param int $term_id The ID of the Event Category.
*
* @return string|null Image url to use.
*/
public function get_category_image( $term_id ) {
return $this->get_category_field( $term_id, 'image' );
}
}