PluginProbe
Polylang / 2.7
Polylang v2.7
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 / include / translated-post.php

translated-post.php in Polylang 2.7, at include/translated-post.php

254 lines 7.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Setups the posts languages and translations model
5 *
6 * @since 1.8
7 */
8 class PLL_Translated_Post extends PLL_Translated_Object {
9
10 /**
11 * Constructor
12 *
13 * @since 1.8
14 *
15 * @param object $model
16 */
17 public function __construct( &$model ) {
18 // init properties
19 $this->object_type = null; // For taxonomies
20 $this->type = 'post'; // For capabilities
21 $this->tax_language = 'language';
22 $this->tax_translations = 'post_translations';
23 $this->tax_tt = 'term_taxonomy_id';
24
25 parent::__construct( $model );
26
27 // registers completely the language taxonomy
28 add_action( 'setup_theme', array( $this, 'register_taxonomy' ), 1 );
29
30 // setups post types to translate
31 add_action( 'registered_post_type', array( $this, 'registered_post_type' ) );
32
33 // forces updating posts cache
34 add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ) );
35 }
36
37 /**
38 * Store the post language in the database
39 *
40 * @since 0.6
41 *
42 * @param int $post_id post id
43 * @param int|string|object $lang language ( term_id or slug or object )
44 */
45 public function set_language( $post_id, $lang ) {
46 $old_lang = $this->get_language( $post_id );
47 $old_lang = $old_lang ? $old_lang->slug : '';
48 $lang = $lang ? $this->model->get_language( $lang )->slug : '';
49
50 if ( $old_lang !== $lang ) {
51 wp_set_post_terms( (int) $post_id, $lang, 'language' );
52 }
53 }
54
55 /**
56 * Returns the language of a post
57 *
58 * @since 0.1
59 *
60 * @param int $post_id post id
61 * @return bool|object PLL_Language object, false if no language is associated to that post
62 */
63 public function get_language( $post_id ) {
64 $lang = $this->get_object_term( $post_id, 'language' );
65 return ( $lang ) ? $this->model->get_language( $lang ) : false;
66 }
67
68 /**
69 * Deletes a translation
70 *
71 * @since 0.5
72 *
73 * @param int $id post id
74 */
75 public function delete_translation( $id ) {
76 parent::delete_translation( $id );
77 wp_set_object_terms( $id, null, $this->tax_translations );
78 }
79
80 /**
81 * A join clause to add to sql queries when filtering by language is needed directly in query
82 *
83 * @since 1.2
84 *
85 * @param string $alias Alias for $wpdb->posts table
86 * @return string join clause
87 */
88 public function join_clause( $alias = '' ) {
89 global $wpdb;
90 if ( empty( $alias ) ) {
91 $alias = $wpdb->posts;
92 }
93 return " INNER JOIN $wpdb->term_relationships AS pll_tr ON pll_tr.object_id = $alias.ID";
94 }
95
96 /**
97 * Register the language taxonomy
98 *
99 * @since 1.2
100 */
101 public function register_taxonomy() {
102 register_taxonomy(
103 'language',
104 $this->model->get_translated_post_types(),
105 array(
106 'labels' => array(
107 'name' => __( 'Languages', 'polylang' ),
108 'singular_name' => __( 'Language', 'polylang' ),
109 'all_items' => __( 'All languages', 'polylang' ),
110 ),
111 'public' => false,
112 'show_ui' => false, // hide the taxonomy on admin side, needed for WP 4.4.x
113 'show_in_nav_menus' => false, // no metabox for nav menus, needed for WP 4.4.x
114 'publicly_queryable' => true, // since WP 4.5
115 'query_var' => 'lang',
116 'rewrite' => $this->model->options['force_lang'] < 2, // no rewrite for domains and sub-domains
117 '_pll' => true, // polylang taxonomy
118 )
119 );
120 }
121
122 /**
123 * Check if registered post type must be translated
124 *
125 * @since 1.2
126 *
127 * @param string $post_type post type name
128 */
129 public function registered_post_type( $post_type ) {
130 if ( $this->model->is_translated_post_type( $post_type ) ) {
131 register_taxonomy_for_object_type( 'language', $post_type );
132 register_taxonomy_for_object_type( 'post_translations', $post_type );
133 }
134 }
135
136 /**
137 * Forces calling 'update_object_term_cache' when querying posts or pages
138 * this is especially useful for nav menus with a lot of pages
139 * without doing this, we would have one query per page in the menu to get the page language for the permalink
140 *
141 * @since 1.8
142 *
143 * @param object $query reference to the query object
144 */
145 public function pre_get_posts( $query ) {
146 if ( ! empty( $query->query['post_type'] ) && $this->model->is_translated_post_type( $query->query['post_type'] ) ) {
147 $query->query_vars['update_post_term_cache'] = true;
148 }
149 }
150
151 /**
152 * Checks if the current user can read the post
153 *
154 * @since 1.5
155 *
156 * @param int $post_id Post ID
157 * @param string $context Optional, 'edit' or 'view', defaults to 'view'.
158 * @return bool
159 */
160 public function current_user_can_read( $post_id, $context = 'view' ) {
161 $post = get_post( $post_id );
162
163 if ( empty( $post ) ) {
164 return false;
165 }
166
167 if ( 'inherit' === $post->post_status && $post->post_parent ) {
168 $post = get_post( $post->post_parent );
169 }
170
171 if ( 'inherit' === $post->post_status || in_array( $post->post_status, get_post_stati( array( 'public' => true ) ) ) ) {
172 return true;
173 }
174
175 // Follow WP practices, which shows links to private posts ( when readable ), but not for draft posts ( ex: get_adjacent_post_link() )
176 if ( in_array( $post->post_status, get_post_stati( array( 'private' => true ) ) ) ) {
177 $post_type_object = get_post_type_object( $post->post_type );
178 $user = wp_get_current_user();
179 return is_user_logged_in() && ( current_user_can( $post_type_object->cap->read_private_posts ) || $user->ID == $post->post_author ); // Comparison must not be strict!
180 }
181
182 // In edit context, show draft and future posts.
183 if ( 'edit' === $context ) {
184 $states = get_post_stati(
185 array(
186 'protected' => true,
187 'show_in_admin_all_list' => true,
188 )
189 );
190
191 if ( in_array( $post->post_status, $states ) ) {
192 $user = wp_get_current_user();
193 return is_user_logged_in() && ( current_user_can( 'edit_posts' ) || $user->ID == $post->post_author ); // Comparison must not be strict!
194 }
195 }
196
197 return false;
198 }
199
200 /**
201 * Returns a list of posts in a language ( $lang )
202 * not translated in another language ( $untranslated_in )
203 *
204 * @since 2.6
205 *
206 * @param string $type Post type
207 * @param string $untranslated_in The posts must not be translated in this language
208 * @param string $lang Language of the search posts
209 * @param string $search Limit results to posts matching this string
210 * @return array Array of posts
211 */
212 public function get_untranslated( $type, $untranslated_in, $lang, $search = '' ) {
213 $return = array();
214
215 // Don't order by title: see https://wordpress.org/support/topic/find-translated-post-when-10-is-not-enough
216 $args = array(
217 's' => $search,
218 'suppress_filters' => 0, // To make the post_fields filter work
219 'lang' => 0, // Avoid admin language filter
220 'numberposts' => 20, // Limit to 20 posts
221 'post_status' => 'any',
222 'post_type' => $type,
223 'tax_query' => array(
224 array(
225 'taxonomy' => 'language',
226 'field' => 'term_taxonomy_id', // WP 3.5+
227 'terms' => $lang->term_taxonomy_id,
228 ),
229 ),
230 );
231
232 /**
233 * Filter the query args when auto suggesting untranslated posts in the Languages metabox
234 * This should help plugins to fix some edge cases
235 *
236 * @see https://wordpress.org/support/topic/find-translated-post-when-10-is-not-enough
237 *
238 * @since 1.7
239 *
240 * @param array $args WP_Query arguments
241 */
242 $args = apply_filters( 'pll_ajax_posts_not_translated_args', $args );
243 $posts = get_posts( $args );
244
245 foreach ( $posts as $post ) {
246 if ( ! $this->get_translation( $post->ID, $untranslated_in ) && $this->current_user_can_read( $post->ID, 'edit' ) ) {
247 $return[] = $post;
248 }
249 }
250
251 return $return;
252 }
253 }
254