wpml-tax-menu-loader.class.php
5.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<?php
class WPML_Tax_Menu_Loader {
/** @var SitePress $sitepress */
private $sitepress;
/** @var wpdb $wpdb */
public $wpdb;
/** @var string $taxonomy */
private $taxonomy;
/**
* @param wpdb $wpdb
* @param SitePress $sitepress
* @param string $taxonomy
*/
public function __construct( $wpdb, $sitepress, $taxonomy ) {
$this->sitepress = $sitepress;
$this->wpdb = $wpdb;
$this->taxonomy = $taxonomy;
add_action( 'init', [ $this, 'init' ] );
add_action( 'after-category-table', [ $this, 'category_display_action' ], 1, 0 );
add_filter( 'wp_redirect', [ $this, 'preserve_lang_param' ] );
}
public function get_wpdb() {
return $this->wpdb;
}
public function init() {
$tax_get = filter_input( INPUT_GET, 'taxonomy' );
$trid = filter_input( INPUT_GET, 'trid' );
if ( $trid
&& ( $source_lang = filter_input( INPUT_GET, 'source_lang' ) )
&& get_taxonomy( $tax_get ) !== false
) {
$translations = $this->sitepress->get_element_translations( $trid, 'tax_' . $this->taxonomy );
if ( isset( $translations[ $_GET['lang'] ] ) && ! empty( $translations[ $_GET['lang'] ]->term_id ) ) {
wp_redirect( get_edit_term_link( $translations[ $_GET['lang'] ]->term_id, $tax_get ) );
exit;
} else {
add_action( 'admin_notices', [ $this, '_tax_adding' ] );
}
}
add_action( $this->taxonomy . '_edit_form', [ $this, 'wpml_edit_term_form' ] );
add_action( $this->taxonomy . '_add_form', [ $this, 'wpml_edit_term_form' ] );
add_action( 'admin_print_scripts-edit-tags.php', [ $this, 'js_scripts_tags' ] );
add_action( 'admin_print_scripts-term.php', [ $this, 'js_scripts_tags' ] );
add_filter( 'wp_dropdown_cats', [ $this, 'wp_dropdown_cats_select_parent' ], 10, 2 );
if ( ! $this->sitepress->get_wp_api()->is_term_edit_page() ) {
$term_lang_filter = new WPML_Term_Language_Filter( $this->wpdb, $this->sitepress );
add_action( 'admin_footer', [ $term_lang_filter, 'terms_language_filter' ], 0 );
}
}
/**
* Filters the display of the categories list in order to prevent the default category from being delete-able.
* This is done by printing a hidden div containing a JSON encoded array with all category id's, the checkboxes of which are to be removed.
*/
public function category_display_action() {
/** @var WPML_Term_Translation $wpml_term_translations */
global $wpml_term_translations;
if ( ( $default_category_id = get_option( 'default_category' ) ) ) {
$default_cat_ids = array();
$translations = $wpml_term_translations->get_element_translations( $default_category_id );
foreach ( $translations as $lang => $translation ) {
$default_cat_ids [] = $wpml_term_translations->term_id_in( $default_category_id, $lang );
}
echo '<div id="icl-default-category-ids" style="display: none;">'
. wp_json_encode( $default_cat_ids ) . '</div>';
}
}
public function js_scripts_tags() {
wp_enqueue_script( 'sitepress-tags', ICL_PLUGIN_URL . '/res/js/tags.js', array(), ICL_SITEPRESS_VERSION );
}
function wp_dropdown_cats_select_parent( $html, $args ) {
if ( ( $trid = filter_input( INPUT_GET, 'trid', FILTER_SANITIZE_NUMBER_INT ) ) ) {
$element_type = $taxonomy = isset( $args['taxonomy'] ) ? $args['taxonomy'] : 'post_tag';
$icl_element_type = 'tax_' . $element_type;
$source_lang = isset( $_GET['source_lang'] )
? filter_input( INPUT_GET, 'source_lang', FILTER_SANITIZE_FULL_SPECIAL_CHARS )
: $this->sitepress->get_default_language();
$parent = $this->wpdb->get_var(
$this->wpdb->prepare(
"
SELECT parent
FROM {$this->wpdb->term_taxonomy} tt
JOIN {$this->wpdb->prefix}icl_translations tr ON tr.element_id=tt.term_taxonomy_id
AND tr.element_type=%s AND tt.taxonomy=%s
WHERE trid=%d AND tr.language_code=%s
",
$icl_element_type,
$taxonomy,
$trid,
$source_lang
)
);
if ( $parent ) {
$parent = (int) icl_object_id( (int) $parent, $element_type );
$html = str_replace( 'value="' . $parent . '"', 'value="' . $parent . '" selected="selected"', $html );
}
}
return $html;
}
/**
* @param Object $term
*/
public function wpml_edit_term_form( $term ) {
include WPML_PLUGIN_PATH . '/menu/term-taxonomy-menus/taxonomy-menu.php';
}
function _tax_adding() {
$trid = filter_input( INPUT_GET, 'trid', FILTER_SANITIZE_NUMBER_INT );
$taxonomy = filter_input( INPUT_GET, 'taxonomy' );
$translations = $trid && $taxonomy ?
$this->sitepress->get_element_translations( $trid, 'tax_' . $taxonomy ) : array();
$name = isset( $translations[ $_GET['source_lang'] ] ) ? $translations[ filter_input( INPUT_GET, 'source_lang', FILTER_SANITIZE_FULL_SPECIAL_CHARS ) ]
: false;
$name = isset( $name->name ) ? $name->name : false;
if ( $name !== false ) {
$tax_name = apply_filters( 'the_category', $name );
// translators: %s is replaced by the name of the taxonomy.
echo '<div id="icl_tax_adding_notice" class="updated fade"><p>'
. sprintf( esc_html__( 'Adding translation for: %s.', 'sitepress' ), $tax_name )
. '</p></div>';
}
}
/**
* If user perform bulk taxonomy deletion when displaying non-default
* language taxonomies, after deletion should stay with same language
*
* @param string $location Url where browser will redirect.
* @return string Url where browser will redirect.
*/
public function preserve_lang_param( $location ) {
global $wpml_url_converter;
$get_lang = $wpml_url_converter->get_language_from_url(
(string) filter_input( INPUT_POST, '_wp_http_referer' )
);
$location = $get_lang ? add_query_arg( 'lang', $get_lang, $location ) : $location;
return $location;
}
}