Files
doitinpoland.com/wp-content/plugins/sitepress-multilingual-cms/classes/menu-elements/class-wpml-admin-scripts-setup.php
2023-09-12 21:41:04 +02:00

528 lines
20 KiB
PHP

<?php
class WPML_Admin_Scripts_Setup extends WPML_Full_Translation_API {
const PRIORITY_ENQUEUE_SCRIPTS = 10;
/** @var string $page */
private $page;
/**
* @param wpdb $wpdb
* @param SitePress $sitepress
* @param WPML_Post_Translation $post_translation
* @param WPML_Terms_Translations $term_translation
* @param string $page
*/
public function __construct( &$wpdb, &$sitepress, &$post_translation, &$term_translation, $page ) {
parent::__construct( $sitepress, $wpdb, $post_translation, $term_translation );
$this->page = $page;
}
public function add_admin_hooks() {
add_action( 'admin_print_scripts', array( $this, 'wpml_js_scripts_setup' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'wpml_css_setup' ), self::PRIORITY_ENQUEUE_SCRIPTS );
}
public function register_styles() {
wp_register_style( 'otgs-dialogs', ICL_PLUGIN_URL . '/res/css/otgs-dialogs.css', array( 'wp-jquery-ui-dialog' ), ICL_SITEPRESS_VERSION );
wp_register_style( 'wpml-dialog', ICL_PLUGIN_URL . '/res/css/dialog.css', array( 'otgs-dialogs' ), ICL_SITEPRESS_VERSION );
wp_register_style( 'wpml-wizard', ICL_PLUGIN_URL . '/res/css/wpml-wizard.css', null, ICL_SITEPRESS_VERSION );
}
private function print_js_globals() {
$icl_ajax_url = wpml_get_admin_url(
array(
'path' => 'admin.php',
'query' => array( 'page' => WPML_PLUGIN_FOLDER . '/menu/languages.php' ),
)
);
?>
<script type="text/javascript">
// <![CDATA[
var icl_ajx_url = '<?php echo esc_url( $icl_ajax_url ); ?>',
icl_ajx_saved = '<?php echo icl_js_escape( __( 'Data saved', 'sitepress' ) ); ?>',
icl_ajx_error = '<?php echo icl_js_escape( __( 'Error: data not saved', 'sitepress' ) ); ?>',
icl_default_mark = '<?php echo icl_js_escape( __( 'default', 'sitepress' ) ); ?>',
icl_this_lang = '<?php echo esc_js( $this->sitepress->get_current_language() ); ?>',
icl_ajxloaderimg_src = '<?php echo esc_url( ICL_PLUGIN_URL ); ?>/res/img/ajax-loader.gif',
icl_cat_adder_msg = '<?php echo icl_js_escape( sprintf( __( 'To add categories that already exist in other languages go to the <a%s>category management page</a>', 'sitepress' ), ' href="' . admin_url( 'edit-tags.php?taxonomy=category' ) . '"' ) ); ?>';
// ]]>
<?php
if ( ! $this->sitepress->get_setting( 'ajx_health_checked' ) && ! (bool) get_option( '_wpml_inactive' ) ) {
$error = __( "WPML can't run normally. There is an installation or server configuration problem. %1\$sShow details%2\$s", 'sitepress' );
$error_message = sprintf( $error, '<a href="#" onclick="jQuery(this).parent().next().slideToggle()">', '</a>' );
?>
addLoadEvent(function () {
jQuery.ajax({
type : "POST",
url : icl_ajx_url,
data : "icl_ajx_action=health_check",
error: function (msg) {
var icl_initial_language = jQuery('#icl_initial_language');
if (icl_initial_language.length) {
icl_initial_language.find('input').attr('disabled', 'disabled');
}
jQuery('.wrap').prepend('<div class="error"><p><?php echo icl_js_escape( $error_message );?></p><p style="display:none"><?php echo icl_js_escape( __( 'AJAX Error:', 'sitepress' ) ); ?> ' + msg.statusText + ' [' + msg.status + ']<br />URL:' + icl_ajx_url + '</p></div>');
}
});
});
<?php
}
?>
</script>
<?php
}
public function wpml_js_scripts_setup() {
// TODO: [WPML 3.3] move javascript to external resource (use wp_localize_script() to pass arguments)
global $pagenow, $sitepress;
$default_language = $this->sitepress->get_default_language();
$current_language = $this->sitepress->get_current_language();
$page_basename = $this->page;
$this->print_js_globals();
$wpml_script_setup_args['default_language'] = $default_language;
$wpml_script_setup_args['current_language'] = $current_language;
do_action( 'wpml_scripts_setup', $wpml_script_setup_args );
if ( 'options-reading.php' === $pagenow ) {
$this->print_reading_options_js();
} elseif ( in_array(
$pagenow,
array(
'categories.php',
'edit-tags.php',
'edit.php',
'term.php',
),
true
)
&& $current_language !== $default_language
) {
$this->correct_status_links_js( $current_language );
}
if ( 'edit-tags.php' === $pagenow || 'term.php' === $pagenow ) {
$post_type = isset( $_GET['post_type'] ) ? '&post_type=' . esc_html( $_GET['post_type'] ) : '';
$admin_url = admin_url( 'edit-tags.php' );
$admin_url = add_query_arg( 'taxonomy', esc_js( $_GET['taxonomy'] ), $admin_url );
$admin_url = add_query_arg( 'lang', $current_language, $admin_url );
$admin_url = add_query_arg( 'message', 3, $admin_url );
if ( $post_type ) {
$admin_url = add_query_arg( 'post_type', $post_type, $admin_url );
}
?>
<script type="text/javascript">
addLoadEvent(function () {
var edit_tag = jQuery('#edittag');
if (edit_tag.find('[name="_wp_original_http_referer"]').length && edit_tag.find('[name="_wp_http_referer"]').length) {
edit_tag.find('[name="_wp_original_http_referer"]').val('<?php echo esc_js( $admin_url ); ?>');
}
});
</script>
<?php
}
$trid = filter_input( INPUT_GET, 'trid', FILTER_SANITIZE_NUMBER_INT );
$source_lang = null !== $trid ? filter_input(
INPUT_GET,
'source_lang',
FILTER_SANITIZE_FULL_SPECIAL_CHARS
) : null;
if ( 'post-new.php' === $pagenow ) {
if ( $trid ) {
$translations = $this->post_translations->get_element_translations( false, $trid );
$sticky_posts = wpml_sticky_post_sync()->get_unfiltered_sticky_posts_option();
$is_sticky = false;
foreach ( $translations as $t ) {
if ( in_array( $t, $sticky_posts ) ) {
$is_sticky = true;
break;
}
}
if ( $this->sitepress->get_setting( 'sync_ping_status' ) || $this->sitepress->get_setting( 'sync_comment_status' ) ) {
$this->print_ping_and_comment_sync_js( $trid, $source_lang );
}
if ( $this->sitepress->get_setting( 'sync_private_flag' ) && 'private' === $this->post_translations->get_original_post_status( $trid, $source_lang ) ) {
?>
<script type="text/javascript">addLoadEvent(function () {
jQuery('#visibility-radio-private').prop('checked', true);
jQuery('#post-visibility-display').html('<?php echo icl_js_escape( __( 'Private', 'sitepress' ) ); ?>');
});
</script>
<?php
}
if ( $this->sitepress->get_setting( 'sync_post_taxonomies' ) ) {
$this->print_tax_sync_js();
}
$custom_field_note = new WPML_Sync_Custom_Field_Note( $this->sitepress );
$custom_field_note->print_sync_copy_custom_field_note( $source_lang, $translations );
}
?>
<?php if ( ! empty( $is_sticky ) && $this->sitepress->get_setting( 'sync_sticky_flag' ) ) : ?>
<script type="text/javascript">
addLoadEvent(
function () {
var block_editor = wpml_get_block_editor();
if(block_editor){
document.addEventListener('DOMContentLoaded', function () {
block_editor.then(function () {
setTimeout(function () {
wp.data.dispatch('core/editor').editPost({sticky: true});
}, 100);
});
});
} else {
jQuery('#sticky').prop('checked', true);
var post_visibility_display = jQuery('#post-visibility-display');
post_visibility_display.html(post_visibility_display.html() + ', <?php echo icl_js_escape( __( 'Sticky', 'sitepress' ) ); ?>');
}
}
);
</script>
<?php endif; ?>
<?php
}
if ( ( 'page-new.php' === $pagenow || ( 'post-new.php' === $pagenow && isset( $_GET['post_type'] ) ) )
&& ( $trid
&& ( $this->sitepress->get_setting( 'sync_page_template' )
|| $this->sitepress->get_setting( 'sync_page_ordering' ) ) )
) {
$this->print_mo_sync_js( $trid, $source_lang );
}
if ( $this->sitepress->is_post_edit_screen() && $this->sitepress->get_setting( 'sync_post_date' ) ) {
$this->print_sync_date_js();
}
if ( 'post-new.php' === $pagenow && isset( $_GET['trid'] ) && $sitepress->get_setting( 'sync_post_format' ) && function_exists(
'get_post_format'
)
) {
$format = $this->post_translations->get_original_post_format( $trid, $source_lang );
?>
<script type="text/javascript">
addLoadEvent(function () {
jQuery('#post-format-' + '<?php echo $format; ?>').prop('checked', true);
});
</script>
<?php
}
wp_enqueue_script( 'theme-preview' );
if ( 'languages' === $page_basename || 'string-translation' === $page_basename ) {
wp_enqueue_script( 'wp-color-picker' );
wp_register_style(
'wpml-color-picker',
ICL_PLUGIN_URL . '/res/css/colorpicker.css',
array( 'wp-color-picker' ),
ICL_SITEPRESS_VERSION
);
wp_enqueue_style( 'wpml-color-picker' );
wp_enqueue_script( 'jquery-ui-sortable' );
}
}
/**
* Prints JavaScript to display correct links on the posts by status break down and also fixes links
* to category and tag pages
*
* @param string $current_language
*/
private function correct_status_links_js( $current_language ) {
?>
<script type="text/javascript">
addLoadEvent(
function () {
jQuery(document).ready(
function () {
jQuery('.subsubsub>li a').each(
function () {
var h = jQuery(this).attr('href');
var urlg = -1 === h.indexOf('?') ? '?' : '&';
jQuery(this).attr('href', h + urlg + 'lang=<?php echo esc_js( $current_language ); ?>');
}
);
jQuery('.column-categories a, .column-tags a, .column-posts a').each(
function () {
jQuery(this).attr('href', jQuery(this).attr('href') + '&lang=<?php echo esc_js( $current_language ); ?>');
}
);
}
);
}
);
</script>
<?php
}
/**
* Prints the JavaScript for synchronizing page order or page template on the post edit screen.
*
* @param int $trid
* @param string $source_lang
*/
private function print_mo_sync_js( $trid, $source_lang ) {
$menu_order = $this->sitepress->get_setting( 'sync_page_ordering' )
? $this->post_translations->get_original_menu_order( $trid, $source_lang )
: null;
$page_template = $this->sitepress->get_setting( 'sync_page_template' )
? get_post_meta(
$this->post_translations->get_element_id( $source_lang, $trid ),
'_wp_page_template',
true
)
: null;
if ( $menu_order || $page_template ) {
?>
<script type="text/javascript">addLoadEvent(function () {
<?php
if ( $menu_order ) {
?>
jQuery('#menu_order').val(<?php echo esc_js( $menu_order ); ?>);
<?php
}
if ( $page_template && 'default' !== $page_template ) {
?>
jQuery('#page_template').val('<?php echo esc_js( $page_template ); ?>');
<?php
}
?>
});</script>
<?php
}
}
/**
* Prints the JavaScript for synchronizing ping and comment status for a post translation on the post edit screen.
*
* @param int $trid
* @param string $source_lang
*/
private function print_ping_and_comment_sync_js( $trid, $source_lang ) {
?>
<script type="text/javascript">addLoadEvent(function () {
var comment_status = jQuery('#comment_status');
var ping_status = jQuery('#ping_status');
<?php if ( $this->sitepress->get_setting( 'sync_comment_status' ) ) : ?>
<?php if ( $this->post_translations->get_original_comment_status( $trid, $source_lang ) === 'open' ) : ?>
comment_status.prop('checked', true);
<?php else : ?>
comment_status.prop('checked', false);
<?php endif; ?>
<?php endif; ?>
<?php if ( $this->sitepress->get_setting( 'sync_ping_status' ) ) : ?>
<?php if ( $this->post_translations->get_original_ping_status( $trid, $source_lang ) === 'open' ) : ?>
ping_status.prop('checked', true);
<?php else : ?>
ping_status.prop('checked', false);
<?php endif; ?>
<?php endif; ?>
});</script>
<?php
}
/**
* Prints the JavaScript for disabling editing the post_date on the post edit screen,
* when the synchronize post_date for translations setting is activated.
*/
private function print_sync_date_js() {
$post_id = $this->get_current_req_post_id();
if ( $post_id !== null ) {
$original_id = $this->post_translations->get_original_element( $post_id );
if ( $original_id && (int) $original_id !== (int) $post_id ) {
$original_date = get_post_field( 'post_date', $original_id );
$exp = explode( ' ', $original_date );
list( $aa, $mm, $jj ) = explode( '-', $exp[0] );
list( $hh, $mn, $ss ) = explode( ':', $exp[1] );
?>
<script type="text/javascript">
addLoadEvent(
function () {
jQuery('#aa').val('<?php echo esc_js( $aa ); ?>').attr('readonly', 'readonly');
jQuery('#mm').val('<?php echo esc_js( $mm ); ?>').attr('disabled', 'disabled').attr('id', 'mm-disabled').attr('name', 'mm-disabled');
// create a hidden element for month because we wont get anything returned from the disabled month dropdown.
jQuery('<input type="hidden" id="mm" name="mm" value="<?php echo $mm; ?>" />').insertAfter('#mm-disabled');
jQuery('#jj').val('<?php echo esc_js( $jj ); ?>').attr('readonly', 'readonly');
jQuery('#hh').val('<?php echo esc_js( $hh ); ?>').attr('readonly', 'readonly');
jQuery('#mn').val('<?php echo esc_js( $mn ); ?>').attr('readonly', 'readonly');
jQuery('#ss').val('<?php echo esc_js( $ss ); ?>').attr('readonly', 'readonly');
var timestamp = jQuery('#timestamp');
timestamp.find('b').append(( '<span> <?php esc_html_e( 'Copied From the Original', 'sitepress' ); ?></span>'));
timestamp.next().html('<span style="margin-left:1em;"><?php esc_html_e( 'Edit', 'sitepress' ); ?></span>');
});
</script>
<?php
}
}
}
private function print_tax_sync_js() {
$post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : 'post';
$source_lang = isset( $_GET['source_lang'] )
? filter_input( INPUT_GET, 'source_lang', FILTER_SANITIZE_FULL_SPECIAL_CHARS )
: $this->sitepress->get_default_language();
$trid = filter_var( $_GET['trid'], FILTER_SANITIZE_NUMBER_INT );
$translations = $this->sitepress->get_element_translations( $trid, 'post_' . $post_type );
if ( ! isset( $translations[ $source_lang ] ) ) {
return;
}
$current_lang = $this->sitepress->get_current_language();
$translatable_taxs = $this->sitepress->get_translatable_taxonomies( true, $post_type );
$all_taxs = get_object_taxonomies( $post_type );
$js = array();
$this->sitepress->switch_lang( $source_lang );
foreach ( $all_taxs as $tax ) {
$tax_detail = get_taxonomy( $tax );
$terms = get_the_terms( $translations[ $source_lang ]->element_id, $tax );
$term_names = array();
if ( $terms ) {
foreach ( $terms as $term ) {
if ( $tax_detail->hierarchical ) {
$term_id = in_array( $tax, $translatable_taxs )
? $this->term_translations->term_id_in(
$term->term_id,
$current_lang,
false
) : $term->term_id;
$js[] = "jQuery('#in-" . $tax . '-' . $term_id . "').prop('checked', true);";
} else {
if ( in_array( $tax, $translatable_taxs ) ) {
$term_id = $this->term_translations->term_id_in( $term->term_id, $current_lang, false );
if ( $term_id ) {
$term = get_term( $term_id, $tax );
$term_names[] = esc_js( $term->name );
}
} else {
$term_names[] = esc_js( $term->name );
}
}
}
}
if ( $term_names ) {
$js[] = "jQuery('#" . esc_js( $tax ) . ".taghint').css('visibility','hidden');";
$js[] = "jQuery('#new-tag-" . esc_js( $tax ) . "').val('" . esc_js( join( ', ', $term_names ) ) . "');";
}
}
$this->sitepress->switch_lang( null );
if ( $js ) {
?>
<script type="text/javascript">
// <![CDATA[
addLoadEvent(function(){
<?php echo join( PHP_EOL, $js ); ?>
jQuery().ready(function() {
jQuery(".tagadd").click();
jQuery('html, body').prop({scrollTop:0});
jQuery('#title').focus();
});
});
// ]]>
</script>
<?php
}
}
private function get_current_req_post_id() {
return isset( $_GET['post'] ) ? filter_var( $_GET['post'], FILTER_SANITIZE_NUMBER_INT ) : null;
}
private function print_reading_options_js() {
list( $warn_home, $warn_posts ) = $this->verify_home_and_blog_pages_translations();
if ( $warn_home || $warn_posts ) {
?>
<script type="text/javascript">
addLoadEvent(function () {
jQuery('input[name="show_on_front"]').parent().parent().parent().parent().append('<?php echo str_replace( "'", "\\'", $warn_home . $warn_posts ); ?>');
});
</script>
<?php
}
}
function wpml_css_setup() {
if ( isset( $_GET['page'] ) ) {
$page = basename( $_GET['page'] );
$page_basename = str_replace( '.php', '', $page );
$page_basename = preg_replace( '/[^\w-]/', '', $page_basename );
}
wp_enqueue_style( 'sitepress-style', ICL_PLUGIN_URL . '/res/css/style.css', array(), ICL_SITEPRESS_VERSION );
if ( isset( $page_basename ) && file_exists( WPML_PLUGIN_PATH . '/res/css/' . $page_basename . '.css' ) ) {
wp_enqueue_style( 'sitepress-' . $page_basename, ICL_PLUGIN_URL . '/res/css/' . $page_basename . '.css', array(), ICL_SITEPRESS_VERSION );
}
wp_enqueue_style( 'wpml-dialog' );
wp_enqueue_style( 'otgs-icons' );
wp_enqueue_style( 'wpml-wizard' );
wp_enqueue_style( 'thickbox' );
}
private function verify_home_and_blog_pages_translations() {
$warn_home = $warn_posts = '';
$page_on_front = get_option( 'page_on_front' );
if ( 'page' === get_option( 'show_on_front' ) && $page_on_front ) {
$warn_home = $this->missing_page_warning(
$page_on_front,
__( 'Your home page does not exist or its translation is not published in %s.', 'sitepress' )
);
}
$page_for_posts = get_option( 'page_for_posts' );
if ( $page_for_posts ) {
$warn_posts = $this->missing_page_warning(
$page_for_posts,
__( 'Your blog page does not exist or its translation is not published in %s.', 'sitepress' ),
'margin-top:4px;'
);
}
return array( $warn_home, $warn_posts );
}
/**
* @param int $original_page_id
* @param string $label
* @param string $additional_css
*
* @return string
*/
private function missing_page_warning( $original_page_id, $label, $additional_css = '' ) {
$warn_posts = '';
if ( $original_page_id ) {
$page_posts_translations = $this->post_translations->get_element_translations( $original_page_id );
$missing_posts = array();
$active_languages = $this->sitepress->get_active_languages();
foreach ( $active_languages as $lang ) {
if ( ! isset( $page_posts_translations[ $lang['code'] ] )
|| get_post_status( $page_posts_translations[ $lang['code'] ] ) !== 'publish'
) {
$missing_posts[] = $lang['display_name'];
}
}
if ( ! empty( $missing_posts ) ) {
$warn_posts = '<div class="icl_form_errors" style="font-weight:bold;' . $additional_css . '">';
$warn_posts .= sprintf( $label, join( ', ', $missing_posts ) );
$warn_posts .= '<br />';
$warn_posts .= '<a href="' . get_edit_post_link( $original_page_id ) . '">' . __(
'Edit this page to add translations',
'sitepress'
) . '</a>';
$warn_posts .= '</div>';
}
}
return $warn_posts;
}
}