321 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			321 lines
		
	
	
		
			7.9 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 early 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() {
 | |
| 
 | |
| 			// phpcs:disable WordPress.Security.NonceVerification.Recommended -- Verified elsewhere.
 | |
| 			// 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( sanitize_text_field( $_REQUEST['lang'] ) );
 | |
| 			}
 | |
| 			// phpcs:enable WordPress.Security.NonceVerification.Recommended
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 *  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
 | |
| 
 | |
| 
 |