HEX
Server: LiteSpeed
System: Linux php-prod-3.spaceapp.ru 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC 2025 x86_64
User: sarli3128 (1010)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /home/sarlight.ru/public_html/wp-content/plugins/cyr2lat/includes/class-cyr-to-lat-converter.php
<?php
/**
 * Old slugs converter.
 *
 * @package cyr-to-lat
 */

/**
 * Class Cyr_To_Lat_Converter
 *
 * @class Cyr_To_Lat_Converter
 */
class Cyr_To_Lat_Converter {

	/**
	 * Query arg in url to start conversion.
	 */
	const QUERY_ARG = 'cyr-to-lat-convert';

	/**
	 * Plugin main class.
	 *
	 * @var Cyr_To_Lat_Main
	 */
	private $main;

	/**
	 * Plugin settings.
	 *
	 * @var Cyr_To_Lat_Settings
	 */
	private $settings;

	/**
	 * Background process to convert posts.
	 *
	 * @var Cyr_To_Lat_Post_Conversion_Process
	 */
	private $process_all_posts;

	/**
	 * Background process to convert terms.
	 *
	 * @var Cyr_To_Lat_Term_Conversion_Process
	 */
	private $process_all_terms;

	/**
	 * Admin notices.
	 *
	 * @var Cyr_To_Lat_Admin_Notices
	 */
	private $admin_notices;

	/**
	 * Option group.
	 *
	 * @var string
	 */
	private $option_group = '';

	/**
	 * Cyr_To_Lat_Converter constructor.
	 *
	 * @param Cyr_To_Lat_Main                    $main              Plugin main class.
	 * @param Cyr_To_Lat_Settings                $settings          Plugin settings.
	 * @param Cyr_To_Lat_Post_Conversion_Process $process_all_posts Plugin settings.
	 * @param Cyr_To_Lat_Term_Conversion_Process $process_all_terms Plugin settings.
	 * @param Cyr_To_Lat_Admin_Notices           $admin_notices     Plugin settings.
	 */
	public function __construct(
		$main, $settings, $process_all_posts = null, $process_all_terms = null, $admin_notices = null
	) {
		$this->main         = $main;
		$this->settings     = $settings;
		$this->option_group = Cyr_To_Lat_Settings::OPTION_GROUP;

		$this->process_all_posts = $process_all_posts;
		if ( ! $this->process_all_posts ) {
			$this->process_all_posts = new Cyr_To_Lat_Post_Conversion_Process( $main );
		}

		$this->process_all_terms = $process_all_terms;
		if ( ! $this->process_all_terms ) {
			$this->process_all_terms = new Cyr_To_Lat_Term_Conversion_Process( $main );
		}

		$this->admin_notices = $admin_notices;
		if ( ! $this->admin_notices ) {
			$this->admin_notices = new Cyr_To_Lat_Admin_Notices();
		}

		$this->init_hooks();
	}

	/**
	 * Init class hooks.
	 */
	public function init_hooks() {
		add_action( 'admin_init', array( $this, 'process_handler' ) );
		add_action( 'admin_init', array( $this, 'conversion_notices' ) );
	}

	/**
	 * Show conversion notices.
	 */
	public function conversion_notices() {
		$posts_process_running = $this->process_all_posts->is_process_running();
		$terms_process_running = $this->process_all_terms->is_process_running();

		if ( ! $posts_process_running && ! $terms_process_running ) {
			add_action( 'admin_init', array( $this, 'start_conversion' ), 20 );
		}

		if ( $posts_process_running ) {
			$this->admin_notices->add_notice(
				__( 'Cyr To Lat converts existing post slugs in the background process.', 'cyr2lat' ),
				'notice notice-info is-dismissible'
			);
		}

		if ( $terms_process_running ) {
			$this->admin_notices->add_notice(
				__( 'Cyr To Lat converts existing term slugs in the background process.', 'cyr2lat' ),
				'notice notice-info is-dismissible'
			);
		}

		if ( $this->process_all_posts->is_process_completed() ) {
			$this->admin_notices->add_notice(
				__( 'Cyr To Lat completed conversion of existing post slugs.', 'cyr2lat' ),
				'notice notice-success is-dismissible'
			);
		}

		if ( $this->process_all_terms->is_process_completed() ) {
			$this->admin_notices->add_notice(
				__( 'Cyr To Lat completed conversion of existing term slugs.', 'cyr2lat' ),
				'notice notice-success is-dismissible'
			);
		}
	}

