HEX
Server: Apache
System: Linux sxb1plmcpnl510113.prod.sxb1.secureserver.net 4.18.0-553.58.1.lve.el8.x86_64 #1 SMP Fri Jul 4 12:07:06 UTC 2025 x86_64
User: acnbijigo78q (10488831)
PHP: 8.3.30
Disabled: NONE
Upload Files
File: /home/acnbijigo78q/public_html/jetk.sa/wp-content/plugins/wpml-elasticpress/src/Sync/Dashboard.php
<?php

namespace WPML\ElasticPress\Sync;

use ElasticPress\Indexables;
use ElasticPress\IndexHelper;

use WPML\ElasticPress\Manager\Indices;
use WPML\ElasticPress\Manager\DashboardStatus;

use WPML\ElasticPress\Traits\ManageIndexables;

abstract class Dashboard {

	use ManageIndexables;

	/** @var Indexables */
	private $indexables;

	/** @var Indices */
	protected $indicesManager;

	/** @var DashboardStatus */
	protected $status;

	/** @var array */
	protected $activeLanguages;

	/** @var string */
	private $defaultLanguage;

	/** @var string */
	private $currentLanguage = '';

	/** @var array */
	private $fullIndexArgs = [];

	/**
	 * @param Indexables      $indexables
	 * @param Indices         $indicesManager
	 * @param DashboardStatus $status
	 * @param array           $activeLanguages
	 * @param string          $defaultLanguage
	 */
	public function __construct(
		Indexables      $indexables,
		Indices         $indicesManager,
		DashboardStatus $status,
		$activeLanguages,
		$defaultLanguage
	) {
		$this->indexables            = $indexables;
		$this->indicesManager        = $indicesManager;
		$this->status                = $status;
		$this->activeLanguages       = $activeLanguages;
		$this->defaultLanguage       = $defaultLanguage;
	}

	abstract public function addHooks();

	/**
	 * @param array $args
	 */
	protected function setFullIndexArgs( $args ) {
		$this->fullIndexArgs = $args;
	}

	protected function setUpAndRun() {
		$this->prepare();
		if ( empty( $this->status->get('currentLanguage') ) ) {
			return;
		}
		$this->maybePutMapping();
		$this->beforeFullIndex();

		// This happens on an AJAX call, hence on admin: force the display-as-translated snippet in queries
		add_filter( 'wpml_should_use_display_as_translated_snippet', '__return_true' );

		$this->runFullIndex( $this->fullIndexArgs );
	}

	protected function tearDown() {
		$this->indicesManager->clearCurrentIndexLanguage();
		$this->status->delete();
	}

	private function setCurrentLanguage() {
		do_action( 'wpml_switch_language', $this->currentLanguage );
		$this->indicesManager->setCurrentIndexLanguage( $this->currentLanguage );
	}

	private function clearCurrentLanguage() {
		do_action( 'wpml_switch_language', null );
		$this->indicesManager->clearCurrentIndexLanguage();
	}

	private function prepare() {
		$this->status->prepare();
	}

	private function maybePutMapping() {
		$putMapping = ! empty( $_REQUEST['put_mapping'] );

		if ( $putMapping && false === $this->status->get('putMapping') ) {
			$this->indicesManager->clearAllIndices();
			$this->status->set('putMapping', true);
		}

		$this->indicesManager->generateMissingIndices();

		add_filter( 'ep_skip_index_reset', '__return_true' );
	}

	private function beforeFullIndex() {
		$this->currentLanguage = $this->status->get('currentLanguage');
		$this->setCurrentLanguage();
		$this->status->logIndexablesToReset( $this->deactivateIndexables() );
	}

	/**
	 * @param array $forcedArgs
	 */
	private function runFullIndex( $forcedArgs = [] ) {
		$args = array_merge(
			[
				'method'        => 'dashboard',
				'network_wide'  => 0,
				'show_errors'   => true,
			],
			$forcedArgs
		);

    $args['put_mapping']   = false;
    $args['output_method'] = [ $this, 'indexOutput' ];

		IndexHelper::factory()->full_index( $args );
	}

	private function syncComplete() {
		$message = [
			'message'    => 'Sync complete',
			'index_meta' => null,
			'totals'     => $this->status->get('totals'),
			'status'     => 'success'
		];
		$this->tearDown();
		wp_send_json_success( $message );
		exit;
	}

	private function markLanguageAsComplete() {
		$this->clearCurrentLanguage();
		$this->reactivateIndexables( $this->status->get('indexablesToReset') );
		$this->status->resetForNextLanguage();
	}

	/**
	 * @param  array $message
	 *
	 * @return array
	 */
	private function setResponseMapping( $message ) {
		if ( isset( $message['index_meta']['put_mapping'] ) ) {
			$message['index_meta']['put_mapping'] = $this->status->get('putMapping');
		}
		return $message;
	}

	/**
	 * @param  array $message
	 *
	 * @return array
	 */
	private function setLanguageCompletedResponse( $message ) {
		if ( empty( $message['totals'] ) ) {
			return $message;
		}
		// We completed one language
		$this->status->logTotals( $message['totals'] );
		$this->markLanguageAsComplete();

		if ( empty( $this->status->get('syncStack') ) ) {
			// We completed the last language
			$this->syncComplete();
			exit;
		}

		// Hijack the message data so the next language gets processed
		$message['totals']     = [];
		$message['index_meta'] = [
			'method'      => 'web',
			'totals'      => $this->status->get('totals'),
			'sync_stack'  => [],
			'put_mapping' => $this->status->get('putMapping'),
		];
		return $message;
	}

	/**
	 * @param  array $message
	 *
	 * @return array
	 */
	private function setResponseLanguagePrefix( $message ) {
		if ( empty( $message['message'] ) ) {
			return $message;
		}
		$message['message']  = '[' . $this->currentLanguage . '] ' . $message['message'];
		return $message;
	}

	/**
	 * @param  array $message
	 *
	 * @return array
	 */
	private function setResponseMessage( $message ) {
		$message = $this->setResponseMapping( $message );
		$message = $this->setLanguageCompletedResponse( $message );
		$message = $this->setResponseLanguagePrefix( $message );
		return $message;
	}

	/**
	 * @param array $message
	 */
	public function indexOutput( $message ) {
		$message = $this->setResponseMessage( $message );
		switch ( $message['status'] ) {
			case 'success':
				$this->status->store();
				wp_send_json_success( $message );
				break;

			case 'error':
				$this->status->delete();
				wp_send_json_error( $message );
				break;

			default:
				$this->status->store();
				wp_send_json( [ 'data' => $message ] );
				break;
		}
		exit;
	}

}