210 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Class Taxonomy_Base.
 | 
						|
 *
 | 
						|
 * @link      https://github.com/googleforcreators/web-stories-wp
 | 
						|
 *
 | 
						|
 * @copyright 2021 Google LLC
 | 
						|
 * @license   https://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * Copyright 2021 Google LLC
 | 
						|
 *
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 * you may not use this file except in compliance with the License.
 | 
						|
 * You may obtain a copy of the License at
 | 
						|
 *
 | 
						|
 *     https://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 * Unless required by applicable law or agreed to in writing, software
 | 
						|
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 * See the License for the specific language governing permissions and
 | 
						|
 * limitations under the License.
 | 
						|
 */
 | 
						|
 | 
						|
declare(strict_types = 1);
 | 
						|
 | 
						|
namespace Google\Web_Stories\Taxonomy;
 | 
						|
 | 
						|
use Google\Web_Stories\Infrastructure\PluginActivationAware;
 | 
						|
use Google\Web_Stories\Infrastructure\PluginDeactivationAware;
 | 
						|
use Google\Web_Stories\Infrastructure\PluginUninstallAware;
 | 
						|
use Google\Web_Stories\Infrastructure\SiteInitializationAware;
 | 
						|
use Google\Web_Stories\Service_Base;
 | 
						|
use WP_Site;
 | 
						|
use WP_Term;
 | 
						|
use WP_Term_Query;
 | 
						|
 | 
						|
/**
 | 
						|
 * Taxonomy_Base class
 | 
						|
 *
 | 
						|
 * @phpstan-type TaxonomyArgs array{
 | 
						|
 *   labels?: string[],
 | 
						|
 *   description?: string,
 | 
						|
 *   public?: bool,
 | 
						|
 *   publicly_queryable?: bool,
 | 
						|
 *   hierarchical?: bool,
 | 
						|
 *   show_ui?: bool,
 | 
						|
 *   show_in_menu?: bool,
 | 
						|
 *   show_in_nav_menus?: bool,
 | 
						|
 *   show_in_rest?: bool,
 | 
						|
 *   rest_base?: string,
 | 
						|
 *   rest_namespace?: string,
 | 
						|
 *   rest_controller_class?: string,
 | 
						|
 *   show_tagcloud?: bool,
 | 
						|
 *   show_in_quick_edit?: bool,
 | 
						|
 *   show_admin_column?: bool,
 | 
						|
 *   meta_box_cb?: bool|callable,
 | 
						|
 *   meta_box_sanitize_cb?: callable,
 | 
						|
 *   capabilities?: string[],
 | 
						|
 *   rewrite?: bool|array{
 | 
						|
 *     slug?: string,
 | 
						|
 *     with_front?: bool,
 | 
						|
 *     hierarchical?: bool,
 | 
						|
 *     ep_mask?: int
 | 
						|
 *   },
 | 
						|
 *   query_var?: string|bool,
 | 
						|
 *   update_count_callback?: callable,
 | 
						|
 *   default_term?: string|array{
 | 
						|
 *     name?: string,
 | 
						|
 *     slug?: string,
 | 
						|
 *     description?: string
 | 
						|
 *   },
 | 
						|
 *   sort?: bool,
 | 
						|
 *   args?: array<string, mixed>,
 | 
						|
 *   _builtin?: bool,
 | 
						|
 * }
 | 
						|
 */
 | 
						|
