302 lines
7.2 KiB
PHP
302 lines
7.2 KiB
PHP
<?php
|
|
|
|
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
|
|
|
if( ! class_exists('ACF_WPML_Compatibility') ) :
|
|
|
|
class ACF_WPML_Compatibility {
|
|
|
|
/**
|
|
* __construct
|
|
*
|
|
* Sets up the class functionality.
|
|
*
|
|
* @date 23/06/12
|
|
* @since 3.1.8
|
|
*
|
|
* @param void
|
|
* @return void
|
|
*/
|
|
function __construct() {
|
|
|
|
// global
|
|
global $sitepress;
|
|
|
|
// update settings
|
|
acf_update_setting('default_language', $sitepress->get_default_language());
|
|
acf_update_setting('current_language', $sitepress->get_current_language());
|
|
|
|
// localize data
|
|
acf_localize_data(array(
|
|
'language' => $sitepress->get_current_language()
|
|
));
|
|
|
|
// switch lang during AJAX action
|
|
add_action('acf/verify_ajax', array($this, 'verify_ajax'));
|
|
|
|
// prevent 'acf-field' from being translated
|
|
add_filter('get_translatable_documents', array($this, 'get_translatable_documents'));
|
|
|
|
// check if 'acf-field-group' is translatable
|
|
if( $this->is_translatable() ) {
|
|
|
|
// actions
|
|
add_action('acf/upgrade_500_field_group', array($this, 'upgrade_500_field_group'), 10, 2);
|
|
add_action('icl_make_duplicate', array($this, 'icl_make_duplicate'), 10, 4);
|
|
|
|
// filters
|
|
add_filter('acf/settings/save_json', array($this, 'settings_save_json'));
|
|
add_filter('acf/settings/load_json', array($this, 'settings_load_json'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* is_translatable
|
|
*
|
|
* Returns true if the acf-field-group post type is translatable.
|
|
* Also adds compatibility with ACF4 settings
|
|
*
|
|
* @date 10/04/2015
|
|
* @since 5.2.3
|
|
*
|
|
* @param void
|
|
* @return bool
|
|
*/
|
|
function is_translatable() {
|
|
|
|
// global
|
|
global $sitepress;
|
|
|
|
// vars
|
|
$post_types = $sitepress->get_setting('custom_posts_sync_option');
|
|
|
|
// return false if no post types
|
|
if( !acf_is_array($post_types) ) {
|
|
return false;
|
|
}
|
|
|
|
// prevent 'acf-field' from being translated
|
|
if( !empty($post_types['acf-field']) ) {
|
|
$post_types['acf-field'] = 0;
|
|
$sitepress->set_setting('custom_posts_sync_option', $post_types);
|
|
}
|
|
|
|
// when upgrading to version 5, review 'acf' setting
|
|
// update 'acf-field-group' if 'acf' is translatable, and 'acf-field-group' does not yet exist
|
|
if( !empty($post_types['acf']) && !isset($post_types['acf-field-group']) ) {
|
|
$post_types['acf-field-group'] = 1;
|
|
$sitepress->set_setting('custom_posts_sync_option', $post_types);
|
|
}
|
|
|
|
// return true if acf-field-group is translatable
|
|
if( !empty($post_types['acf-field-group']) ) {
|
|
return true;
|
|
}
|
|
|
|
// return
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* upgrade_500_field_group
|
|
*
|
|
* Update the icl_translations table data when creating the field groups.
|
|
*
|
|
* @date 10/04/2015
|
|
* @since 5.2.3
|
|
*
|
|
* @param array $field_group The new field group array.
|
|
* @param object $ofg The old field group WP_Post object.
|
|
* @return void
|
|
*/
|
|
function upgrade_500_field_group($field_group, $ofg) {
|
|
|
|
// global
|
|
global $wpdb;
|
|
|
|
// get translation rows (old acf4 and new acf5)
|
|
$old_row = $wpdb->get_row($wpdb->prepare(
|
|
"SELECT * FROM {$wpdb->prefix}icl_translations WHERE element_type=%s AND element_id=%d",
|
|
'post_acf', $ofg->ID
|
|
), ARRAY_A);
|
|
|
|
$new_row = $wpdb->get_row($wpdb->prepare(
|
|
"SELECT * FROM {$wpdb->prefix}icl_translations WHERE element_type=%s AND element_id=%d",
|
|
'post_acf-field-group', $field_group['ID']
|
|
), ARRAY_A);
|
|
|
|
// bail ealry if no rows
|
|
if( !$old_row || !$new_row ) {
|
|
return;
|
|
}
|
|
|
|
// create reference of old trid to new trid
|
|
// trid is a simple int used to find associated objects
|
|
if( empty($this->trid_ref) ) {
|
|
$this->trid_ref = array();
|
|
}
|
|
|
|
// update trid
|
|
if( isset($this->trid_ref[ $old_row['trid'] ]) ) {
|
|
|
|
// this field group is a translation of another, update it's trid to match the previously inserted group
|
|
$new_row['trid'] = $this->trid_ref[ $old_row['trid'] ];
|
|
} else {
|
|
|
|
// this field group is the first of it's translations, update the reference for future groups
|
|
$this->trid_ref[ $old_row['trid'] ] = $new_row['trid'];
|
|
}
|
|
|
|
// update icl_translations
|
|
// Row is created by WPML, and much easier to tweak it here due to the very complicated and nonsensical WPML logic
|
|
$table = "{$wpdb->prefix}icl_translations";
|
|
$data = array( 'trid' => $new_row['trid'], 'language_code' => $old_row['language_code'] );
|
|
$where = array( 'translation_id' => $new_row['translation_id'] );
|
|
$data_format = array( '%d', '%s' );
|
|
$where_format = array( '%d' );
|
|
|
|
// allow source_language_code to equal NULL
|
|
if( $old_row['source_language_code'] ) {
|
|
|
|
$data['source_language_code'] = $old_row['source_language_code'];
|
|
$data_format[] = '%s';
|
|
}
|
|
|
|
// update wpdb
|
|
$result = $wpdb->update( $table, $data, $where, $data_format, $where_format );
|
|
}
|
|
|
|
/**
|
|
* settings_save_json
|
|
*
|
|
* Modifies the json path.
|
|
*
|
|
* @date 19/05/2014
|
|
* @since 5.0.0
|
|
*
|
|
* @param string $path The json save path.
|
|
* @return string
|
|
*/
|
|
function settings_save_json( $path ) {
|
|
|
|
// bail early if dir does not exist
|
|
if( !is_writable($path) ) {
|
|
return $path;
|
|
}
|
|
|
|
// ammend
|
|
$path = untrailingslashit($path) . '/' . acf_get_setting('current_language');
|
|
|
|
// make dir if does not exist
|
|
if( !file_exists($path) ) {
|
|
mkdir($path, 0777, true);
|
|
}
|
|
|
|
// return
|
|
return $path;
|
|
}
|
|
|
|
/**
|
|
* settings_load_json
|
|
*
|
|
* Modifies the json path.
|
|
*
|
|
* @date 19/05/2014
|
|
* @since 5.0.0
|
|
*
|
|
* @param string $path The json save path.
|
|
* @return string
|
|
*/
|
|
function settings_load_json( $paths ) {
|
|
|
|
// loop
|
|
if( $paths ) {
|
|
foreach( $paths as $i => $path ) {
|
|
$paths[ $i ] = untrailingslashit($path) . '/' . acf_get_setting('current_language');
|
|
}}
|
|
|
|
// return
|
|
return $paths;
|
|
}
|
|
|
|
/**
|
|
* icl_make_duplicate
|
|
*
|
|
* description
|
|
*
|
|
* @date 26/02/2014
|
|
* @since 5.0.0
|
|
*
|
|
* @param void
|
|
* @return void
|
|
*/
|
|
function icl_make_duplicate( $master_post_id, $lang, $postarr, $id ) {
|
|
|
|
// bail early if not acf-field-group
|
|
if( $postarr['post_type'] != 'acf-field-group' ) {
|
|
return;
|
|
}
|
|
|
|
// update the lang
|
|
acf_update_setting('current_language', $lang);
|
|
|
|
// duplicate field group specifying the $post_id
|
|
acf_duplicate_field_group( $master_post_id, $id );
|
|
|
|
// always translate independately to avoid many many bugs!
|
|
// - translation post gets a new key (post_name) when origional post is saved
|
|
// - local json creates new files due to changed key
|
|
global $iclTranslationManagement;
|
|
$iclTranslationManagement->reset_duplicate_flag( $id );
|
|
}
|
|
|
|
|
|
/**
|
|
* verify_ajax
|
|
*
|
|
* Sets the correct language during AJAX requests.
|
|
*
|
|
* @type function
|
|
* @date 7/08/2015
|
|
* @since 5.2.3
|
|
*
|
|
* @param void
|
|
* @return void
|
|
*/
|
|
function verify_ajax() {
|
|
|
|
// set the language for this AJAX request
|
|
// this will allow get_posts to work as expected (load posts from the correct language)
|
|
if( isset($_REQUEST['lang']) ) {
|
|
global $sitepress;
|
|
$sitepress->switch_lang( $_REQUEST['lang'] );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* get_translatable_documents
|
|
*
|
|
* Removes 'acf-field' from the available post types for translation.
|
|
*
|
|
* @type function
|
|
* @date 17/8/17
|
|
* @since 5.6.0
|
|
*
|
|
* @param array $icl_post_types The array of post types.
|
|
* @return array
|
|
*/
|
|
function get_translatable_documents( $icl_post_types ) {
|
|
|
|
// unset
|
|
unset( $icl_post_types['acf-field'] );
|
|
|
|
// return
|
|
return $icl_post_types;
|
|
}
|
|
}
|
|
|
|
acf_new_instance('ACF_WPML_Compatibility');
|
|
|
|
endif; // class_exists check
|
|
|
|
?>
|