HEX
Server: LiteSpeed
System: Linux server315.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User: globfdxw (6114)
PHP: 8.1.34
Disabled: NONE
Upload Files
File: /home/globfdxw/www/wp-content/plugins/acfml/classes/class-wpml-acf-translatable-groups-checker.php
<?php

use ACFML\Notice\Links;

/**
 * @author OnTheGo Systems
 */
class WPML_ACF_Translatable_Groups_Checker implements \IWPML_Backend_Action, \IWPML_Frontend_Action, \IWPML_DIC_Action {
	const TRANSIENT_KEY = 'acfml_untranslated_groups';
	const POST_TYPE     = 'acf-field-group';

	/**
	 * @var WP_Post[]|void
	 */
	private $untranslated_groups;

	public function add_hooks() {
		if ( is_admin() && $this->is_field_groups_translatable() ) {
			add_action( 'admin_init', [ $this, 'check_untranslated_groups' ] );
		}
		add_action( 'save_post', [ $this, 'on_save_field_group' ], 10, 2 );
		add_action( 'icl_save_settings', [ $this, 'on_save_settings' ] );
	}

	public function check_untranslated_groups() {
		$this->untranslated_groups = get_transient( self::TRANSIENT_KEY );
		if ( false === $this->untranslated_groups ) {
			$this->untranslated_groups = $this->get_untranslated_field_groups();
			set_transient( self::TRANSIENT_KEY, $this->untranslated_groups );
		}

		$this->untranslated_groups = is_array( $this->untranslated_groups ) ? $this->untranslated_groups : [];
		if ( count( $this->untranslated_groups ) > 0 ) {
			add_action( 'admin_notices', [ $this, 'report_untranslated_groups' ] );
		}
	}

	public function report_untranslated_groups() {
		?>
		<div class="notice notice-error is-dismissible">
			<h2><?php esc_html_e( 'Change the field group translation setting', 'acfml' ); ?></h2>
			<p>
				<?php
				printf(
					/* translators: %1$s and %4$s are placeholders for <a> link tags and %2$s and %3$s are for <b> tags. */
					esc_html__( 'You can translate field labels and labels for Choices using String Translation. To do this, %1$sset the field group post type to %2$sNot Translatable%3$s%4$s.', 'acfml' ),
					'<a href="' . esc_url( Links::getAcfmlExpertDoc( [ 'anchor' => 'field-group-translation-settings' ] ) ) . '" class="wpml-external-link" target="_blank">',
					'<b>',
					'</b>',
					'</a>'
				);
				?>
			</p>
		</div>
		<?php
	}

	/**
	 * @param int     $post_id the ID of the post.
	 * @param WP_Post $post    the post object.
	 * @return void
	 */
	public function on_save_field_group( $post_id, $post ) {
		if ( self::POST_TYPE === $post->post_type ) {
			delete_transient( self::TRANSIENT_KEY );
		}
	}

	/**
	 * @return void
	 */
	public function on_save_settings() {
		/* phpcs:disable WordPress.Security.NonceVerification.Missing,WordPress.CSRF.NonceVerification.NoNonceVerification,WordPress.VIP.SuperGlobalInputUsage.AccessDetected */
		if ( \WPML\FP\Relation::propEq( 'icl_ajx_action', 'icl_custom_posts_sync_options', $_POST ) ) {
			delete_transient( self::TRANSIENT_KEY );
		}
	}

	/**
	 * @return bool
	 */
	private function is_field_groups_translatable() {
		return (bool) apply_filters( 'wpml_sub_setting', false, 'custom_posts_sync_option', self::POST_TYPE );
	}

	/**
	 * @return array
	 */
	private function get_untranslated_field_groups() {
		/* phpcs:ignore WordPress.VIP.RestrictedFunctions.get_posts_get_posts */
		$groups = get_posts(
			[
				'post_type'      => self::POST_TYPE,
				/* phpcs:ignore WordPress.VIP.PostsPerPage.posts_per_page_posts_per_page */
				'posts_per_page' => -1,
				'post_status'    => 'any',
			]
		);

		$untranslated = [];
		foreach ( $groups as $group ) {
			if ( ! apply_filters( 'wpml_element_has_translations', null, $group->ID, self::POST_TYPE ) ) {
				$untranslated[] = $group;
			}
		}
		return $untranslated;
	}
}