	/**
	 * Check if we have to start conversion and start it.
	 */
	public function start_conversion() {
		if ( ! isset( $_POST['cyr2lat-convert'] ) ) {
			return;
		}
		check_admin_referer( $this->option_group . '-options' );
		$this->convert_existing_slugs();
	}

	/**
	 * Process handler.
	 */
	public function process_handler() {
		if ( ! isset( $_GET[ self::QUERY_ARG ] ) || ! isset( $_GET['_wpnonce'] ) ) {
			return;
		}

		if ( ! wp_verify_nonce( sanitize_key( $_GET['_wpnonce'] ), self::QUERY_ARG ) ) {
			return;
		}

		$this->convert_existing_slugs();
	}

	/**
	 * Convert Existing Slugs.
	 *
	 * @param array $args Arguments for query.
	 */
	public function convert_existing_slugs( $args = array() ) {
		global $wpdb;

		$regexp = Cyr_To_Lat_Main::PROHIBITED_CHARS_REGEX . '+';

		$defaults = array(
			'post_type'   => get_post_types(),
			'post_status' => array( 'publish', 'future', 'private' ),
		);

		$args = wp_parse_args( $args, $defaults );

		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
		// phpcs:ignore WordPress.DB.DirectDatabaseQuery
		$posts = $wpdb->get_results(
			$wpdb->prepare(
				"SELECT ID, post_name FROM $wpdb->posts WHERE post_name REGEXP(%s) AND post_status IN (" .
				$this->main->ctl_prepare_in( $args['post_status'] ) . ') AND post_type IN (' .
				$this->main->ctl_prepare_in( $args['post_type'] ) . ')',
				$regexp
			)
		);
		// phpcs:enable WordPress.DB.PreparedSQL.NotPrepared

		if ( $posts ) {
			foreach ( (array) $posts as $post ) {
				$this->process_all_posts->push_to_queue( $post );
			}

			$this->process_all_posts->save()->dispatch();

			$this->log( __( 'Post slugs conversion started.', 'cyr2lat' ) );
			$this->admin_notices->add_notice(
				__( 'Cyr To Lat started conversion of existing post slugs.', 'cyr2lat' ),
				'notice notice-info is-dismissible'
			);
		} else {
			$this->admin_notices->add_notice(
				__( 'Cyr To Lat has not found existing post slugs for conversion.', 'cyr2lat' ),
				'notice notice-info is-dismissible'
			);
		}

		// phpcs:ignore WordPress.DB.DirectDatabaseQuery
		$terms = $wpdb->get_results(
			$wpdb->prepare(
				"SELECT t.term_id, slug, tt.taxonomy, tt.term_taxonomy_id FROM $wpdb->terms t, $wpdb->term_taxonomy tt
					WHERE t.slug REGEXP(%s) AND tt.term_id = t.term_id",
				$regexp
			)
		);

		if ( $terms ) {
			foreach ( (array) $terms as $term ) {
				$this->process_all_terms->push_to_queue( $term );
			}

			$this->process_all_terms->save()->dispatch();

			$this->log( __( 'Term slugs conversion started.', 'cyr2lat' ) );
			$this->admin_notices->add_notice(
				__( 'Cyr To Lat started conversion of existing term slugs.', 'cyr2lat' ),
				'notice notice-info is-dismissible'
			);
		} else {
			$this->admin_notices->add_notice(
				__( 'Cyr To Lat has not found existing term slugs for conversion.', 'cyr2lat' ),
				'notice notice-info is-dismissible'
			);
		}
	}

	/**
	 * Log
	 *
	 * @param string $message Message to log.
	 */
	protected function log( $message ) {
		if ( defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) {
			// @phpcs:disable WordPress.PHP.DevelopmentFunctions.error_log_error_log
			error_log( 'Cyr-To-Lat: ' . $message );
			// @phpcs:enable WordPress.PHP.DevelopmentFunctions.error_log_error_log
		}
	}
}