abstract class Taxonomy_Base extends Service_Base implements PluginActivationAware, PluginDeactivationAware, SiteInitializationAware, PluginUninstallAware {
 | 
						|
 | 
						|
	public const DEFAULT_CAPABILITIES = [
 | 
						|
		'manage_terms' => 'manage_terms_web-stories',
 | 
						|
		'edit_terms'   => 'edit_terms_web-stories',
 | 
						|
		'delete_terms' => 'delete_terms_web-stories',
 | 
						|
		'assign_terms' => 'assign_terms_web-stories',
 | 
						|
	];
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Default REST Namespace.
 | 
						|
	 */
 | 
						|
	public const REST_NAMESPACE = 'web-stories/v1';
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Taxonomy key, must not exceed 32 characters.
 | 
						|
	 */
 | 
						|
	protected string $taxonomy_slug;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Object type which the taxonomy should be associated.
 | 
						|
	 */
 | 
						|
	protected string $taxonomy_post_type;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Register taxonomy on register service.
 | 
						|
	 *
 | 
						|
	 * @since 1.12.0
 | 
						|
	 */
 | 
						|
	public function register(): void {
 | 
						|
		$this->register_taxonomy();
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Register taxonomy.
 | 
						|
	 *
 | 
						|
	 * @since 1.12.0
 | 
						|
	 */
 | 
						|
	public function register_taxonomy(): void {
 | 
						|
		register_taxonomy( $this->taxonomy_slug, $this->taxonomy_post_type, $this->taxonomy_args() );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Unregister taxonomy.
 | 
						|
	 *
 | 
						|
	 * @since 1.12.0
 | 
						|
	 */
 | 
						|
	public function unregister_taxonomy(): void {
 | 
						|
		unregister_taxonomy( $this->taxonomy_slug );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Act on site initialization.
 | 
						|
	 *
 | 
						|
	 * @since 1.12.0
 | 
						|
	 *
 | 
						|
	 * @param WP_Site $site The site being initialized.
 | 
						|
	 */
 | 
						|
	public function on_site_initialization( WP_Site $site ): void {
 | 
						|
		$this->register_taxonomy();
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Act on plugin activation.
 | 
						|
	 *
 | 
						|
	 * @since 1.12.0
 | 
						|
	 *
 | 
						|
	 * @param bool $network_wide Whether the activation was done network-wide.
 | 
						|
	 */
 | 
						|
	public function on_plugin_activation( bool $network_wide ): void {
 | 
						|
		$this->register_taxonomy();
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Act on plugin deactivation.
 | 
						|
	 *
 | 
						|
	 * @since 1.12.0
 | 
						|
	 *
 | 
						|
	 * @param bool $network_wide Whether the deactivation was done network-wide.
 | 
						|
	 */
 | 
						|
	public function on_plugin_deactivation( bool $network_wide ): void {
 | 
						|
		$this->unregister_taxonomy();
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Get taxonomy slug.
 | 
						|
	 *
 | 
						|
	 * @since 1.12.0
 | 
						|
	 */
 | 
						|
	public function get_taxonomy_slug(): string {
 | 
						|
		return $this->taxonomy_slug;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Act on plugin uninstall.
 | 
						|
	 *
 | 
						|
	 * @since 1.26.0
 | 
						|
	 */
 | 
						|
	public function on_plugin_uninstall(): void {
 | 
						|
		clean_taxonomy_cache( $this->get_taxonomy_slug() );
 | 
						|
 | 
						|
		$term_query = new WP_Term_Query();
 | 
						|
		$terms      = $term_query->query(
 | 
						|
			[
 | 
						|
				'taxonomy'   => $this->get_taxonomy_slug(),
 | 
						|
				'hide_empty' => false,
 | 
						|
			]
 | 
						|
		);
 | 
						|
 | 
						|
		if ( empty( $terms ) || ! \is_array( $terms ) ) {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		foreach ( $terms as $term ) {
 | 
						|
			if ( $term instanceof WP_Term ) {
 | 
						|
				wp_delete_term( $term->term_id, $term->taxonomy );
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Taxonomy args.
 | 
						|
	 *
 | 
						|
	 * @since 1.12.0
 | 
						|
	 *
 | 
						|
	 * @return TaxonomyArgs Taxonomy args.
 | 
						|
	 */
 | 
						|
	abstract protected function taxonomy_args(): array;
 | 
						|
}
 |