You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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;
}