Files
2026-04-28 15:13:50 +02:00

243 lines
6.6 KiB
PHP

<?php
namespace AIOSEO\Plugin\Pro\Options;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
use AIOSEO\Plugin\Common\Options as CommonOptions;
class DynamicBackup extends CommonOptions\DynamicBackup {
/**
* The custom roles.
*
* @since 4.1.5
*
* @var array
*/
protected $customRoles = [];
/**
* Checks whether data from the backup has to be restored.
*
* @since 4.1.3
*
* @return void
*/
public function init() {
if ( ! is_admin() ) {
return;
}
parent::init();
$this->customRoles = aioseo()->helpers->getCustomRoles();
$this->restoreRoles();
}
/**
* Restores the dynamic Roles options.
*
* @since 4.1.3
*
* @return void
*/
private function restoreRoles() {
foreach ( $this->customRoles as $customRoleName => $customRoleLabel ) {
// Restore the roles.
if ( ! empty( $this->backup['roles'][ $customRoleName ] ) ) {
$this->restoreOptions( $this->backup['roles'][ $customRoleName ], [ 'accessControl', $customRoleName ] );
unset( $this->backup['roles'][ $customRoleName ] );
$this->shouldBackup = true;
}
}
}
/**
* Restores the dynamic Post Types options.
*
* @since 4.1.3
*
* @return void
*/
protected function restorePostTypes() {
parent::restorePostTypes();
foreach ( $this->postTypes as $postType ) {
// Restore the post types for Breadcrumbs.
if ( ! empty( $this->backup['postTypes'][ $postType ]['breadcrumbs'] ) ) {
$this->restoreOptions( $this->backup['postTypes'][ $postType ]['breadcrumbs'], [ 'breadcrumbs', 'postTypes', $postType ] );
unset( $this->backup['postTypes'][ $postType ]['breadcrumbs'] );
$this->shouldBackup = true;
}
}
}
/**
* Restores the dynamic Taxonomies options.
*
* @since 4.1.3
*
* @return void
*/
protected function restoreTaxonomies() {
parent::restoreTaxonomies();
foreach ( $this->taxonomies as $taxonomy ) {
// Restore the taxonomies for Social Networks.
if ( ! empty( $this->backup['taxonomies'][ $taxonomy ]['social']['facebook'] ) ) {
$this->restoreOptions( $this->backup['taxonomies'][ $taxonomy ]['social']['facebook'], [ 'social', 'facebook', 'general', 'taxonomies', $taxonomy ] );
unset( $this->backup['taxonomies'][ $taxonomy ]['social']['facebook'] );
$this->shouldBackup = true;
}
// Restore the taxonomies for Breadcrumbs.
if ( ! empty( $this->backup['taxonomies'][ $taxonomy ]['breadcrumbs'] ) ) {
$this->restoreOptions( $this->backup['taxonomies'][ $taxonomy ]['breadcrumbs'], [ 'breadcrumbs', 'taxonomies', $taxonomy ] );
unset( $this->backup['taxonomies'][ $taxonomy ]['breadcrumbs'] );
$this->shouldBackup = true;
}
}
}
/**
* Restores the dynamic Archives options.
*
* @since 4.1.3
*
* @return void
*/
protected function restoreArchives() {
parent::restoreArchives();
foreach ( $this->archives as $postType ) {
// Restore the archives for Breadcrumbs.
if ( ! empty( $this->backup['archives'][ $postType ]['breadcrumbs'] ) ) {
$this->restoreOptions( $this->backup['archives'][ $postType ]['breadcrumbs'], [ 'searchAppearance', 'archives', $postType ] );
unset( $this->backup['archives'][ $postType ]['breadcrumbs'] );
$this->shouldBackup = true;
}
}
}
/**
* Maybe backup the options if it has disappeared.
*
* @since 4.1.3
*
* @param array $newOptions An array of options to check.
* @return void
*/
public function maybeBackup( $newOptions ) {
parent::maybeBackup( $newOptions );
$this->maybeBackupRoles( $newOptions['accessControl'] );
}
/**
* Maybe backup the roles.
*
* @since 4.1.3
*
* @param array $dynamicRoles An array of dynamic roles to check.
* @return void
*/
private function maybeBackupRoles( $dynamicRoles ) {
// Remove the skipped roles.
$roles = apply_filters( 'aioseo_access_control_excluded_roles', array_merge( [
'subscriber'
], aioseo()->helpers->isWooCommerceActive() ? [ 'customer' ] : [] ) );
foreach ( $roles as $role ) {
if ( array_key_exists( $role, $dynamicRoles ) ) {
unset( $dynamicRoles[ $role ] );
}
}
$missing = [];
foreach ( $dynamicRoles as $role => $data ) {
if ( empty( $this->customRoles[ $role ] ) ) {
$missing[ $role ] = $data;
}
}
foreach ( $missing as $roleName => $roleSettings ) {
$this->backup['roles'][ $roleName ] = aioseo()->dynamicOptions->convertOptionsToValues( $roleSettings, 'value' );
$this->shouldBackup = true;
}
}
/**
* Maybe backup the Post Types.
*
* @since 4.1.3
*
* @param array $newOptions An array of options to check.
* @return void
*/
protected function maybeBackupPostType( $newOptions ) {
parent::maybeBackupPostType( $newOptions );
// Maybe backup the post types for Breadcrumbs.
foreach ( $newOptions['breadcrumbs']['postTypes'] as $dynamicPostTypeName => $dynamicPostTypeSettings ) {
$found = in_array( $dynamicPostTypeName, $this->postTypes, true );
if ( ! $found ) {
$this->backup['postTypes'][ $dynamicPostTypeName ]['breadcrumbs'] = $dynamicPostTypeSettings;
$this->shouldBackup = true;
}
}
}
/**
* Maybe backup the Taxonomies.
*
* @since 4.1.4
*
* @param array $newOptions An array of new options.
* @return void
*/
protected function maybeBackupTaxonomy( $newOptions ) {
parent::maybeBackupTaxonomy( $newOptions );
// Maybe backup the taxonomies for Social Networks.
foreach ( $newOptions['social']['facebook']['general']['taxonomies'] as $dynamicTaxonomyName => $dynamicTaxonomySettings ) {
$found = in_array( $dynamicTaxonomyName, $this->taxonomies, true );
if ( ! $found ) {
$this->backup['taxonomies'][ $dynamicTaxonomyName ]['social']['facebook'] = $dynamicTaxonomySettings;
$this->shouldBackup = true;
}
}
// Maybe backup the taxonomies for Breadcrumbs.
foreach ( $newOptions['breadcrumbs']['taxonomies'] as $dynamicTaxonomyName => $dynamicTaxonomySettings ) {
$found = in_array( $dynamicTaxonomyName, $this->taxonomies, true );
if ( ! $found ) {
$this->backup['taxonomies'][ $dynamicTaxonomyName ]['breadcrumbs'] = $dynamicTaxonomySettings;
$this->shouldBackup = true;
}
}
}
/**
* Maybe backup the Archives.
*
* @since 4.1.3
*
* @param array $newOptions An array of options to check.
* @return void
*/
protected function maybeBackupArchives( $newOptions ) {
parent::maybeBackupArchives( $newOptions );
// Maybe backup the archives for Breadcrumbs.
foreach ( $newOptions['breadcrumbs']['archives']['postTypes'] as $archiveName => $archiveSettings ) {
$found = in_array( $archiveName, $this->archives, true );
if ( ! $found ) {
$this->backup['archives'][ $archiveName ]['breadcrumbs'] = $archiveSettings;
$this->shouldBackup = true;
}
}
}
}