<?php
/**
* Synchronize Taxonomies
*
* @package surerank
* @since 1.2.0
*/
namespace SureRank\Inc\BatchProcess;
use SureRank\Inc\Functions\Cache;
use SureRank\Inc\Sitemap\Sitemap;
use SureRank\Inc\Sitemap\Utils;
use SureRank\Inc\Traits\Get_Instance;
use SureRank\Inc\Traits\Logger;
use WP_Term;
/**
* Synchronize Taxonomies
*
* @since 1.2.0
*/
class Sync_Taxonomies extends Sitemap {
use Get_Instance;
use Logger;
/**
* Offset
*
* @var int
*/
private $offset = 0;
/**
* Taxonomy
*
* @var string
*/
private $taxonomy = '';
/**
* Chunk Size
*
* @var int
*/
private $chunk_size = 20;
/**
* Constructor
*
* @since 1.2.0
* @param int $offset The offset for pagination.
* @param string $taxonomy The taxonomy to process.
* @param int $chunk_size The chunk size for pagination.
*/
public function __construct( $offset = 0, $taxonomy = '', $chunk_size = 20 ) {
$this->offset = $offset;
$this->taxonomy = $taxonomy;
$this->chunk_size = $chunk_size;
Cache::init();
}
/**
* Import
*
* @since 1.2.0
* @return array<string, mixed>
*/
public function import() {
$taxonomy = ! empty( $this->taxonomy ) ? $this->taxonomy : 'any';
$current_offset = $this->offset;
$terms = $this->get_terms( $current_offset, $this->chunk_size );
if ( empty( $terms ) ) {
return [
'success' => true,
'msg' => __( 'No terms found for processing.', 'surerank' ),
];
}
$json_data = $this->generate_taxonomies_json( $terms );
$file_index = ( $current_offset / $this->chunk_size ) + 1;
$this->save_json_cache( $json_data, $taxonomy, $file_index );
/* translators: %d: number of terms. */
$message = sprintf( __( 'JSON generation completed for %d terms.', 'surerank' ), count( $terms ) );
return [
'success' => true,
'msg' => $message,
];
}
/**
* Get terms with pagination.
*
* @param int $offset Offset for pagination.
* @param int $chunk_size Number of terms to retrieve.
* @return array<int, WP_Term> Array of WP_Term objects.
*/
private function get_terms( $offset, $chunk_size ) {
$taxonomy = ! empty( $this->taxonomy ) ? $this->taxonomy : 'any';
$no_index_settings = $this->get_noindex_settings();
$args = [
'taxonomy' => $taxonomy,
'hide_empty' => true,
'number' => $chunk_size,
'offset' => $offset,
'orderby' => 'term_id',
'order' => 'DESC',
];
$args['meta_query'] = Utils::get_indexable_meta_query( $taxonomy ); //phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
$args = apply_filters( 'surerank_sitemap_taxonomies_cache_args', $args, $taxonomy );
$terms = get_terms( $args );
if ( is_wp_error( $terms ) || ! is_array( $terms ) ) {
return [];
}
return array_filter(
$terms,
static function( $term ) {
return $term instanceof WP_Term;
}
);
}
/**
* Generate JSON data for taxonomies
*
* @param array<WP_Term> $terms Array of WP_Term objects.
* @since 1.2.0
* @return array<int, array<string, mixed>>
*/
private function generate_taxonomies_json( $terms ) {
$json_data = [];
foreach ( $terms as $term ) {
if ( ! $term instanceof WP_Term ) {
continue;
}
$term_data = [
'id' => $term->term_id,
'name' => $term->name,
'slug' => $term->slug,
'link' => get_term_link( $term ),
'taxonomy' => $term->taxonomy,
'description' => $term->description,
'count' => $term->count,
'updated' => current_time( 'c' ),
];
$json_data[] = $term_data;
}
return $json_data;
}
/**
* Save JSON data to cache
*
* @param array<int, array<string, mixed>> $json_data The JSON data.
* @param string $taxonomy The taxonomy name.
* @param int $file_index The file index.
* @since 1.2.0
* @return void
*/
private function save_json_cache( array $json_data, string $taxonomy, int $file_index ) {
$safe_taxonomy = sanitize_key( $taxonomy );
$tax_prefix = self::get_taxonomy_prefix();
$filename = $tax_prefix . '-' . $safe_taxonomy . '-chunk-' . absint( $file_index ) . '.json';
self::log( 'Saving JSON cache for ' . $taxonomy . ' (file: ' . $filename . ')' );
$json_string = wp_json_encode( $json_data );
if ( false === $json_string ) {
return;
}
Cache::store_file( $filename, $json_string );
Cache::update_sitemap_index( $tax_prefix . '-' . $safe_taxonomy, $file_index, count( $json_data ) );
}
}
/**
* Kicking this off by calling 'get_instance()' method
*/
Sync_Taxonomies::get_instance();