OwlCyberSecurity - MANAGER
Edit File: primary-term-watcher.php
<?php /** * Primary Term watcher. * * @package Yoast\YoastSEO\Watchers */ namespace Yoast\WP\Free\Watchers; use Yoast\WP\Free\Exceptions\No_Indexable_Found; use Yoast\WP\Free\Loggers\Logger; use Yoast\WP\Free\Models\Indexable; use Yoast\WP\Free\Models\Primary_Term as Primary_Term_Indexable; use Yoast\WP\Free\WordPress\Integration; /** * Watches Posts to save the primary term when set. */ class Primary_Term_Watcher implements Integration { /** * Initializes the integration. * * This is the place to register hooks and filters. * * @return void */ public function register_hooks() { \add_action( 'save_post', array( $this, 'save_primary_terms' ) ); \add_action( 'delete_post', array( $this, 'delete_primary_terms' ) ); } /** * Deletes primary terms for a post. * * @param int $post_id The post to delete the terms of. * * @return void */ public function delete_primary_terms( $post_id ) { foreach ( $this->get_primary_term_taxonomies( $post_id ) as $taxonomy ) { try { $indexable = $this->get_indexable( $post_id, $taxonomy->name, false ); $indexable->delete(); } catch ( No_Indexable_Found $exception ) { continue; } } } /** * Saves the primary terms for a post. * * @param int $post_id Post ID to save the primary terms for. * * @return void */ public function save_primary_terms( $post_id ) { if ( ! $this->is_post_request() ) { return; } foreach ( $this->get_primary_term_taxonomies( $post_id ) as $taxonomy ) { $this->save_primary_term( $post_id, $taxonomy->name ); } } /** * Save the primary term for a specific taxonomy. * * @param int $post_id Post ID to save primary term for. * @param string $taxonomy Taxonomy to save primary term for. * * @return void */ protected function save_primary_term( $post_id, $taxonomy ) { // This request must be valid. $term_id = $this->get_posted_term_id( $taxonomy ); if ( $term_id && ! $this->is_referer_valid( $taxonomy ) ) { return; } try { $primary_term = $this->get_indexable( $post_id, $taxonomy ); // Removes the indexable when found. if ( empty( $term_id ) ) { $this->delete_indexable( $primary_term ); return; } } catch ( No_Indexable_Found $exception ) { return; } $primary_term->term_id = $term_id; $primary_term->post_id = $post_id; $primary_term->taxonomy = $taxonomy; $primary_term->save(); } /** * Returns all the taxonomies for which the primary term selection is enabled. * * @param int $post_id Default current post ID. * * @return array The taxonomies. */ protected function get_primary_term_taxonomies( $post_id = null ) { if ( null === $post_id ) { $post_id = $this->get_current_id(); } // @todo determine if caching is needed here, no database queries are used? $taxonomies = wp_cache_get( 'primary_term_taxonomies_' . $post_id, 'wpseo' ); if ( false !== $taxonomies ) { return $taxonomies; } $taxonomies = $this->generate_primary_term_taxonomies( $post_id ); wp_cache_set( 'primary_term_taxonomies_' . $post_id, $taxonomies, 'wpseo' ); return $taxonomies; } /** * Generate the primary term taxonomies. * * @param int $post_id ID of the post. * * @return array The taxonomies. */ protected function generate_primary_term_taxonomies( $post_id ) { $post_type = get_post_type( $post_id ); $all_taxonomies = get_object_taxonomies( $post_type, 'objects' ); $all_taxonomies = array_filter( $all_taxonomies, array( $this, 'filter_hierarchical_taxonomies' ) ); /** * Filters which taxonomies for which the user can choose the primary term. * * @api array $taxonomies An array of taxonomy objects that are primary_term enabled. * * @param string $post_type The post type for which to filter the taxonomies. * @param array $all_taxonomies All taxonomies for this post types, even ones that don't have primary term * enabled. */ $taxonomies = (array) apply_filters( 'wpseo_primary_term_taxonomies', $all_taxonomies, $post_type, $all_taxonomies ); return $taxonomies; } /** * Returns whether or not a taxonomy is hierarchical * * @param \stdClass $taxonomy Taxonomy object. * * @return bool True for hierarchical taxonomy. */ protected function filter_hierarchical_taxonomies( $taxonomy ) { return (bool) $taxonomy->hierarchical; } /** * Retrieves an indexable for a primary taxonomy. * * @codeCoverageIgnore * * @param int $post_id The post the indexable is based upon. * @param string $taxonomy The taxonomy the indexable belongs to. * @param bool $auto_create Optional. Creates an indexable if it does not exist yet. * * @return Indexable Instance of the indexable. * * @throws No_Indexable_Found Exception when no indexable could be found for the supplied post. */ protected function get_indexable( $post_id, $taxonomy, $auto_create = true ) { $indexable = Primary_Term_Indexable::find_by_postid_and_taxonomy( $post_id, 'post', $auto_create ); if ( ! $indexable ) { throw No_Indexable_Found::from_primary_term( $post_id, $taxonomy ); } return $indexable; } /** * Deletes the given indexable. * * @param Indexable $indexable The indexable to delete. * * @return void */ protected function delete_indexable( $indexable ) { try { $indexable->delete(); } catch ( \Exception $exception ) { Logger::get_logger()->notice( $exception->getMessage() ); } } /** * Get the current post ID. * * @coveCoverageIgnore * * @return integer The post ID. */ protected function get_current_id() { return get_the_ID(); } /** * Checks if the request is a post request. * * @codeCoverageIgnore * * @return bool Whether the method is a post request. */ protected function is_post_request() { return isset( $_SERVER['REQUEST_METHOD'] ) && strtolower( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ) === 'post'; } /** * Retrieves the posted term ID based on the given taxonomy. * * @codeCoverageIgnore * * @param string $taxonomy The taxonomy to check. * * @return int The term ID. */ protected function get_posted_term_id( $taxonomy ) { return filter_input( INPUT_POST, \WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy . '_term', FILTER_SANITIZE_NUMBER_INT ); } /** * Checks if the referer is valid for given taxonomy. * * @codeCoverageIgnore * * @param string $taxonomy The taxonomy to validate. * * @return bool Whether the referer is valid. */ protected function is_referer_valid( $taxonomy ) { return check_admin_referer( 'save-primary-term', \WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy . '_nonce' ); } }