123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- <?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
|