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/wp-conte.../plugins/wordpres.../inc/sitemaps
File: class-sitemaps-renderer.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
* Renders XML output for sitemaps.
[8] Fix | Delete
*/
[9] Fix | Delete
class WPSEO_Sitemaps_Renderer {
[10] Fix | Delete
[11] Fix | Delete
/**
[12] Fix | Delete
* XSL stylesheet for styling a sitemap for web browsers.
[13] Fix | Delete
*
[14] Fix | Delete
* @var string
[15] Fix | Delete
*/
[16] Fix | Delete
protected $stylesheet = '';
[17] Fix | Delete
[18] Fix | Delete
/**
[19] Fix | Delete
* Holds the get_bloginfo( 'charset' ) value to reuse for performance.
[20] Fix | Delete
*
[21] Fix | Delete
* @var string
[22] Fix | Delete
*/
[23] Fix | Delete
protected $charset = 'UTF-8';
[24] Fix | Delete
[25] Fix | Delete
/**
[26] Fix | Delete
* Holds charset of output, might be converted.
[27] Fix | Delete
*
[28] Fix | Delete
* @var string
[29] Fix | Delete
*/
[30] Fix | Delete
protected $output_charset = 'UTF-8';
[31] Fix | Delete
[32] Fix | Delete
/**
[33] Fix | Delete
* If data encoding needs to be converted for output.
[34] Fix | Delete
*
[35] Fix | Delete
* @var bool
[36] Fix | Delete
*/
[37] Fix | Delete
protected $needs_conversion = false;
[38] Fix | Delete
[39] Fix | Delete
/**
[40] Fix | Delete
* Set up object properties.
[41] Fix | Delete
*/
[42] Fix | Delete
public function __construct() {
[43] Fix | Delete
$stylesheet_url = preg_replace( '/(^http[s]?:)/', '', $this->get_xsl_url() );
[44] Fix | Delete
$this->stylesheet = '<?xml-stylesheet type="text/xsl" href="' . esc_url( $stylesheet_url ) . '"?>';
[45] Fix | Delete
$this->charset = get_bloginfo( 'charset' );
[46] Fix | Delete
$this->output_charset = $this->charset;
[47] Fix | Delete
[48] Fix | Delete
if (
[49] Fix | Delete
$this->charset !== 'UTF-8'
[50] Fix | Delete
&& function_exists( 'mb_list_encodings' )
[51] Fix | Delete
&& in_array( $this->charset, mb_list_encodings(), true )
[52] Fix | Delete
) {
[53] Fix | Delete
$this->output_charset = 'UTF-8';
[54] Fix | Delete
}
[55] Fix | Delete
[56] Fix | Delete
$this->needs_conversion = $this->output_charset !== $this->charset;
[57] Fix | Delete
}
[58] Fix | Delete
[59] Fix | Delete
/**
[60] Fix | Delete
* Builds the sitemap index.
[61] Fix | Delete
*
[62] Fix | Delete
* @param array<string> $links Set of sitemaps index links.
[63] Fix | Delete
*
[64] Fix | Delete
* @return string
[65] Fix | Delete
*/
[66] Fix | Delete
public function get_index( $links ) {
[67] Fix | Delete
[68] Fix | Delete
$xml = '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
[69] Fix | Delete
[70] Fix | Delete
foreach ( $links as $link ) {
[71] Fix | Delete
$xml .= $this->sitemap_index_url( $link );
[72] Fix | Delete
}
[73] Fix | Delete
[74] Fix | Delete
/**
[75] Fix | Delete
* Filter to append sitemaps to the index.
[76] Fix | Delete
*
[77] Fix | Delete
* @param string $index String to append to sitemaps index, defaults to empty.
[78] Fix | Delete
*/
[79] Fix | Delete
$xml .= apply_filters( 'wpseo_sitemap_index', '' );
[80] Fix | Delete
$xml .= '</sitemapindex>';
[81] Fix | Delete
[82] Fix | Delete
return $xml;
[83] Fix | Delete
}
[84] Fix | Delete
[85] Fix | Delete
/**
[86] Fix | Delete
* Builds the sitemap.
[87] Fix | Delete
*
[88] Fix | Delete
* @param array<string> $links Set of sitemap links.
[89] Fix | Delete
* @param string $type Sitemap type.
[90] Fix | Delete
* @param int $current_page Current sitemap page number.
[91] Fix | Delete
*
[92] Fix | Delete
* @return string
[93] Fix | Delete
*/
[94] Fix | Delete
public function get_sitemap( $links, $type, $current_page ) {
[95] Fix | Delete
[96] Fix | Delete
$urlset = '<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" '
[97] Fix | Delete
. 'xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd '
[98] Fix | Delete
. 'http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd" '
[99] Fix | Delete
. 'xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
[100] Fix | Delete
[101] Fix | Delete
/**
[102] Fix | Delete
* Filters the `urlset` for all sitemaps.
[103] Fix | Delete
*
[104] Fix | Delete
* @param string $urlset The output for the sitemap's `urlset`.
[105] Fix | Delete
*/
[106] Fix | Delete
$urlset = apply_filters( 'wpseo_sitemap_urlset', $urlset );
[107] Fix | Delete
[108] Fix | Delete
/**
[109] Fix | Delete
* Filters the `urlset` for a sitemap by type.
[110] Fix | Delete
*
[111] Fix | Delete
* @param string $urlset The output for the sitemap's `urlset`.
[112] Fix | Delete
*/
[113] Fix | Delete
$xml = apply_filters( "wpseo_sitemap_{$type}_urlset", $urlset );
[114] Fix | Delete
[115] Fix | Delete
foreach ( $links as $url ) {
[116] Fix | Delete
$xml .= $this->sitemap_url( $url );
[117] Fix | Delete
}
[118] Fix | Delete
[119] Fix | Delete
/**
[120] Fix | Delete
* Filter to add extra URLs to the XML sitemap by type.
[121] Fix | Delete
*
[122] Fix | Delete
* Only runs for the first page, not on all.
[123] Fix | Delete
*
[124] Fix | Delete
* @param string $content String content to add, defaults to empty.
[125] Fix | Delete
*/
[126] Fix | Delete
if ( $current_page === 1 ) {
[127] Fix | Delete
$xml .= apply_filters( "wpseo_sitemap_{$type}_content", '' );
[128] Fix | Delete
}
[129] Fix | Delete
[130] Fix | Delete
$xml .= '</urlset>';
[131] Fix | Delete
[132] Fix | Delete
return $xml;
[133] Fix | Delete
}
[134] Fix | Delete
[135] Fix | Delete
/**
[136] Fix | Delete
* Produce final XML output with debug information.
[137] Fix | Delete
*
[138] Fix | Delete
* @param string $sitemap Sitemap XML.
[139] Fix | Delete
*
[140] Fix | Delete
* @return string
[141] Fix | Delete
*/
[142] Fix | Delete
public function get_output( $sitemap ) {
[143] Fix | Delete
[144] Fix | Delete
$output = '<?xml version="1.0" encoding="' . esc_attr( $this->output_charset ) . '"?>';
[145] Fix | Delete
[146] Fix | Delete
if ( $this->stylesheet ) {
[147] Fix | Delete
/**
[148] Fix | Delete
* Filter the stylesheet URL for the XML sitemap.
[149] Fix | Delete
*
[150] Fix | Delete
* @param string $stylesheet Stylesheet URL.
[151] Fix | Delete
*/
[152] Fix | Delete
$output .= apply_filters( 'wpseo_stylesheet_url', $this->stylesheet ) . "\n";
[153] Fix | Delete
}
[154] Fix | Delete
[155] Fix | Delete
$output .= $sitemap;
[156] Fix | Delete
$output .= "\n<!-- XML Sitemap generated by Yoast SEO -->";
[157] Fix | Delete
[158] Fix | Delete
return $output;
[159] Fix | Delete
}
[160] Fix | Delete
[161] Fix | Delete
/**
[162] Fix | Delete
* Get charset for the output.
[163] Fix | Delete
*
[164] Fix | Delete
* @return string
[165] Fix | Delete
*/
[166] Fix | Delete
public function get_output_charset() {
[167] Fix | Delete
return $this->output_charset;
[168] Fix | Delete
}
[169] Fix | Delete
[170] Fix | Delete
/**
[171] Fix | Delete
* Set a custom stylesheet for this sitemap. Set to empty to just remove the default stylesheet.
[172] Fix | Delete
*
[173] Fix | Delete
* @param string $stylesheet Full XML-stylesheet declaration.
[174] Fix | Delete
*
[175] Fix | Delete
* @return void
[176] Fix | Delete
*/
[177] Fix | Delete
public function set_stylesheet( $stylesheet ) {
[178] Fix | Delete
$this->stylesheet = $stylesheet;
[179] Fix | Delete
}
[180] Fix | Delete
[181] Fix | Delete
/**
[182] Fix | Delete
* Build the `<sitemap>` tag for a given URL.
[183] Fix | Delete
*
[184] Fix | Delete
* @param array<string> $url Array of parts that make up this entry.
[185] Fix | Delete
*
[186] Fix | Delete
* @return string
[187] Fix | Delete
*/
[188] Fix | Delete
protected function sitemap_index_url( $url ) {
[189] Fix | Delete
[190] Fix | Delete
$date = null;
[191] Fix | Delete
[192] Fix | Delete
if ( ! empty( $url['lastmod'] ) ) {
[193] Fix | Delete
$date = YoastSEO()->helpers->date->format( $url['lastmod'] );
[194] Fix | Delete
}
[195] Fix | Delete
[196] Fix | Delete
$url['loc'] = htmlspecialchars( $url['loc'], ENT_COMPAT, $this->output_charset, false );
[197] Fix | Delete
[198] Fix | Delete
$output = "\t<sitemap>\n";
[199] Fix | Delete
$output .= "\t\t<loc>" . $url['loc'] . "</loc>\n";
[200] Fix | Delete
$output .= empty( $date ) ? '' : "\t\t<lastmod>" . htmlspecialchars( $date, ENT_COMPAT, $this->output_charset, false ) . "</lastmod>\n";
[201] Fix | Delete
$output .= "\t</sitemap>\n";
[202] Fix | Delete
[203] Fix | Delete
return $output;
[204] Fix | Delete
}
[205] Fix | Delete
[206] Fix | Delete
/**
[207] Fix | Delete
* Build the `<url>` tag for a given URL.
[208] Fix | Delete
*
[209] Fix | Delete
* Public access for backwards compatibility reasons.
[210] Fix | Delete
*
[211] Fix | Delete
* @param array<string> $url Array of parts that make up this entry.
[212] Fix | Delete
*
[213] Fix | Delete
* @return string
[214] Fix | Delete
*/
[215] Fix | Delete
public function sitemap_url( $url ) {
[216] Fix | Delete
[217] Fix | Delete
$date = null;
[218] Fix | Delete
[219] Fix | Delete
if ( ! empty( $url['mod'] ) ) {
[220] Fix | Delete
// Create a DateTime object date in the correct timezone.
[221] Fix | Delete
$date = YoastSEO()->helpers->date->format( $url['mod'] );
[222] Fix | Delete
}
[223] Fix | Delete
[224] Fix | Delete
$output = "\t<url>\n";
[225] Fix | Delete
$output .= "\t\t<loc>" . $this->encode_and_escape( $url['loc'] ) . "</loc>\n";
[226] Fix | Delete
$output .= empty( $date ) ? '' : "\t\t<lastmod>" . htmlspecialchars( $date, ENT_COMPAT, $this->output_charset, false ) . "</lastmod>\n";
[227] Fix | Delete
[228] Fix | Delete
if ( empty( $url['images'] ) ) {
[229] Fix | Delete
$url['images'] = [];
[230] Fix | Delete
}
[231] Fix | Delete
[232] Fix | Delete
foreach ( $url['images'] as $img ) {
[233] Fix | Delete
[234] Fix | Delete
if ( empty( $img['src'] ) ) {
[235] Fix | Delete
continue;
[236] Fix | Delete
}
[237] Fix | Delete
[238] Fix | Delete
$output .= "\t\t<image:image>\n";
[239] Fix | Delete
$output .= "\t\t\t<image:loc>" . $this->encode_and_escape( $img['src'] ) . "</image:loc>\n";
[240] Fix | Delete
$output .= "\t\t</image:image>\n";
[241] Fix | Delete
}
[242] Fix | Delete
unset( $img );
[243] Fix | Delete
[244] Fix | Delete
$output .= "\t</url>\n";
[245] Fix | Delete
[246] Fix | Delete
/**
[247] Fix | Delete
* Filters the output for the sitemap URL tag.
[248] Fix | Delete
*
[249] Fix | Delete
* @param string $output The output for the sitemap url tag.
[250] Fix | Delete
* @param array $url The sitemap URL array on which the output is based.
[251] Fix | Delete
*/
[252] Fix | Delete
return apply_filters( 'wpseo_sitemap_url', $output, $url );
[253] Fix | Delete
}
[254] Fix | Delete
[255] Fix | Delete
/**
[256] Fix | Delete
* Ensure the URL is encoded per RFC3986 and correctly escaped for use in an XML sitemap.
[257] Fix | Delete
*
[258] Fix | Delete
* This method works around a two quirks in esc_url():
[259] Fix | Delete
* 1. `esc_url()` leaves schema-relative URLs alone, while according to the sitemap specs,
[260] Fix | Delete
* the URL must always begin with a protocol.
[261] Fix | Delete
* 2. `esc_url()` escapes ampersands as `&#038;` instead of the more common `&amp;`.
[262] Fix | Delete
* According to the specs, `&amp;` should be used, and even though this shouldn't
[263] Fix | Delete
* really make a difference in practice, to quote Jono: "I'd be nervous about &#038;
[264] Fix | Delete
* given how many weird and wonderful things eat sitemaps", so better safe than sorry.
[265] Fix | Delete
*
[266] Fix | Delete
* @link https://www.sitemaps.org/protocol.html#xmlTagDefinitions
[267] Fix | Delete
* @link https://www.sitemaps.org/protocol.html#escaping
[268] Fix | Delete
* @link https://developer.wordpress.org/reference/functions/esc_url/
[269] Fix | Delete
*
[270] Fix | Delete
* @param string $url URL to encode and escape.
[271] Fix | Delete
*
[272] Fix | Delete
* @return string
[273] Fix | Delete
*/
[274] Fix | Delete
protected function encode_and_escape( $url ) {
[275] Fix | Delete
$url = $this->encode_url_rfc3986( $url );
[276] Fix | Delete
$url = esc_url( $url );
[277] Fix | Delete
$url = str_replace( '&#038;', '&amp;', $url );
[278] Fix | Delete
$url = str_replace( '&#039;', '&apos;', $url );
[279] Fix | Delete
[280] Fix | Delete
if ( strpos( $url, '//' ) === 0 ) {
[281] Fix | Delete
// Schema-relative URL for which esc_url() does not add a scheme.
[282] Fix | Delete
$url = 'http:' . $url;
[283] Fix | Delete
}
[284] Fix | Delete
[285] Fix | Delete
return $url;
[286] Fix | Delete
}
[287] Fix | Delete
[288] Fix | Delete
/**
[289] Fix | Delete
* Apply some best effort conversion to comply with RFC3986.
[290] Fix | Delete
*
[291] Fix | Delete
* @param string $url URL to encode.
[292] Fix | Delete
*
[293] Fix | Delete
* @return string
[294] Fix | Delete
*/
[295] Fix | Delete
protected function encode_url_rfc3986( $url ) {
[296] Fix | Delete
[297] Fix | Delete
if ( filter_var( $url, FILTER_VALIDATE_URL ) ) {
[298] Fix | Delete
return $url;
[299] Fix | Delete
}
[300] Fix | Delete
[301] Fix | Delete
$path = wp_parse_url( $url, PHP_URL_PATH );
[302] Fix | Delete
[303] Fix | Delete
if ( ! empty( $path ) && $path !== '/' ) {
[304] Fix | Delete
$encoded_path = explode( '/', $path );
[305] Fix | Delete
[306] Fix | Delete
// First decode the path, to prevent double encoding.
[307] Fix | Delete
$encoded_path = array_map( 'rawurldecode', $encoded_path );
[308] Fix | Delete
[309] Fix | Delete
$encoded_path = array_map( 'rawurlencode', $encoded_path );
[310] Fix | Delete
$encoded_path = implode( '/', $encoded_path );
[311] Fix | Delete
[312] Fix | Delete
$url = str_replace( $path, $encoded_path, $url );
[313] Fix | Delete
}
[314] Fix | Delete
[315] Fix | Delete
$query = wp_parse_url( $url, PHP_URL_QUERY );
[316] Fix | Delete
[317] Fix | Delete
if ( ! empty( $query ) ) {
[318] Fix | Delete
[319] Fix | Delete
parse_str( $query, $parsed_query );
[320] Fix | Delete
[321] Fix | Delete
$parsed_query = http_build_query( $parsed_query, '', '&amp;', PHP_QUERY_RFC3986 );
[322] Fix | Delete
[323] Fix | Delete
$url = str_replace( $query, $parsed_query, $url );
[324] Fix | Delete
}
[325] Fix | Delete
[326] Fix | Delete
return $url;
[327] Fix | Delete
}
[328] Fix | Delete
[329] Fix | Delete
/**
[330] Fix | Delete
* Retrieves the XSL URL that should be used in the current environment
[331] Fix | Delete
*
[332] Fix | Delete
* When home_url and site_url are not the same, the home_url should be used.
[333] Fix | Delete
* This is because the XSL needs to be served from the same domain, protocol and port
[334] Fix | Delete
* as the XML file that is loading it.
[335] Fix | Delete
*
[336] Fix | Delete
* @return string The XSL URL that needs to be used.
[337] Fix | Delete
*/
[338] Fix | Delete
protected function get_xsl_url() {
[339] Fix | Delete
if ( home_url() !== site_url() ) {
[340] Fix | Delete
return home_url( 'main-sitemap.xsl' );
[341] Fix | Delete
}
[342] Fix | Delete
[343] Fix | Delete
/*
[344] Fix | Delete
* Fallback to circumvent a cross-domain security problem when the XLS file is
[345] Fix | Delete
* loaded from a different (sub)domain.
[346] Fix | Delete
*/
[347] Fix | Delete
if ( strpos( plugins_url(), home_url() ) !== 0 ) {
[348] Fix | Delete
return home_url( 'main-sitemap.xsl' );
[349] Fix | Delete
}
[350] Fix | Delete
[351] Fix | Delete
return plugin_dir_url( WPSEO_FILE ) . 'css/main-sitemap.xsl';
[352] Fix | Delete
}
[353] Fix | Delete
}
[354] Fix | Delete
[355] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function