PluginProbe
Polylang / 2.3
Polylang v2.3
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 / frontend / choose-lang-content.php

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

142 lines 4.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Choose the language when it is set from content
5 * The language is set either in parse_query with priority 2 or in wp with priority 5
6 *
7 * @since 1.2
8 */
9 class PLL_Choose_Lang_Content extends PLL_Choose_lang {
10
11 /**
12 * defers the language choice to the 'wp' action (when the content is known)
13 *
14 * @since 1.8
15 */
16 public function init() {
17 parent::init();
18
19 if ( ! did_action( 'pll_language_defined' ) ) {
20 // set the languages from content
21 add_action( 'wp', array( $this, 'wp' ), 5 ); // priority 5 for post types and taxonomies registered in wp hook with default priority
22
23 // if no language found, choose the preferred one
24 add_filter( 'pll_get_current_language', array( $this, 'pll_get_current_language' ) );
25 }
26 }
27
28 /**
29 * overwrites parent::set_language to remove the 'wp' action if the language is set before
30 *
31 * @since 1.2
32 *
33 * @param object $curlang current language
34 */
35 protected function set_language( $curlang ) {
36 parent::set_language( $curlang );
37 remove_action( 'wp', array( $this, 'wp' ), 5 ); // won't attempt to set the language a 2nd time
38 }
39
40 /**
41 * returns the language based on the queried content
42 *
43 * @since 1.2
44 *
45 * @return object|bool detected language, false if none was found
46 */
47 protected function get_language_from_content() {
48 // no language set for 404
49 if ( is_404() || ( is_attachment() && ! $this->options['media_support'] ) ) {
50 return $this->get_preferred_language();
51 }
52
53 if ( $var = get_query_var( 'lang' ) ) {
54 $lang = explode( ',', $var );
55 $lang = $this->model->get_language( reset( $lang ) ); // choose the first queried language
56 }
57
58 elseif ( ( is_single() || is_page() || ( is_attachment() && $this->options['media_support'] ) ) && ( ( $var = get_queried_object_id() ) || ( $var = get_query_var( 'p' ) ) || ( $var = get_query_var( 'page_id' ) ) || ( $var = get_query_var( 'attachment_id' ) ) ) ) {
59 $lang = $this->model->post->get_language( $var );
60 }
61
62 else {
63 foreach ( $this->model->get_translated_taxonomies() as $taxonomy ) {
64 if ( $var = get_query_var( get_taxonomy( $taxonomy )->query_var ) ) {
65 $lang = $this->model->term->get_language( $var, $taxonomy );
66 }
67 }
68 }
69
70 /**
71 * Filter the language before it is set from the content
72 *
73 * @since 0.9
74 *
75 * @param bool|object $lang language object or false if none was found
76 */
77 return apply_filters( 'pll_get_current_language', isset( $lang ) ? $lang : false );
78 }
79
80 /**
81 * sets the language for home page
82 * add the lang query var when querying archives with no language code
83 *
84 * @since 1.2
85 *
86 * @param object $query instance of WP_Query
87 */
88 public function parse_main_query( $query ) {
89 if ( $query !== $GLOBALS['wp_the_query'] ) {
90 return;
91 }
92
93 $qv = $query->query_vars;
94
95 // homepage is requested, let's set the language
96 // take care to avoid posts page for which is_home = 1
97 if ( empty( $query->query ) && ( is_home() || is_page() ) ) {
98 $this->home_language();
99 $this->home_requested();
100 }
101
102 parent::parse_main_query( $query );
103
104 $is_archive = ( count( $query->query ) == 1 && ! empty( $qv['paged'] ) ) ||
105 $query->is_date ||
106 $query->is_author ||
107 ( ! empty( $qv['post_type'] ) && $query->is_post_type_archive && $this->model->is_translated_post_type( $qv['post_type'] ) );
108
109 // sets the language in case we hide the default language
110 // use $query->query['s'] as is_search is not set when search is empty
111 // http://wordpress.org/support/topic/search-for-empty-string-in-default-language
112 if ( $this->options['hide_default'] && ! isset( $qv['lang'] ) && ( $is_archive || isset( $query->query['s'] ) || ( count( $query->query ) == 1 && ! empty( $qv['feed'] ) ) ) ) {
113 $this->set_language( $this->model->get_language( $this->options['default_lang'] ) );
114 $this->set_curlang_in_query( $query );
115 }
116 }
117
118 /**
119 * sets the language from content
120 *
121 * @since 1.2
122 */
123 public function wp() {
124 // nothing to do if the language has already been set ( although normally the filter has been removed )
125 if ( ! $this->curlang && $curlang = $this->get_language_from_content() ) {
126 parent::set_language( $curlang );
127 }
128 }
129
130 /**
131 * if no language found by get_language_from_content, return the preferred one
132 *
133 * @since 0.9
134 *
135 * @param object|bool $lang Language found in get_language_from_content
136 * @return object Language
137 */
138 public function pll_get_current_language( $lang ) {
139 return ! $lang ? $this->get_preferred_language() : $lang;
140 }
141 }
142