• File: class-import-aioseo-v4.php
  • Full Path: /home/matthif/www/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-aioseo-v4.php
  • Date Modified: 02/24/2024 11:29 PM
  • File size: 9.11 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php
/**
 * File with the class to handle data from All in One SEO Pack, versions 4 and up.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

use Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Cleanup_Action;
use 
Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Posts_Importing_Action;

/**
 * Class with functionality to import & clean All in One SEO Pack post metadata, versions 4 and up.
 */
class WPSEO_Import_AIOSEO_V4 extends WPSEO_Plugin_Importer {

    
/**
     * The plugin name.
     *
     * @var string
     */
    
protected $plugin_name 'All In One SEO Pack';

    
/**
     * Meta key, used in SQL LIKE clause for delete query.
     *
     * @var string
     */
    
protected $meta_key '_aioseo_%';

    
/**
     * Array of meta keys to detect and import.
     *
     * @var array
     */
    
protected $clone_keys = [
        [
            
'old_key' => '_aioseo_title',
            
'new_key' => 'title',
        ],
        [
            
'old_key' => '_aioseo_description',
            
'new_key' => 'metadesc',
        ],
        [
            
'old_key' => '_aioseo_og_title',
            
'new_key' => 'opengraph-title',
        ],
        [
            
'old_key' => '_aioseo_og_description',
            
'new_key' => 'opengraph-description',
        ],
        [
            
'old_key' => '_aioseo_twitter_title',
            
'new_key' => 'twitter-title',
        ],
        [
            
'old_key' => '_aioseo_twitter_description',
            
'new_key' => 'twitter-description',
        ],
    ];

    
/**
     * Mapping between the AiOSEO replace vars and the Yoast replace vars.
     *
     * @var array
     *
     * @see https://yoast.com/help/list-available-snippet-variables-yoast-seo/
     */
    
protected $replace_vars = [
        
// They key is the AiOSEO replace var, the value is the Yoast replace var (see class-wpseo-replace-vars).
        
'#author_first_name' => '%%author_first_name%%',
        
'#author_last_name'  => '%%author_last_name%%',
        
'#author_name'       => '%%name%%',
        
'#categories'        => '%%category%%',
        
'#current_date'      => '%%currentdate%%',
        
'#current_day'       => '%%currentday%%',
        
'#current_month'     => '%%currentmonth%%',
        
'#current_year'      => '%%currentyear%%',
        
'#permalink'         => '%%permalink%%',
        
'#post_content'      => '%%post_content%%',
        
'#post_date'         => '%%date%%',
        
'#post_day'          => '%%post_day%%',
        
'#post_month'        => '%%post_month%%',
        
'#post_title'        => '%%title%%',
        
'#post_year'         => '%%post_year%%',
        
'#post_excerpt_only' => '%%excerpt_only%%',
        
'#post_excerpt'      => '%%excerpt%%',
        
'#separator_sa'      => '%%sep%%',
        
'#site_title'        => '%%sitename%%',
        
'#tagline'           => '%%sitedesc%%',
        
'#taxonomy_title'    => '%%category_title%%',
    ];

    
/**
     * Replaces the AiOSEO variables in our temporary table with Yoast variables (replace vars).
     *
     * @param array $replace_values Key value pair of values to replace with other values. This is only used in the base class but not here.
     *                              That is because this class doesn't have any `convert` keys in `$clone_keys`.
     *                              For that reason, we're overwriting the base class' `meta_key_clone_replace()` function without executing that base functionality.
     *
     * @return void
     */
    
protected function meta_key_clone_replace$replace_values ) {
        global 
$wpdb;

        
// At this point we're already looping through all the $clone_keys (this happens in meta_keys_clone() in the abstract class).
        // Now, we'll also loop through the replace_vars array, which holds the mappings between the AiOSEO variables and the Yoast variables.
        // We'll replace all the AiOSEO variables in the temporary table with their Yoast equivalents.
        
foreach ( $this->replace_vars as $aioseo_variable => $yoast_variable ) {
            
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: We need this query and this is done at many other places as well, for example class-import-rankmath.
            
$wpdb->query(
                
$wpdb->prepare(
                    
'UPDATE tmp_meta_table SET meta_value = REPLACE( meta_value, %s, %s )',
                    
$aioseo_variable,
                    
$yoast_variable
                
)
            );
        }

        
// The AiOSEO custom fields take the form of `#custom_field-myfield`.
        // These should be mapped to %%cf_myfield%%.
        
$meta_values_with_custom_fields $this->get_meta_values_with_custom_field_or_taxonomy$wpdb'custom_field' );
        
$unique_custom_fields           $this->get_unique_custom_fields_or_taxonomies$meta_values_with_custom_fields'custom_field' );
        
$this->replace_custom_field_or_taxonomy_replace_vars$unique_custom_fields$wpdb'custom_field''cf' );

        
// Map `#tax_name-{tax-slug}` to `%%ct_{tax-slug}%%``.
        
