Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93
/home/sportsfe.../httpdocs/clone/wp-conte.../plugins/wordpres.../inc/sitemaps
File: class-taxonomy-sitemap-provider.php
<?php
[0] Fix | Delete
/**
[1] Fix | Delete
* WPSEO plugin file.
[2] Fix | Delete
*
[3] Fix | Delete
* @package WPSEO\XML_Sitemaps
[4] Fix | Delete
*/
[5] Fix | Delete
[6] Fix | Delete
/**
[7] Fix | Delete
* Sitemap provider for author archives.
[8] Fix | Delete
*/
[9] Fix | Delete
class WPSEO_Taxonomy_Sitemap_Provider implements WPSEO_Sitemap_Provider {
[10] Fix | Delete
[11] Fix | Delete
/**
[12] Fix | Delete
* Holds image parser instance.
[13] Fix | Delete
*
[14] Fix | Delete
* @var WPSEO_Sitemap_Image_Parser
[15] Fix | Delete
*/
[16] Fix | Delete
protected static $image_parser;
[17] Fix | Delete
[18] Fix | Delete
/**
[19] Fix | Delete
* Determines whether images should be included in the XML sitemap.
[20] Fix | Delete
*
[21] Fix | Delete
* @var bool
[22] Fix | Delete
*/
[23] Fix | Delete
private $include_images;
[24] Fix | Delete
[25] Fix | Delete
/**
[26] Fix | Delete
* Set up object properties for data reuse.
[27] Fix | Delete
*/
[28] Fix | Delete
public function __construct() {
[29] Fix | Delete
/**
[30] Fix | Delete
* Filter - Allows excluding images from the XML sitemap.
[31] Fix | Delete
*
[32] Fix | Delete
* @param bool $include True to include, false to exclude.
[33] Fix | Delete
*/
[34] Fix | Delete
$this->include_images = apply_filters( 'wpseo_xml_sitemap_include_images', true );
[35] Fix | Delete
}
[36] Fix | Delete
[37] Fix | Delete
/**
[38] Fix | Delete
* Check if provider supports given item type.
[39] Fix | Delete
*
[40] Fix | Delete
* @param string $type Type string to check for.
[41] Fix | Delete
*
[42] Fix | Delete
* @return bool
[43] Fix | Delete
*/
[44] Fix | Delete
public function handles_type( $type ) {
[45] Fix | Delete
[46] Fix | Delete
$taxonomy = get_taxonomy( $type );
[47] Fix | Delete
[48] Fix | Delete
if ( $taxonomy === false || ! $this->is_valid_taxonomy( $taxonomy->name ) || ! $taxonomy->public ) {
[49] Fix | Delete
return false;
[50] Fix | Delete
}
[51] Fix | Delete
[52] Fix | Delete
return true;
[53] Fix | Delete
}
[54] Fix | Delete
[55] Fix | Delete
/**
[56] Fix | Delete
* Retrieves the links for the sitemap.
[57] Fix | Delete
*
[58] Fix | Delete
* @param int $max_entries Entries per sitemap.
[59] Fix | Delete
*
[60] Fix | Delete
* @return array
[61] Fix | Delete
*/
[62] Fix | Delete
public function get_index_links( $max_entries ) {
[63] Fix | Delete
[64] Fix | Delete
$taxonomies = get_taxonomies( [ 'public' => true ], 'objects' );
[65] Fix | Delete
[66] Fix | Delete
if ( empty( $taxonomies ) ) {
[67] Fix | Delete
return [];
[68] Fix | Delete
}
[69] Fix | Delete
[70] Fix | Delete
$taxonomy_names = array_filter( array_keys( $taxonomies ), [ $this, 'is_valid_taxonomy' ] );
[71] Fix | Delete
$taxonomies = array_intersect_key( $taxonomies, array_flip( $taxonomy_names ) );
[72] Fix | Delete
[73] Fix | Delete
// Retrieve all the taxonomies and their terms so we can do a proper count on them.
[74] Fix | Delete
[75] Fix | Delete
/**
[76] Fix | Delete
* Filter the setting of excluding empty terms from the XML sitemap.
[77] Fix | Delete
*
[78] Fix | Delete
* @param bool $exclude Defaults to true.
[79] Fix | Delete
* @param array $taxonomy_names Array of names for the taxonomies being processed.
[80] Fix | Delete
*/
[81] Fix | Delete
$hide_empty = apply_filters( 'wpseo_sitemap_exclude_empty_terms', true, $taxonomy_names );
[82] Fix | Delete
[83] Fix | Delete
$all_taxonomies = [];
[84] Fix | Delete
[85] Fix | Delete
foreach ( $taxonomy_names as $taxonomy_name ) {
[86] Fix | Delete
/**
[87] Fix | Delete
* Filter the setting of excluding empty terms from the XML sitemap for a specific taxonomy.
[88] Fix | Delete
*
[89] Fix | Delete
* @param bool $exclude Defaults to the sitewide setting.
[90] Fix | Delete
* @param string $taxonomy_name The name of the taxonomy being processed.
[91] Fix | Delete
*/
[92] Fix | Delete
$hide_empty_tax = apply_filters( 'wpseo_sitemap_exclude_empty_terms_taxonomy', $hide_empty, $taxonomy_name );
[93] Fix | Delete
[94] Fix | Delete
$term_args = [
[95] Fix | Delete
'taxonomy' => $taxonomy_name,
[96] Fix | Delete
'hide_empty' => $hide_empty_tax,
[97] Fix | Delete
'fields' => 'ids',
[98] Fix | Delete
];
[99] Fix | Delete
$taxonomy_terms = get_terms( $term_args );
[100] Fix | Delete
[101] Fix | Delete
if ( count( $taxonomy_terms ) > 0 ) {
[102] Fix | Delete
$all_taxonomies[ $taxonomy_name ] = $taxonomy_terms;
[103] Fix | Delete
}
[104] Fix | Delete
}
[105] Fix | Delete
[106] Fix | Delete
$index = [];
[107] Fix | Delete
[108] Fix | Delete
foreach ( $taxonomies as $tax_name => $tax ) {
[109] Fix | Delete
[110] Fix | Delete
if ( ! isset( $all_taxonomies[ $tax_name ] ) ) { // No eligible terms found.
[111] Fix | Delete
continue;
[112] Fix | Delete
}
[113] Fix | Delete
[114] Fix | Delete
$total_count = ( isset( $all_taxonomies[ $tax_name ] ) ) ? count( $all_taxonomies[ $tax_name ] ) : 1;
[115] Fix | Delete
$max_pages = 1;
[116] Fix | Delete
[117] Fix | Delete
if ( $total_count > $max_entries ) {
[118] Fix | Delete
$max_pages = (int) ceil( $total_count / $max_entries );
[119] Fix | Delete
}
[120] Fix | Delete
[121] Fix | Delete
$last_modified_gmt = WPSEO_Sitemaps::get_last_modified_gmt( $tax->object_type );
[122] Fix | Delete
[123] Fix | Delete
for ( $page_counter = 0; $page_counter < $max_pages; $page_counter++ ) {
[124] Fix | Delete
[125] Fix | Delete
$current_page = ( $page_counter === 0 ) ? '' : ( $page_counter + 1 );
[126] Fix | Delete
[127] Fix | Delete
if ( ! is_array( $tax->object_type ) || count( $tax->object_type ) === 0 ) {
[128] Fix | Delete
continue;
[129] Fix | Delete
}
[130] Fix | Delete
[131] Fix | Delete
$terms = array_splice( $all_taxonomies[ $tax_name ], 0, $max_entries );
[132] Fix | Delete
[133] Fix | Delete
if ( ! $terms ) {
[134] Fix | Delete
continue;
[135] Fix | Delete
}
[136] Fix | Delete
[137] Fix | Delete
$args = [
[138] Fix | Delete
'post_type' => $tax->object_type,
[139] Fix | Delete
'tax_query' => [
[140] Fix | Delete
[
[141] Fix | Delete
'taxonomy' => $tax_name,
[142] Fix | Delete
'terms' => $terms,
[143] Fix | Delete
],
[144] Fix | Delete
],
[145] Fix | Delete
'orderby' => 'modified',
[146] Fix | Delete
'order' => 'DESC',
[147] Fix | Delete
'posts_per_page' => 1,
[148] Fix | Delete
];
[149] Fix | Delete
$query = new WP_Query( $args );
[150] Fix | Delete
[151] Fix | Delete
if ( $query->have_posts() ) {
[152] Fix | Delete
$date = $query->posts[0]->post_modified_gmt;
[153] Fix | Delete
}
[154] Fix | Delete
else {
[155] Fix | Delete
$date = $last_modified_gmt;
[156] Fix | Delete
}
[157] Fix | Delete
[158] Fix | Delete
$index[] = [
[159] Fix | Delete
'loc' => WPSEO_Sitemaps_Router::get_base_url( $tax_name . '-sitemap' . $current_page . '.xml' ),
[160] Fix | Delete
'lastmod' => $date,
[161] Fix | Delete
];
[162] Fix | Delete
}
[163] Fix | Delete
}
[164] Fix | Delete
[165] Fix | Delete
return $index;
[166] Fix | Delete
}
[167] Fix | Delete
[168] Fix | Delete
/**
[169] Fix | Delete
* Get set of sitemap link data.
[170] Fix | Delete
*
[171] Fix | Delete
* @param string $type Sitemap type.
[172] Fix | Delete
* @param int $max_entries Entries per sitemap.
[173] Fix | Delete
* @param int $current_page Current page of the sitemap.
[174] Fix | Delete
*
[175] Fix | Delete
* @return array
[176] Fix | Delete
*
[177] Fix | Delete
* @throws OutOfBoundsException When an invalid page is requested.
[178] Fix | Delete
*/
[179] Fix | Delete
public function get_sitemap_links( $type, $max_entries, $current_page ) {
[180] Fix | Delete
global $wpdb;
[181] Fix | Delete
[182] Fix | Delete
$links = [];
[183] Fix | Delete
if ( ! $this->handles_type( $type ) ) {
[184] Fix | Delete
return $links;
[185] Fix | Delete
}
[186] Fix | Delete
[187] Fix | Delete
$taxonomy = get_taxonomy( $type );
[188] Fix | Delete
[189] Fix | Delete
$steps = $max_entries;
[190] Fix | Delete
$offset = ( $current_page > 1 ) ? ( ( $current_page - 1 ) * $max_entries ) : 0;
[191] Fix | Delete
[192] Fix | Delete
/** This filter is documented in inc/sitemaps/class-taxonomy-sitemap-provider.php */
[193] Fix | Delete
$hide_empty = apply_filters( 'wpseo_sitemap_exclude_empty_terms', true, [ $taxonomy->name ] );
[194] Fix | Delete
/** This filter is documented in inc/sitemaps/class-taxonomy-sitemap-provider.php */
[195] Fix | Delete
$hide_empty_tax = apply_filters( 'wpseo_sitemap_exclude_empty_terms_taxonomy', $hide_empty, $taxonomy->name );
[196] Fix | Delete
$terms = get_terms(
[197] Fix | Delete
[
[198] Fix | Delete
'taxonomy' => $taxonomy->name,
[199] Fix | Delete
'hide_empty' => $hide_empty_tax,
[200] Fix | Delete
'update_term_meta_cache' => false,
[201] Fix | Delete
'offset' => $offset,
[202] Fix | Delete
'number' => $steps,
[203] Fix | Delete
]
[204] Fix | Delete
);
[205] Fix | Delete
[206] Fix | Delete
// If there are no terms fetched for this range, we are on an invalid page.
[207] Fix | Delete
if ( empty( $terms ) ) {
[208] Fix | Delete
throw new OutOfBoundsException( 'Invalid sitemap page requested' );
[209] Fix | Delete
}
[210] Fix | Delete
[211] Fix | Delete
$post_statuses = array_map( 'esc_sql', WPSEO_Sitemaps::get_post_statuses() );
[212] Fix | Delete
[213] Fix | Delete
$replacements = array_merge(
[214] Fix | Delete
[
[215] Fix | Delete
'post_modified_gmt',
[216] Fix | Delete
$wpdb->posts,
[217] Fix | Delete
$wpdb->term_relationships,
[218] Fix | Delete
'object_id',
[219] Fix | Delete
'ID',
[220] Fix | Delete
$wpdb->term_taxonomy,
[221] Fix | Delete
'term_taxonomy_id',
[222] Fix | Delete
'term_taxonomy_id',
[223] Fix | Delete
'taxonomy',
[224] Fix | Delete
'term_id',
[225] Fix | Delete
'post_status',
[226] Fix | Delete
],
[227] Fix | Delete
$post_statuses,
[228] Fix | Delete
[ 'post_password' ]
[229] Fix | Delete
);
[230] Fix | Delete
[231] Fix | Delete
/**
[232] Fix | Delete
* Filter: 'wpseo_exclude_from_sitemap_by_term_ids' - Allow excluding terms by ID.
[233] Fix | Delete
*
[234] Fix | Delete
* @param array $terms_to_exclude The terms to exclude.
[235] Fix | Delete
*/
[236] Fix | Delete
$terms_to_exclude = apply_filters( 'wpseo_exclude_from_sitemap_by_term_ids', [] );
[237] Fix | Delete
[238] Fix | Delete
foreach ( $terms as $term ) {
[239] Fix | Delete
[240] Fix | Delete
if ( in_array( $term->term_id, $terms_to_exclude, true ) ) {
[241] Fix | Delete
continue;
[242] Fix | Delete
}
[243] Fix | Delete
[244] Fix | Delete
$url = [];
[245] Fix | Delete
[246] Fix | Delete
$tax_noindex = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'noindex' );
[247] Fix | Delete
[248] Fix | Delete
if ( $tax_noindex === 'noindex' ) {
[249] Fix | Delete
continue;
[250] Fix | Delete
}
[251] Fix | Delete
[252] Fix | Delete
$canonical = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'canonical' );
[253] Fix | Delete
$url['loc'] = get_term_link( $term, $term->taxonomy );
[254] Fix | Delete
[255] Fix | Delete
if ( is_string( $canonical ) && $canonical !== '' && $canonical !== $url['loc'] ) {
[256] Fix | Delete
continue;
[257] Fix | Delete
}
[258] Fix | Delete
[259] Fix | Delete
$current_replacements = $replacements;
[260] Fix | Delete
array_splice( $current_replacements, 9, 0, $term->taxonomy );
[261] Fix | Delete
array_splice( $current_replacements, 11, 0, $term->term_id );
[262] Fix | Delete
[263] Fix | Delete
//phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- We need to use a direct query here.
[264] Fix | Delete
//phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
[265] Fix | Delete
$url['mod'] = $wpdb->get_var(
[266] Fix | Delete
//phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized.
[267] Fix | Delete
$wpdb->prepare(
[268] Fix | Delete
'
[269] Fix | Delete
SELECT MAX(p.%i) AS lastmod
[270] Fix | Delete
FROM %i AS p
[271] Fix | Delete
INNER JOIN %i AS term_rel
[272] Fix | Delete
ON term_rel.%i = p.%i
[273] Fix | Delete
INNER JOIN %i AS term_tax
[274] Fix | Delete
ON term_tax.%i = term_rel.%i
[275] Fix | Delete
AND term_tax.%i = %s
[276] Fix | Delete
AND term_tax.%i = %d
[277] Fix | Delete
WHERE p.%i IN (' . implode( ', ', array_fill( 0, count( $post_statuses ), '%s' ) ) . ")
[278] Fix | Delete
AND p.%i = ''
[279] Fix | Delete
",
[280] Fix | Delete
$current_replacements
[281] Fix | Delete
)
[282] Fix | Delete
);
[283] Fix | Delete
[284] Fix | Delete
if ( $this->include_images ) {
[285] Fix | Delete
$url['images'] = $this->get_image_parser()->get_term_images( $term );
[286] Fix | Delete
}
[287] Fix | Delete
[288] Fix | Delete
// Deprecated, kept for backwards data compat. R.
[289] Fix | Delete
$url['chf'] = 'daily';
[290] Fix | Delete
$url['pri'] = 1;
[291] Fix | Delete
[292] Fix | Delete
/** This filter is documented at inc/sitemaps/class-post-type-sitemap-provider.php */
[293] Fix | Delete
$url = apply_filters( 'wpseo_sitemap_entry', $url, 'term', $term );
[294] Fix | Delete
[295] Fix | Delete
if ( ! empty( $url ) ) {
[296] Fix | Delete
$links[] = $url;
[297] Fix | Delete
}
[298] Fix | Delete
}
[299] Fix | Delete
[300] Fix | Delete
return $links;
[301] Fix | Delete
}
[302] Fix | Delete
[303] Fix | Delete
/**
[304] Fix | Delete
* Check if taxonomy by name is valid to appear in sitemaps.
[305] Fix | Delete
*
[306] Fix | Delete
* @param string $taxonomy_name Taxonomy name to check.
[307] Fix | Delete
*
[308] Fix | Delete
* @return bool
[309] Fix | Delete
*/
[310] Fix | Delete
public function is_valid_taxonomy( $taxonomy_name ) {
[311] Fix | Delete
[312] Fix | Delete
if ( WPSEO_Options::get( "noindex-tax-{$taxonomy_name}" ) === true ) {
[313] Fix | Delete
return false;
[314] Fix | Delete
}
[315] Fix | Delete
[316] Fix | Delete
if ( in_array( $taxonomy_name, [ 'link_category', 'nav_menu', 'wp_pattern_category' ], true ) ) {
[317] Fix | Delete
return false;
[318] Fix | Delete
}
[319] Fix | Delete
[320] Fix | Delete
if ( $taxonomy_name === 'post_format' && WPSEO_Options::get( 'disable-post_format', false ) ) {
[321] Fix | Delete
return false;
[322] Fix | Delete
}
[323] Fix | Delete
[324] Fix | Delete
/**
[325] Fix | Delete
* Filter to exclude the taxonomy from the XML sitemap.
[326] Fix | Delete
*
[327] Fix | Delete
* @param bool $exclude Defaults to false.
[328] Fix | Delete
* @param string $taxonomy_name Name of the taxonomy to exclude..
[329] Fix | Delete
*/
[330] Fix | Delete
if ( apply_filters( 'wpseo_sitemap_exclude_taxonomy', false, $taxonomy_name ) ) {
[331] Fix | Delete
return false;
[332] Fix | Delete
}
[333] Fix | Delete
[334] Fix | Delete
return true;
[335] Fix | Delete
}
[336] Fix | Delete
[337] Fix | Delete
/**
[338] Fix | Delete
* Get the Image Parser.
[339] Fix | Delete
*
[340] Fix | Delete
* @return WPSEO_Sitemap_Image_Parser
[341] Fix | Delete
*/
[342] Fix | Delete
protected function get_image_parser() {
[343] Fix | Delete
if ( ! isset( self::$image_parser ) ) {
[344] Fix | Delete
self::$image_parser = new WPSEO_Sitemap_Image_Parser();
[345] Fix | Delete
}
[346] Fix | Delete
[347] Fix | Delete
return self::$image_parser;
[348] Fix | Delete
}
[349] Fix | Delete
}
[350] Fix | Delete
[351] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function