[ Index ]

PHP Cross Reference of WordPress

title

Body

[close]

/wp-includes/sitemaps/ -> class-wp-sitemaps-stylesheet.php (source)

   1  <?php
   2  /**
   3   * Sitemaps: WP_Sitemaps_Stylesheet class
   4   *
   5   * This class provides the XSL stylesheets to style all sitemaps.
   6   *
   7   * @package WordPress
   8   * @subpackage Sitemaps
   9   * @since 5.5.0
  10   */
  11  
  12  /**
  13   * Stylesheet provider class.
  14   *
  15   * @since 5.5.0
  16   */
  17  class WP_Sitemaps_Stylesheet {
  18      /**
  19       * Renders the XSL stylesheet depending on whether it's the sitemap index or not.
  20       *
  21       * @param string $type Stylesheet type. Either 'sitemap' or 'index'.
  22       */
  23  	public function render_stylesheet( $type ) {
  24          header( 'Content-type: application/xml; charset=UTF-8' );
  25  
  26          if ( 'sitemap' === $type ) {
  27              // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- All content escaped below.
  28              echo $this->get_sitemap_stylesheet();
  29          }
  30  
  31          if ( 'index' === $type ) {
  32              // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- All content escaped below.
  33              echo $this->get_sitemap_index_stylesheet();
  34          }
  35  
  36          exit;
  37      }
  38  
  39      /**
  40       * Returns the escaped XSL for all sitemaps, except index.
  41       *
  42       * @since 5.5.0
  43       */
  44  	public function get_sitemap_stylesheet() {
  45          $css         = $this->get_stylesheet_css();
  46          $title       = esc_xml( __( 'XML Sitemap' ) );
  47          $description = esc_xml( __( 'This XML Sitemap is generated by WordPress to make your content more visible for search engines.' ) );
  48          $learn_more  = sprintf(
  49              '<a href="%s">%s</a>',
  50              esc_url( __( 'https://www.sitemaps.org/' ) ),
  51              esc_xml( __( 'Learn more about XML sitemaps.' ) )
  52          );
  53  
  54          $text = sprintf(
  55              /* translators: %s: Number of URLs. */
  56              esc_xml( __( 'Number of URLs in this XML Sitemap: %s.' ) ),
  57              '<xsl:value-of select="count( sitemap:urlset/sitemap:url )" />'
  58          );
  59  
  60          $lang       = get_language_attributes( 'html' );
  61          $url        = esc_xml( __( 'URL' ) );
  62          $lastmod    = esc_xml( __( 'Last Modified' ) );
  63          $changefreq = esc_xml( __( 'Change Frequency' ) );
  64          $priority   = esc_xml( __( 'Priority' ) );
  65  
  66          $xsl_content = <<<XSL
  67  <?xml version="1.0" encoding="UTF-8"?>
  68  <xsl:stylesheet
  69          version="1.0"
  70          xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  71          xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"
  72          exclude-result-prefixes="sitemap"
  73          >
  74  
  75      <xsl:output method="html" encoding="UTF-8" indent="yes" />
  76  
  77      <!--
  78        Set variables for whether lastmod, changefreq or priority occur for any url in the sitemap.
  79        We do this up front because it can be expensive in a large sitemap.
  80        -->
  81      <xsl:variable name="has-lastmod"    select="count( /sitemap:urlset/sitemap:url/sitemap:lastmod )"    />
  82      <xsl:variable name="has-changefreq" select="count( /sitemap:urlset/sitemap:url/sitemap:changefreq )" />
  83      <xsl:variable name="has-priority"   select="count( /sitemap:urlset/sitemap:url/sitemap:priority )"   />
  84  
  85      <xsl:template match="/">
  86          <html {$lang}>
  87              <head>
  88                  <title>{$title}</title>
  89                  <style>
  90                      {$css}
  91                  </style>
  92              </head>
  93              <body>
  94                  <div id="sitemap">
  95                      <div id="sitemap__header">
  96                          <h1>{$title}</h1>
  97                          <p>{$description}</p>
  98                          <p>{$learn_more}</p>
  99                      </div>
 100                      <div id="sitemap__content">
 101                          <p class="text">{$text}</p>
 102                          <table id="sitemap__table">
 103                              <thead>
 104                                  <tr>
 105                                      <th class="loc">{$url}</th>
 106                                      <xsl:if test="\$has-lastmod">
 107                                          <th class="lastmod">{$lastmod}</th>
 108                                      </xsl:if>
 109                                      <xsl:if test="\$has-changefreq">
 110                                          <th class="changefreq">{$changefreq}</th>
 111                                      </xsl:if>
 112                                      <xsl:if test="\$has-priority">
 113                                          <th class="priority">{$priority}</th>
 114                                      </xsl:if>
 115                                  </tr>
 116                              </thead>
 117                              <tbody>
 118                                  <xsl:for-each select="sitemap:urlset/sitemap:url">
 119                                      <tr>
 120                                          <td class="loc"><a href="{sitemap:loc}"><xsl:value-of select="sitemap:loc" /></a></td>
 121                                          <xsl:if test="\$has-lastmod">
 122                                              <td class="lastmod"><xsl:value-of select="sitemap:lastmod" /></td>
 123                                          </xsl:if>
 124                                          <xsl:if test="\$has-changefreq">
 125                                              <td class="changefreq"><xsl:value-of select="sitemap:changefreq" /></td>
 126                                          </xsl:if>
 127                                          <xsl:if test="\$has-priority">
 128                                              <td class="priority"><xsl:value-of select="sitemap:priority" /></td>
 129                                          </xsl:if>
 130                                      </tr>
 131                                  </xsl:for-each>
 132                              </tbody>
 133                          </table>
 134                      </div>
 135                  </div>
 136              </body>
 137          </html>
 138      </xsl:template>
 139  </xsl:stylesheet>
 140  
 141  XSL;
 142  
 143          /**
 144           * Filters the content of the sitemap stylesheet.
 145           *
 146           * @since 5.5.0
 147           *
 148           * @param string $xsl_content Full content for the XML stylesheet.
 149           */
 150          return apply_filters( 'wp_sitemaps_stylesheet_content', $xsl_content );
 151      }
 152  
 153      /**
 154       * Returns the escaped XSL for the index sitemaps.
 155       *
 156       * @since 5.5.0
 157       */
 158  	public function get_sitemap_index_stylesheet() {
 159          $css         = $this->get_stylesheet_css();
 160          $title       = esc_xml( __( 'XML Sitemap' ) );
 161          $description = esc_xml( __( 'This XML Sitemap is generated by WordPress to make your content more visible for search engines.' ) );
 162          $learn_more  = sprintf(
 163              '<a href="%s">%s</a>',
 164              esc_url( __( 'https://www.sitemaps.org/' ) ),
 165              esc_xml( __( 'Learn more about XML sitemaps.' ) )
 166          );
 167  
 168          $text = sprintf(
 169              /* translators: %s: Number of URLs. */
 170              esc_xml( __( 'Number of URLs in this XML Sitemap: %s.' ) ),
 171              '<xsl:value-of select="count( sitemap:sitemapindex/sitemap:sitemap )" />'
 172          );
 173  
 174          $lang    = get_language_attributes( 'html' );
 175          $url     = esc_xml( __( 'URL' ) );
 176          $lastmod = esc_xml( __( 'Last Modified' ) );
 177  
 178          $xsl_content = <<<XSL
 179  <?xml version="1.0" encoding="UTF-8"?>
 180  <xsl:stylesheet
 181          version="1.0"
 182          xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 183          xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"
 184          exclude-result-prefixes="sitemap"
 185          >
 186  
 187      <xsl:output method="html" encoding="UTF-8" indent="yes" />
 188  
 189      <!--
 190        Set variables for whether lastmod occurs for any sitemap in the index.
 191        We do this up front because it can be expensive in a large sitemap.
 192        -->
 193      <xsl:variable name="has-lastmod" select="count( /sitemap:sitemapindex/sitemap:sitemap/sitemap:lastmod )" />
 194  
 195      <xsl:template match="/">
 196          <html {$lang}>
 197              <head>
 198                  <title>{$title}</title>
 199                  <style>
 200                      {$css}
 201                  </style>
 202              </head>
 203              <body>
 204                  <div id="sitemap">
 205                      <div id="sitemap__header">
 206                          <h1>{$title}</h1>
 207                          <p>{$description}</p>
 208                          <p>{$learn_more}</p>
 209                      </div>
 210                      <div id="sitemap__content">
 211                          <p class="text">{$text}</p>
 212                          <table id="sitemap__table">
 213                              <thead>
 214                                  <tr>
 215                                      <th class="loc">{$url}</th>
 216                                      <xsl:if test="\$has-lastmod">
 217                                          <th class="lastmod">{$lastmod}</th>
 218                                      </xsl:if>
 219                                  </tr>
 220                              </thead>
 221                              <tbody>
 222                                  <xsl:for-each select="sitemap:sitemapindex/sitemap:sitemap">
 223                                      <tr>
 224                                          <td class="loc"><a href="{sitemap:loc}"><xsl:value-of select="sitemap:loc" /></a></td>
 225                                          <xsl:if test="\$has-lastmod">
 226                                              <td class="lastmod"><xsl:value-of select="sitemap:lastmod" /></td>
 227                                          </xsl:if>
 228                                      </tr>
 229                                  </xsl:for-each>
 230                              </tbody>
 231                          </table>
 232                      </div>
 233                  </div>
 234              </body>
 235          </html>
 236      </xsl:template>
 237  </xsl:stylesheet>
 238  
 239  XSL;
 240  
 241          /**
 242           * Filters the content of the sitemap index stylesheet.
 243           *
 244           * @since 5.5.0
 245           *
 246           * @param string $xsl_content Full content for the XML stylesheet.
 247           */
 248          return apply_filters( 'wp_sitemaps_stylesheet_index_content', $xsl_content );
 249      }
 250  
 251      /**
 252       * Gets the CSS to be included in sitemap XSL stylesheets.
 253       *
 254       * @since 5.5.0
 255       *
 256       * @return string The CSS.
 257       */
 258  	public function get_stylesheet_css() {
 259          $text_align = is_rtl() ? 'right' : 'left';
 260  
 261          $css = <<<EOF
 262  
 263                      body {
 264                          font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
 265                          color: #444;
 266                      }
 267  
 268                      #sitemap {
 269                          max-width: 980px;
 270                          margin: 0 auto;
 271                      }
 272  
 273                      #sitemap__table {
 274                          width: 100%;
 275                          border: solid 1px #ccc;
 276                          border-collapse: collapse;
 277                      }
 278  
 279                       #sitemap__table tr td.loc {
 280                          /*
 281                           * URLs should always be LTR.
 282                           * See https://core.trac.wordpress.org/ticket/16834
 283                           * and https://core.trac.wordpress.org/ticket/49949
 284                           */
 285                          direction: ltr;
 286                      }
 287  
 288                      #sitemap__table tr th {
 289                          text-align: {$text_align};
 290                      }
 291  
 292                      #sitemap__table tr td,
 293                      #sitemap__table tr th {
 294                          padding: 10px;
 295                      }
 296  
 297                      #sitemap__table tr:nth-child(odd) td {
 298                          background-color: #eee;
 299                      }
 300  
 301                      a:hover {
 302                          text-decoration: none;
 303                      }
 304  
 305  EOF;
 306  
 307          /**
 308           * Filters the CSS only for the sitemap stylesheet.
 309           *
 310           * @since 5.5.0
 311           *
 312           * @param string $css CSS to be applied to default XSL file.
 313           */
 314          return apply_filters( 'wp_sitemaps_stylesheet_css', $css );
 315      }
 316  }


Generated: Sun Apr 28 01:00:03 2024 Cross-referenced by PHPXref 0.7.1