_args = $this->_get_args(); $this->_args['labels'] = $this->_get_labels(); $this->_apply_filters(); $this->_sanity_check(); if ( empty( self::$_instances ) ) { self::$_instances['cpt'] = array(); self::$_instances['taxonomy'] = array(); add_action( 'init', 'ET_Core_Post_Object::register_all' ); } self::$_instances[ $this->wp_type ][ $this->name ] = $this; } /** * Applies filters to the instance's filterable properties. */ protected function _apply_filters() { $name = $this->name; if ( 'cpt' === $this->wp_type ) { /** * Filters the `$args` for a custom post type. The dynamic portion of the * filter, `$name`, refers to the name/key of the post type being registered. * * @since 3.0.99 * * @param array $args {@see register_post_type()} */ $this->_args = apply_filters( "et_core_cpt_{$name}_args", $this->_args ); } else if ( 'taxonomy' === $this->wp_type ) { /** * Filters the `$args` for a custom post taxonomy. The dynamic portion of the * filter, `$name`, refers to the name/key of the taxonomy being registered. * * @since 3.0.99 * * @param array $args {@see register_taxonomy()} */ $this->_args = apply_filters( "et_core_taxonomy_{$name}_args", $this->_args ); } } /** * This method is called right before registering the object. It is intended to be * overridden by child classes as needed. */ protected function _before_register() {} /** * Returns the args for the instance. * See {@see register_post_type()} or {@see register_taxonomy()}. * * @return array $args */ abstract protected function _get_args(); /** * Returns labels for the instance. * See {@see register_post_type()} or {@see register_taxonomy()}. * * @return array $labels */ abstract protected function _get_labels(); /** * Checks for required properties and existing instances. */ protected function _sanity_check() { if ( ! $this->_args || ! $this->name || ! $this->wp_type ) { et_error( 'Missing required properties!' ); wp_die(); } else if ( isset( self::$_instances[ $this->wp_type ][ $this->name ] ) ) { et_error( 'Multiple instances are not allowed!' ); wp_die(); } } /** * Get a derived class instance. * * @since 3.0.99 * * @param string $type See {@see self::$wp_type} for accepted values. Default is 'cpt'. * @param string $name The name/slug of the derived object. Default is an empty string. * * @return self|null */ public static function instance( $type = 'cpt', $name = '' ) { if ( ! self::$_ ) { self::$_ = ET_Core_Data_Utils::instance(); } return self::$_->array_get( self::$_instances, "{$type}.{$name}", null ); } /** * Calls either {@see register_post_type} or {@see register_taxonomy} for each instance. * * @since 3.0.99 * * @param string $owner Optional. Only register objects owned by a part of the codebase. * See {@see self::_owner} for accepted values. */ public static function register_all( $owner = null ) { if ( empty( self::$_instances ) ) { return; } global $wp_taxonomies; foreach ( self::$_instances['taxonomy'] as $name => $instance ) { $can_register = is_null( $owner ) || $owner === $instance->_owner; if ( $instance->_registered || ! $can_register ) { continue; } $instance->_before_register(); register_taxonomy( $name, $instance->post_types, $instance->_args ); $instance->_wp_object = $wp_taxonomies[ $name ]; $instance->_registered = true; } foreach ( self::$_instances['cpt'] as $name => $instance ) { $can_register = is_null( $owner ) || $owner === $instance->_owner; if ( $instance->_registered || ! $can_register ) { continue; } $instance->_before_register(); $instance->_wp_object = register_post_type( $name, $instance->_args ); $instance->_registered = true; } } }