0x1998 - MANAGER
Düzenlenen Dosya: fixer.php
<?php namespace Jet_Engine\Glossaries; /** * Glossary fixer class */ // If this file is called directly, abort. if ( ! defined( 'WPINC' ) ) { die; } /** * Define Fixer class */ class Fixer { private $args = array( 'glossary_id' => '', 'glossary' => array(), ); protected $nonce = '_jet-engine-glossary-%s-fix-nonce'; protected $updated = false; public function __construct( $glossary ) { if ( ! is_admin() || ! current_user_can( 'manage_options' ) ) { return; } if ( empty( $glossary['id'] ) ) { return; } $this->args['glossary'] = $glossary; $this->args['glossary_id'] = $this->args['glossary']['id']; add_action( 'admin_notices', array( $this, 'init_notices' ) ); add_action( 'admin_init', array( $this, 'do_update' ) ); } private function is_glossary_broken() { $glossary = $this->args['glossary']; $array_values = array( 'labels' => true, 'args' => true, 'fields' => true, 'meta_fields' => true, ); foreach ( $glossary as $key => $value ) { if ( isset( $array_values[$key] ) && ! is_array( maybe_unserialize( $value ) ) ) { return true; } } return false; } public function ensure_glossary_structure( $item = array() ) { $array_values = array( 'labels' => true, 'args' => true, 'fields' => true, 'meta_fields' => true, ); foreach ( $item as $key => $value ) { if ( isset( $array_values[$key] ) && ! is_array( maybe_unserialize( $value ) ) ) { $is_broken = true; $item[ $key ] = preg_replace_callback( '/s:(\d+?):"(.+?)"/', function( $matches ) { return sprintf( 's:%s:"%s"', strlen( $matches[2] ), $matches[2] ); }, $item[ $key ] ); if ( ! is_array( maybe_unserialize( $item[ $key ] ) ) ) { $item[ $key ] = array(); } } } $item = array_map( 'maybe_unserialize', $item ); $item['meta_fields'] = $item['fields']; unset( $item['fields'] ); if ( isset( $item['args']['source'] ) && $item['args']['source'] === 'file' ) { $id = attachment_url_to_postid( $item['args']['source_file']['url'] ); if ( ! get_attached_file( $item['args']['source_file']['id'] ) || $id !== $item['args']['source_file']['id'] ) { if ( get_attached_file( $id ) ) { $item['args']['source_file']['id'] = $id; $item['args']['source_file']['name'] = get_the_title( $id ); } else { $item['args']['source_file']['name'] = 'FILE MISSING'; } } } jet_engine()->glossaries->data->update_item_in_db( $item ); $this->updated = true; return $item; } public function do_update() { if ( ! $this->is_current_update() ) { return; } $item = $this->args['glossary']; $this->ensure_glossary_structure( $item ); } private function is_current_update() { if ( empty( $_GET['je_glossary_fix'] ) || empty( $_GET['_nonce'] ) ) { return false; } if ( $_GET['je_glossary_fix'] !== $this->args['glossary_id'] ) { return false; } $nonce_action = sprintf( $this->nonce, esc_attr( $this->args['glossary_id'] ) ); // phpcs:disable if ( ! wp_verify_nonce( wp_unslash( $_GET['_nonce'] ), $nonce_action ) ) { return false; } // phpcs:enable return true; } public function init_notices() { if ( ! $this->updated && $this->is_glossary_broken() ) { $this->show_failure(); } else { $this->show_updated_notice(); } } private function show_failure() { echo '<div class="notice notice-error">'; echo '<p>'; $this->notice_title(); printf( 'Glossary ID: %s is broken. Check %s or press the button to try fixing it.', absint( $this->args['glossary_id'] ), sprintf( '<a href="%s">glossary settings</a>', esc_html( admin_url( 'admin.php?page=jet-engine#glossaries' ) ) ) ); echo '</p>'; echo '<p>'; $this->notice_submit(); echo '</p>'; echo '</div>'; } private function show_updated_notice() { echo '<div class="notice notice-success is-dismissible">'; echo '<p>'; $this->notice_title(); printf( 'Glossary %s successfully restored.', absint( $this->args['glossary_id'] ) ); echo '</p>'; echo '</div>'; } private function notice_submit() { $format = '<a href="%1s" class="button button-primary">%2$s</a>'; $label = esc_html__( 'Fix', 'jet-engine' ); $url = esc_html( add_query_arg( array( 'je_glossary_fix' => absint( $this->args['glossary_id'] ), '_nonce' => $this->create_nonce(), ), esc_url( admin_url( 'index.php' ) ) ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped printf( $format, $url, $label ); } private function create_nonce() { return wp_create_nonce( sprintf( $this->nonce, absint( $this->args['glossary_id'] ) ) ); } private function notice_title() { printf( '<strong>%1$s</strong> – ', 'JetEngine Glossary Failure' ); } }
geri dön