<?php // phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong namespace Yoast\WP\SEO\Dashboard\Infrastructure\Taxonomies; use WP_Taxonomy; use Yoast\WP\SEO\Dashboard\Domain\Taxonomies\Taxonomy; /** * Class that collects taxonomies and relevant information. */ class Taxonomies_Collector { /** * The taxonomy validator. * * @var Taxonomy_Validator */ private $taxonomy_validator; /** * The constructor. * * @param Taxonomy_Validator $taxonomy_validator The taxonomy validator. */ public function __construct( Taxonomy_Validator $taxonomy_validator ) { $this->taxonomy_validator = $taxonomy_validator; } /** * Returns a custom pair of taxonomy/content type, that's been given by users via hooks. * * @param string $content_type The content type we're hooking for. * * @return Taxonomy|null The hooked filtering taxonomy. */ public function get_custom_filtering_taxonomy( string $content_type ) { /** * Filter: 'wpseo_{$content_type}_filtering_taxonomy' - Allows overriding which taxonomy filters the content type. * * @internal * * @param string $filtering_taxonomy The taxonomy that filters the content type. */ $filtering_taxonomy = \apply_filters( "wpseo_{$content_type}_filtering_taxonomy", '' ); if ( $filtering_taxonomy !== '' ) { $taxonomy = $this->get_taxonomy( $filtering_taxonomy, $content_type ); if ( $taxonomy ) { return $taxonomy; } \_doing_it_wrong( 'Filter: \'wpseo_{$content_type}_filtering_taxonomy\'', 'The `wpseo_{$content_type}_filtering_taxonomy` filter should return a public taxonomy, available in REST API, that is associated with that content type.', 'YoastSEO v24.1' ); } return null; } /** * Returns the fallback, WP-native category taxonomy, if it's associated with the specific content type. * * @param string $content_type The content type. * * @return Taxonomy|null The taxonomy object for the category taxonomy. */ public function get_fallback_taxonomy( string $content_type ): ?Taxonomy { return $this->get_taxonomy( 'category', $content_type ); } /** * Returns the taxonomy object that filters a specific content type. * * @param string $taxonomy_name The name of the taxonomy we're going to build the object for. * @param string $content_type The content type that the taxonomy object is filtering. * * @return Taxonomy|null The taxonomy object. */ public function get_taxonomy( string $taxonomy_name, string $content_type ): ?Taxonomy { $taxonomy = \get_taxonomy( $taxonomy_name ); if ( $this->taxonomy_validator->is_valid_taxonomy( $taxonomy, $content_type ) ) { return new Taxonomy( $taxonomy->name, $taxonomy->label, $this->get_taxonomy_rest_url( $taxonomy ) ); } return null; } /** * Builds the REST API URL for the taxonomy. * * @param WP_Taxonomy $taxonomy The taxonomy we want to build the REST API URL for. * * @return string The REST API URL for the taxonomy. */ protected function get_taxonomy_rest_url( WP_Taxonomy $taxonomy ): string { $rest_base = ( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name; $rest_namespace = ( $taxonomy->rest_namespace ) ? $taxonomy->rest_namespace : 'wp/v2'; return \rest_url( "{$rest_namespace}/{$rest_base}" ); } }