$meta_values_with_custom_taxonomies $this->get_meta_values_with_custom_field_or_taxonomy$wpdb'tax_name' );
        
$unique_custom_taxonomies           $this->get_unique_custom_fields_or_taxonomies$meta_values_with_custom_taxonomies'tax_name' );
        
$this->replace_custom_field_or_taxonomy_replace_vars$unique_custom_taxonomies$wpdb'tax_name''ct' );
    }

    
/**
     * Filters out all unique custom fields/taxonomies/etc. used in an AiOSEO replace var.
     *
     * @param string[] $meta_values   An array of all the meta values that
     *                                contain one or more AIOSEO custom field replace vars
     *                                (in the form `#custom_field-xyz`).
     * @param string   $aioseo_prefix The AiOSEO prefix to use
     *                                (e.g. `custom-field` for custom fields or `tax_name` for custom taxonomies).
     *
     * @return string[] An array of all the unique custom fields/taxonomies/etc. used in the replace vars.
     *                  E.g. `xyz` in the above example.
     */
    
protected function get_unique_custom_fields_or_taxonomies$meta_values$aioseo_prefix ) {
        
$unique_custom_fields_or_taxonomies = [];

        foreach ( 
$meta_values as $meta_value ) {
            
// Find all custom field replace vars, store them in `$matches`.
            
preg_match_all(
                
"/#$aioseo_prefix-([\w-]+)/",
                
$meta_value,
                
$matches
            
);

            
/*
             * `$matches[1]` contain the captured matches of the
             * first capturing group (the `([\w-]+)` in the regex above).
             */
            
$custom_fields_or_taxonomies $matches[1];

            foreach ( 
$custom_fields_or_taxonomies as $custom_field_or_taxonomy ) {
                
$unique_custom_fields_or_taxonomiestrim$custom_field_or_taxonomy ) ] = 1;
            }
        }

        return 
array_keys$unique_custom_fields_or_taxonomies );
    }

    
/**
     * Replaces every AIOSEO custom field/taxonomy/etc. replace var with the Yoast version.
     *
     * E.g. `#custom_field-xyz` becomes `%%cf_xyz%%`.
     *
     * @param string[] $unique_custom_fields_or_taxonomies An array of unique custom fields to replace the replace vars of.
     * @param wpdb     $wpdb                               The WordPress database object.
     * @param string   $aioseo_prefix                      The AiOSEO prefix to use
     *                                                     (e.g. `custom-field` for custom fields or `tax_name` for custom taxonomies).
     * @param string   $yoast_prefix                       The Yoast prefix to use (e.g. `cf` for custom fields).
     *
     * @return void
     */
    
protected function replace_custom_field_or_taxonomy_replace_vars$unique_custom_fields_or_taxonomies$wpdb$aioseo_prefix$yoast_prefix ) {
        foreach ( 
$unique_custom_fields_or_taxonomies as $unique_custom_field_or_taxonomy ) {
            
$aioseo_variable "#{$aioseo_prefix}-{$unique_custom_field_or_taxonomy}";
            
$yoast_variable  "%%{$yoast_prefix}_{$unique_custom_field_or_taxonomy}%%";

            
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
            
$wpdb->query(
                
$wpdb->prepare(
                    
'UPDATE tmp_meta_table SET meta_value = REPLACE( meta_value, %s, %s )',
                    
$aioseo_variable,
                    
$yoast_variable
                
)
            );
        }
    }

    
// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching

    /**
     * Retrieve all the meta values from the temporary meta table that contain
     * at least one AiOSEO custom field replace var.
     *
     * @param wpdb   $wpdb          The WordPress database object.
     * @param string $aioseo_prefix The AiOSEO prefix to use
     *                              (e.g. `custom-field` for custom fields or `tax_name` for custom taxonomies).
     *
     * @return string[] All meta values that contain at least one AioSEO custom field replace var.
     */
    
protected function get_meta_values_with_custom_field_or_taxonomy$wpdb$aioseo_prefix ) {
        return 
$wpdb->get_col(
            
$wpdb->prepare(
                
'SELECT meta_value FROM tmp_meta_table WHERE meta_value LIKE %s',
                
"%#$aioseo_prefix-%"
            
)
        );
    }

    
// phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching

    /**
     * Detects whether there is AIOSEO data to import by looking whether the AIOSEO data have been cleaned up.
     *
     * @return bool Boolean indicating whether there is something to import.
     */
    
protected function detect() {
        
$aioseo_cleanup_action YoastSEO()->classes->getAioseo_Cleanup_Action::class );
        return ( 
$aioseo_cleanup_action->get_total_unindexed() > );
    }

    
/**
     * Import AIOSEO post data from their custom indexable table. Not currently used.
     *
     * @return void
     */
    
protected function import() {
        
// This is overriden from the import.js and never run.
        
$aioseo_posts_import_action YoastSEO()->classes->getAioseo_Posts_Importing_Action::class );
        
$aioseo_posts_import_action->index();
    }
}