wp/wp-includes/sitemaps/class-wp-sitemaps-provider.php
changeset 16 a86126ab1dd4
child 19 3d72ae0968f4
equal deleted inserted replaced
15:3d4e9c994f10 16:a86126ab1dd4
       
     1 <?php
       
     2 /**
       
     3  * Sitemaps: WP_Sitemaps_Provider class
       
     4  *
       
     5  * This class is a base class for other sitemap providers to extend and contains shared functionality.
       
     6  *
       
     7  * @package WordPress
       
     8  * @subpackage Sitemaps
       
     9  * @since 5.5.0
       
    10  */
       
    11 
       
    12 /**
       
    13  * Class WP_Sitemaps_Provider.
       
    14  *
       
    15  * @since 5.5.0
       
    16  */
       
    17 abstract class WP_Sitemaps_Provider {
       
    18 	/**
       
    19 	 * Provider name.
       
    20 	 *
       
    21 	 * This will also be used as the public-facing name in URLs.
       
    22 	 *
       
    23 	 * @since 5.5.0
       
    24 	 *
       
    25 	 * @var string
       
    26 	 */
       
    27 	protected $name = '';
       
    28 
       
    29 	/**
       
    30 	 * Object type name (e.g. 'post', 'term', 'user').
       
    31 	 *
       
    32 	 * @since 5.5.0
       
    33 	 *
       
    34 	 * @var string
       
    35 	 */
       
    36 	protected $object_type = '';
       
    37 
       
    38 	/**
       
    39 	 * Gets a URL list for a sitemap.
       
    40 	 *
       
    41 	 * @since 5.5.0
       
    42 	 *
       
    43 	 * @param int    $page_num       Page of results.
       
    44 	 * @param string $object_subtype Optional. Object subtype name. Default empty.
       
    45 	 * @return array Array of URLs for a sitemap.
       
    46 	 */
       
    47 	abstract public function get_url_list( $page_num, $object_subtype = '' );
       
    48 
       
    49 	/**
       
    50 	 * Gets the max number of pages available for the object type.
       
    51 	 *
       
    52 	 * @since 5.5.0
       
    53 	 *
       
    54 	 * @param string $object_subtype Optional. Object subtype. Default empty.
       
    55 	 * @return int Total number of pages.
       
    56 	 */
       
    57 	abstract public function get_max_num_pages( $object_subtype = '' );
       
    58 
       
    59 	/**
       
    60 	 * Gets data about each sitemap type.
       
    61 	 *
       
    62 	 * @since 5.5.0
       
    63 	 *
       
    64 	 * @return array[] Array of sitemap types including object subtype name and number of pages.
       
    65 	 */
       
    66 	public function get_sitemap_type_data() {
       
    67 		$sitemap_data = array();
       
    68 
       
    69 		$object_subtypes = $this->get_object_subtypes();
       
    70 
       
    71 		// If there are no object subtypes, include a single sitemap for the
       
    72 		// entire object type.
       
    73 		if ( empty( $object_subtypes ) ) {
       
    74 			$sitemap_data[] = array(
       
    75 				'name'  => '',
       
    76 				'pages' => $this->get_max_num_pages(),
       
    77 			);
       
    78 			return $sitemap_data;
       
    79 		}
       
    80 
       
    81 		// Otherwise, include individual sitemaps for every object subtype.
       
    82 		foreach ( $object_subtypes as $object_subtype_name => $data ) {
       
    83 			$object_subtype_name = (string) $object_subtype_name;
       
    84 
       
    85 			$sitemap_data[] = array(
       
    86 				'name'  => $object_subtype_name,
       
    87 				'pages' => $this->get_max_num_pages( $object_subtype_name ),
       
    88 			);
       
    89 		}
       
    90 
       
    91 		return $sitemap_data;
       
    92 	}
       
    93 
       
    94 	/**
       
    95 	 * Lists sitemap pages exposed by this provider.
       
    96 	 *
       
    97 	 * The returned data is used to populate the sitemap entries of the index.
       
    98 	 *
       
    99 	 * @since 5.5.0
       
   100 	 *
       
   101 	 * @return array[] Array of sitemap entries.
       
   102 	 */
       
   103 	public function get_sitemap_entries() {
       
   104 		$sitemaps = array();
       
   105 
       
   106 		$sitemap_types = $this->get_sitemap_type_data();
       
   107 
       
   108 		foreach ( $sitemap_types as $type ) {
       
   109 			for ( $page = 1; $page <= $type['pages']; $page ++ ) {
       
   110 				$sitemap_entry = array(
       
   111 					'loc' => $this->get_sitemap_url( $type['name'], $page ),
       
   112 				);
       
   113 
       
   114 				/**
       
   115 				 * Filters the sitemap entry for the sitemap index.
       
   116 				 *
       
   117 				 * @since 5.5.0
       
   118 				 *
       
   119 				 * @param array  $sitemap_entry  Sitemap entry for the post.
       
   120 				 * @param string $object_type    Object empty name.
       
   121 				 * @param string $object_subtype Object subtype name.
       
   122 				 *                               Empty string if the object type does not support subtypes.
       
   123 				 * @param int    $page           Page number of results.
       
   124 				 */
       
   125 				$sitemap_entry = apply_filters( 'wp_sitemaps_index_entry', $sitemap_entry, $this->object_type, $type['name'], $page );
       
   126 
       
   127 				$sitemaps[] = $sitemap_entry;
       
   128 			}
       
   129 		}
       
   130 
       
   131 		return $sitemaps;
       
   132 	}
       
   133 
       
   134 	/**
       
   135 	 * Gets the URL of a sitemap entry.
       
   136 	 *
       
   137 	 * @since 5.5.0
       
   138 	 *
       
   139 	 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
       
   140 	 *
       
   141 	 * @param string $name The name of the sitemap.
       
   142 	 * @param int    $page The page of the sitemap.
       
   143 	 * @return string The composed URL for a sitemap entry.
       
   144 	 */
       
   145 	public function get_sitemap_url( $name, $page ) {
       
   146 		global $wp_rewrite;
       
   147 
       
   148 		// Accounts for cases where name is not included, ex: sitemaps-users-1.xml.
       
   149 		$params = array_filter(
       
   150 			array(
       
   151 				'sitemap'         => $this->name,
       
   152 				'sitemap-subtype' => $name,
       
   153 				'paged'           => $page,
       
   154 			)
       
   155 		);
       
   156 
       
   157 		$basename = sprintf(
       
   158 			'/wp-sitemap-%1$s.xml',
       
   159 			implode( '-', $params )
       
   160 		);
       
   161 
       
   162 		if ( ! $wp_rewrite->using_permalinks() ) {
       
   163 			$basename = '/?' . http_build_query( $params, null, '&' );
       
   164 		}
       
   165 
       
   166 		return home_url( $basename );
       
   167 	}
       
   168 
       
   169 	/**
       
   170 	 * Returns the list of supported object subtypes exposed by the provider.
       
   171 	 *
       
   172 	 * @since 5.5.0
       
   173 	 *
       
   174 	 * @return array List of object subtypes objects keyed by their name.
       
   175 	 */
       
   176 	public function get_object_subtypes() {
       
   177 		return array();
       
   178 	}
       
   179 }