class-primary-category.php 1.74 KB
Newer Older
imac's avatar
imac committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
<?php
/**
 * @package WPSEO\Frontend
 */

/**
 * Adds customizations to the front end for the primary category
 */
class WPSEO_Frontend_Primary_Category {

	/**
	 * Registers the hooks necessary for correct primary category behaviour.
	 */
	public function register_hooks() {
		add_filter( 'post_link_category', array( $this, 'post_link_category' ) , 10, 3 );
	}

	/**
	 * Filters post_link_category to change the category to the chosen category by the user
	 *
	 * @param stdClass $category The category that is now used for the post link.
	 * @param array    $categories This parameter is not used.
	 * @param WP_Post  $post The post in question.
	 *
	 * @return array|null|object|WP_Error The category we want to use for the post link.
	 */
	public function post_link_category( $category, $categories = null, $post = null ) {
		$post = get_post( $post );
		$primary_category = $this->get_primary_category( $post );

		if ( false !== $primary_category && $primary_category !== $category->cat_ID ) {
			$category = $this->get_category( $primary_category );
		}

		return $category;
	}

	/**
	 * Get the id of the primary category
	 *
	 * @param WP_Post $post The post in question.
	 *
	 * @return int primary category id
	 */
	protected function get_primary_category( $post = null ) {
		$post = get_post( $post );

		if ( $post === null ) {
			return false;
		}

		$primary_term = new WPSEO_Primary_Term( 'category', $post->ID );

		return $primary_term->get_primary_term();
	}

	/**
	 * Wrapper for get category to make mocking easier
	 *
	 * @param int $primary_category id of primary category.
	 *
	 * @return array|null|object|WP_Error
	 */
	protected function get_category( $primary_category ) {
		$category = get_category( $primary_category );

		return $category;
	}
}