PluginProbe
Polylang / 3.8.9
Polylang v3.8.9
3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 3.8.3 2.7 2.7.0.1 2.7.1 2.7.2 2.7.3 2.7.4 2.8 2.8.1 2.8.2 2.8.3 2.8.4 2.9 2.9.1 2.9.2 3.0 3.0.1 3.0.2 3.0.3 All 233 releases
polylang / src / modules / sitemaps / sitemaps.php

sitemaps.php in Polylang 3.8.9, at src/modules/sitemaps/sitemaps.php

127 lines 3.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @package Polylang
4 */
5
6 /**
7 * Handles the core sitemaps for sites using a single domain.
8 *
9 * @since 2.8
10 */
11 class PLL_Sitemaps extends PLL_Abstract_Sitemaps {
12 /**
13 * @var PLL_Links_Model
14 */
15 protected $links_model;
16
17 /**
18 * @var PLL_Model
19 */
20 protected $model;
21
22 /**
23 * Stores the plugin options.
24 *
25 * @var \WP_Syntex\Polylang\Options\Options
26 */
27 protected $options;
28
29 /**
30 * Constructor.
31 *
32 * @since 2.8
33 *
34 * @param PLL_Base $polylang Main Polylang object.
35 */
36 public function __construct( PLL_Base &$polylang ) {
37 $this->links_model = &$polylang->links_model;
38 $this->model = &$polylang->model;
39 $this->options = $polylang->options;
40 }
41
42 /**
43 * Setups actions and filters.
44 *
45 * @since 2.8
46 *
47 * @return void
48 */
49 public function init() {
50 parent::init();
51
52 add_filter( 'pll_set_language_from_query', array( $this, 'set_language_from_query' ), 10, 2 );
53 add_filter( 'rewrite_rules_array', array( $this, 'rewrite_rules' ) );
54 add_filter( 'wp_sitemaps_add_provider', array( $this, 'replace_provider' ) );
55 }
56
57 /**
58 * Assigns the current language to the default language when the sitemap url
59 * doesn't include any language.
60 *
61 * @since 2.8
62 * @since 3.8 Returns a language object instead of a language slug.
63 *
64 * @param PLL_Language|false $lang Current language code, false if not set yet.
65 * @param WP_Query $query Main WP query object.
66 * @return PLL_Language|false
67 */
68 public function set_language_from_query( $lang, $query ) {
69 if ( isset( $query->query['sitemap'] ) && empty( $query->query['lang'] ) ) {
70 return $this->model->languages->get_default();
71 }
72 return $lang;
73 }
74
75 /**
76 * Filters the sitemaps rewrite rules to take the languages into account.
77 *
78 * @since 2.8
79 *
80 * @param string[] $rules Rewrite rules.
81 * @return string[] Modified rewrite rules.
82 */
83 public function rewrite_rules( $rules ) {
84 global $wp_rewrite;
85
86 $languages = $this->model->languages
87 ->filter( $this->options['hide_default'] ? 'hide_default' : '' )
88 ->get_list( array( 'fields' => 'slug' ) );
89
90 if ( empty( $languages ) ) {
91 return $rules;
92 }
93
94 $slug = $wp_rewrite->root . ( $this->options['rewrite'] ? '^' : '^language/' ) . '(' . implode( '|', $languages ) . ')/';
95
96 $newrules = array();
97
98 foreach ( $rules as $key => $rule ) {
99 if ( false !== strpos( $rule, 'sitemap=$matches[1]' ) ) {
100 $newrules[ str_replace( '^wp-sitemap', $slug . 'wp-sitemap', $key ) ] = str_replace(
101 array( '[8]', '[7]', '[6]', '[5]', '[4]', '[3]', '[2]', '[1]', '?' ),
102 array( '[9]', '[8]', '[7]', '[6]', '[5]', '[4]', '[3]', '[2]', '?lang=$matches[1]&' ),
103 $rule
104 ); // Should be enough!
105 }
106
107 $newrules[ $key ] = $rule;
108 }
109 return $newrules;
110 }
111
112 /**
113 * Replaces a sitemap provider by our decorator.
114 *
115 * @since 2.8
116 *
117 * @param WP_Sitemaps_Provider $provider Instance of a WP_Sitemaps_Provider.
118 * @return WP_Sitemaps_Provider
119 */
120 public function replace_provider( $provider ) {
121 if ( $provider instanceof WP_Sitemaps_Provider ) {
122 $provider = new PLL_Multilingual_Sitemaps_Provider( $provider, $this->links_model );
123 }
124 return $provider;
125 }
126 }
127