PluginProbe
Polylang / 3.6
Polylang v3.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 / admin / admin-default-term.php

admin-default-term.php in Polylang 3.6, at admin/admin-default-term.php

265 lines 7.5 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 * Manages filters and actions related to default terms.
8 *
9 * @since 3.1
10 */
11 class PLL_Admin_Default_Term {
12
13 /**
14 * A reference to the PLL_Model instance.
15 *
16 * @var PLL_Model
17 */
18 protected $model;
19
20 /**
21 * Preferred language to assign to new contents.
22 *
23 * @var PLL_Language|null
24 */
25 protected $pref_lang;
26
27 /**
28 * Array of registered taxonomy names for which Polylang manages languages and translations.
29 *
30 * @var string[]
31 */
32 protected $taxonomies;
33
34 /**
35 * Constructor: setups properties.
36 *
37 * @since 3.1
38 *
39 * @param object $polylang The Polylang object.
40 */
41 public function __construct( &$polylang ) {
42 $this->model = &$polylang->model;
43 $this->pref_lang = &$polylang->pref_lang;
44 $this->taxonomies = $this->model->get_translated_taxonomies();
45 }
46
47 /**
48 * Setups filters and actions needed.
49 *
50 * @since 3.1
51 *
52 * @return void
53 */
54 public function add_hooks() {
55 foreach ( $this->taxonomies as $taxonomy ) {
56 if ( 'category' === $taxonomy ) {
57 // Allows to get the default terms in all languages
58 add_filter( 'option_default_' . $taxonomy, array( $this, 'option_default_term' ) );
59 add_action( 'update_option_default_' . $taxonomy, array( $this, 'update_option_default_term' ), 10, 2 );
60
61 // Adds the language column in the 'Terms' table.
62 add_filter( 'manage_' . $taxonomy . '_custom_column', array( $this, 'term_column' ), 10, 3 );
63 }
64 }
65 add_action( 'pll_add_language', array( $this, 'handle_default_term_on_create_language' ) );
66
67 // The default term should be in the default language
68 add_action( 'pll_update_default_lang', array( $this, 'update_default_term_language' ) );
69
70 // Prevents deleting all the translations of the default term
71 add_filter( 'map_meta_cap', array( $this, 'fix_delete_default_term' ), 10, 4 );
72 }
73
74 /**
75 * Filters the default term in note below the term list table and in settings->writing dropdown
76 *
77 * @since 1.2
78 *
79 * @param int $taxonomy_term_id The taxonomy term id.
80 * @return int A taxonomy term id.
81 */
82 public function option_default_term( $taxonomy_term_id ) {
83 if ( isset( $this->pref_lang ) && $tr = $this->model->term->get( $taxonomy_term_id, $this->pref_lang ) ) {
84 $taxonomy_term_id = $tr;
85 }
86 return $taxonomy_term_id;
87 }
88
89 /**
90 * Checks if the new default term is translated in all languages
91 * If not, create the translations
92 *
93 * @since 1.7
94 *
95 * @param int $old_value The old option value.
96 * @param int $value The new option value.
97 * @return void
98 */
99 public function update_option_default_term( $old_value, $value ) {
100 $default_cat_lang = $this->model->term->get_language( $value );
101
102 // Assign a default language to default term
103 if ( ! $default_cat_lang ) {
104 $default_cat_lang = $this->model->get_default_language();
105 $this->model->term->set_language( (int) $value, $default_cat_lang );
106 }
107
108 if ( empty( $default_cat_lang ) ) {
109 return;
110 }
111
112 $taxonomy = substr( current_filter(), 22 );
113
114 foreach ( $this->model->get_languages_list() as $language ) {
115 if ( $language->slug != $default_cat_lang->slug && ! $this->model->term->get_translation( $value, $language ) ) {
116 $this->create_default_term( $language, $taxonomy );
117 }
118 }
119 }
120
121 /**
122 * Create a default term for a language
123 *
124 * @since 1.2
125 *
126 * @param object|string|int $lang language
127 * @param string $taxonomy The current taxonomy
128 * @return void
129 */
130 public function create_default_term( $lang, $taxonomy ) {
131 $lang = $this->model->get_language( $lang );
132
133 // create a new term
134 // FIXME this is translated in admin language when we would like it in $lang
135 $cat_name = __( 'Uncategorized', 'polylang' );
136 $cat_slug = sanitize_title( $cat_name . '-' . $lang->slug );
137 $cat = wp_insert_term( $cat_name, $taxonomy, array( 'slug' => $cat_slug ) );
138
139 // check that the term was not previously created ( in case the language was deleted and recreated )
140 $cat = isset( $cat->error_data['term_exists'] ) ? $cat->error_data['term_exists'] : $cat['term_id'];
141
142 // set language
143 $this->model->term->set_language( (int) $cat, $lang );
144
145 // this is a translation of the default term
146 $default = (int) get_option( 'default_' . $taxonomy );
147 $translations = $this->model->term->get_translations( $default );
148
149 $this->model->term->save_translations( (int) $cat, $translations );
150 }
151
152 /**
153 * Manages the default term when new languages are created.
154 *
155 * @since 3.1
156 *
157 * @param array $args Argument used to create the language. @see PLL_Admin_Model::add_language().
158 * @return void
159 */
160 public function handle_default_term_on_create_language( $args ) {
161 foreach ( $this->taxonomies as $taxonomy ) {
162 if ( 'category' === $taxonomy ) {
163 $default = (int) get_option( 'default_' . $taxonomy );
164
165 // Assign default language to default term
166 if ( ! $this->model->term->get_language( $default ) ) {
167 $this->model->term->set_language( $default, $args['slug'] );
168 } elseif ( empty( $args['no_default_cat'] ) && ! $this->model->term->get( $default, $args['slug'] ) ) {
169 $this->create_default_term( $args['slug'], $taxonomy );
170 }
171 }
172 }
173 }
174
175 /**
176 * Identify the default term in the terms list table to disable the language dropdown in js.
177 *
178 * @since 3.1
179 *
180 * @param string $out The output.
181 * @param string $column The custom column's name.
182 * @param int $term_id The term id.
183 * @return string The HTML string.
184 */
185 public function term_column( $out, $column, $term_id ) {
186 if ( $column === $this->get_first_language_column() && $this->is_default_term( $term_id ) ) {
187 $out .= sprintf( '<div class="hidden" id="default_cat_%1$d">%1$d</div>', intval( $term_id ) );
188 }
189
190 return $out;
191 }
192
193 /**
194 * Returns the first language column in the posts, pages and media library tables
195 *
196 * @since 0.9
197 *
198 * @return string first language column name
199 */
200 protected function get_first_language_column() {
201 $columns = array();
202
203 foreach ( $this->model->get_languages_list() as $language ) {
204 $columns[] = 'language_' . $language->slug;
205 }
206
207 return empty( $columns ) ? '' : reset( $columns );
208 }
209
210 /**
211 * Prevents deleting all the translations of the default term
212 *
213 * @since 2.1
214 *
215 * @param array $caps The user's actual capabilities.
216 * @param string $cap Capability name.
217 * @param int $user_id The user ID.
218 * @param array $args Adds the context to the cap. The term id.
219 * @return array
220 */
221 public function fix_delete_default_term( $caps, $cap, $user_id, $args ) {
222 if ( 'delete_term' === $cap && $this->is_default_term( reset( $args ) ) ) {
223 $caps[] = 'do_not_allow';
224 }
225
226 return $caps;
227 }
228
229 /**
230 * Check if the term is the default term.
231 *
232 * @since 3.1
233 *
234 * @param int $term_id The term id.
235 * @return bool True if the term is the default term, false otherwise.
236 */
237 public function is_default_term( $term_id ) {
238 $term = get_term( $term_id );
239 if ( $term instanceof WP_Term ) {
240 $default_term_id = get_option( 'default_' . $term->taxonomy );
241 return $default_term_id && in_array( $default_term_id, $this->model->term->get_translations( $term_id ) );
242 }
243 return false;
244 }
245
246 /**
247 * Updates the default term language.
248 *
249 * @since 3.1
250 *
251 * @param string $slug Language slug.
252 * @return void
253 */
254 public function update_default_term_language( $slug ) {
255 foreach ( $this->taxonomies as $taxonomy ) {
256 if ( 'category' === $taxonomy ) {
257 $default_cats = $this->model->term->get_translations( get_option( 'default_' . $taxonomy ) );
258 if ( isset( $default_cats[ $slug ] ) ) {
259 update_option( 'default_' . $taxonomy, $default_cats[ $slug ] );
260 }
261 }
262 }
263 }
264 }
265