PluginProbe
Polylang / 3.8.6
Polylang v3.8.6
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 / frontend / choose-lang-content.php

choose-lang-content.php in Polylang 3.8.6, at src/frontend/choose-lang-content.php

166 lines 4.3 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 * Choose the language when it is set from content
8 * The language is set either in parse_query with priority 2 or in wp with priority 5
9 *
10 * @since 1.2
11 */
12 class PLL_Choose_Lang_Content extends PLL_Choose_Lang {
13
14 /**
15 * Defers the language choice to the 'wp' action (when the content is known)
16 *
17 * @since 1.8
18 *
19 * @return void
20 */
21 public function init() {
22 parent::init();
23
24 if ( ! did_action( 'pll_language_defined' ) ) {
25 // Set the languages from content
26 add_action( 'wp', array( $this, 'wp' ), 5 ); // Priority 5 for post types and taxonomies registered in wp hook with default priority
27 }
28 }
29
30 /**
31 * Overwrites parent::set_language to remove the 'wp' action if the language is set before.
32 *
33 * @since 1.2
34 *
35 * @param PLL_Language|false $curlang Optional. Current language. Default is `false`.
36 * @return void
37 */
38 protected function set_language( $curlang = false ): void {
39 parent::set_language( $curlang );
40 remove_action( 'wp', array( $this, 'wp' ), 5 ); // won't attempt to set the language a 2nd time
41 }
42
43 /**
44 * Returns the language based on the queried content.
45 *
46 * @since 1.2
47 * @since 3.8 Renamed from `get_language_from_content()`.
48 *
49 * @return PLL_Language|false
50 */
51 protected function get_current_language() {
52 global $wp_query;
53 if ( ! isset( $wp_query ) ) {
54 return false;
55 }
56
57 // No language set for 404.
58 if ( is_404() || ( is_attachment() && ! $this->options['media_support'] ) ) {
59 return false;
60 }
61
62 $var = get_query_var( 'lang' );
63
64 if ( ! empty( $var ) && is_string( $var ) ) {
65 $lang = explode( ',', $var );
66 return $this->model->get_language( reset( $lang ) ); // Choose the first queried language.
67 }
68
69 if ( is_singular() ) {
70 foreach ( $this->get_singular_query_vars() as $var ) {
71 if ( ! empty( $var ) && is_numeric( $var ) ) {
72 return $this->model->post->get_language( (int) $var );
73 }
74 }
75 }
76
77 foreach ( $this->model->get_translated_taxonomies() as $taxonomy ) {
78 $tax_object = get_taxonomy( $taxonomy );
79
80 if ( empty( $tax_object ) || empty( $tax_object->query_var ) ) {
81 continue;
82 }
83
84 $var = get_query_var( $tax_object->query_var );
85
86 if ( ! is_string( $var ) || empty( $var ) ) {
87 continue;
88 }
89
90 $term = get_term_by( 'slug', $var, $taxonomy );
91
92 if ( ! $term instanceof WP_Term ) {
93 continue;
94 }
95
96 return $this->model->term->get_language( $term->term_id );
97 }
98
99 return false;
100 }
101
102 /**
103 * Returns the values of query vars corresponding to "singular" pages.
104 *
105 * @since 3.8
106 *
107 * @return Generator
108 */
109 private function get_singular_query_vars(): Generator {
110 yield get_queried_object_id();
111 yield get_query_var( 'p' );
112 yield get_query_var( 'page_id' );
113 yield get_query_var( 'attachment_id' );
114 }
115
116 /**
117 * Sets the language for the home page.
118 * Adds the lang query var when querying archives with no language code.
119 *
120 * @since 1.2
121 *
122 * @param WP_Query $query Instance of WP_Query.
123 * @return void
124 */
125 public function parse_main_query( $query ) {
126 if ( empty( $GLOBALS['wp_the_query'] ) || $query !== $GLOBALS['wp_the_query'] ) {
127 return;
128 }
129
130 $qv = $query->query_vars;
131
132 // Homepage is requested, let's set the language
133 // Take care to avoid posts page for which is_home = 1
134 if ( empty( $query->query ) && ( is_home() || is_page() ) ) {
135 $this->set_language( $this->get_home_language() );
136 $this->home_requested();
137 }
138
139 parent::parse_main_query( $query );
140
141 $is_archive = ( count( $query->query ) == 1 && ! empty( $qv['paged'] ) ) ||
142 $query->is_date ||
143 $query->is_author ||
144 ( ! empty( $qv['post_type'] ) && $query->is_post_type_archive && $this->model->is_translated_post_type( $qv['post_type'] ) );
145
146 // Sets the language in case we hide the default language
147 // Use $query->query['s'] as is_search is not set when search is empty
148 // http://wordpress.org/support/topic/search-for-empty-string-in-default-language
149 if ( $this->options['hide_default'] && ! isset( $qv['lang'] ) && ( $is_archive || isset( $query->query['s'] ) || ( count( $query->query ) == 1 && ! empty( $qv['feed'] ) ) ) ) {
150 $this->set_language( $this->model->get_default_language() );
151 $this->set_curlang_in_query( $query );
152 }
153 }
154
155 /**
156 * Sets the language from content.
157 *
158 * @since 1.2
159 *
160 * @return void
161 */
162 public function wp(): void {
163 parent::set_language();
164 }
165 }
166