ACF_WPML_Compatibility{}ACF 1.0

Хуков нет.

Использование

$ACF_WPML_Compatibility = new ACF_WPML_Compatibility();
// use class methods

Методы

  1. public __construct()
  2. public get_translatable_documents( $icl_post_types )
  3. public icl_make_duplicate( $master_post_id, $lang, $postarr, $id )
  4. public is_translatable()
  5. public settings_load_json( $paths )
  6. public settings_save_json( $path )
  7. public upgrade_500_field_group( $field_group, $ofg )
  8. public verify_ajax()

Код ACF_WPML_Compatibility{} ACF 5.10.2

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;
	}
}