150 lines
5.0 KiB
PHP
150 lines
5.0 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Helpers\MigrationHelpers;
|
|
use Illuminate\Console\Attributes\Description;
|
|
use Illuminate\Console\Attributes\Signature;
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Str;
|
|
|
|
#[Signature('migrate:news:execute {--limit=}')]
|
|
#[Description("Migrate WP news to news table")]
|
|
class MigrateNewsExecute extends Command
|
|
{
|
|
private const array STATE_MAP = [
|
|
'draft' => 'draft',
|
|
'pending' => 'pending',
|
|
'publish' => 'published',
|
|
'private' => 'hidden',
|
|
'locked' => 'locked',
|
|
];
|
|
|
|
private array $stats = [];
|
|
|
|
private function uniqueSlug(string $baseSlug, string $table, ?int $ignoreId = null): string
|
|
{
|
|
$slug = $baseSlug;
|
|
$i = 1;
|
|
while (
|
|
DB::table($table)->where('slug', $slug)
|
|
->when($ignoreId, fn ($q) => $q->where('id', '!=', $ignoreId))
|
|
->exists() && $i < 100
|
|
) {
|
|
$slug = $baseSlug . '-' . $i++;
|
|
}
|
|
if ($i >= 100) {
|
|
$slug = (string) Str::uuid();
|
|
}
|
|
return $slug;
|
|
}
|
|
|
|
private function migrateNews($post): void
|
|
{
|
|
$exists = DB::table('migrations_logs')
|
|
->where('source_system', 'wp')
|
|
->where('source_table', 'wp_posts__news')
|
|
->where('source_id', $post->ID)
|
|
->exists();
|
|
if ($exists)
|
|
return;
|
|
|
|
$meta = DB::connection('old_wp')
|
|
->table('postmeta')
|
|
->where('post_id', $post->ID)
|
|
->whereIn('meta_key', ['release_site', 'romhacks_page', 'youtube_video' ])
|
|
->pluck('meta_value', 'meta_key');
|
|
|
|
$categoryTtId = DB::connection('old_wp')
|
|
->table('term_relationships as tr')
|
|
->join('term_taxonomy as tt', 'tr.term_taxonomy_id', '=', 'tt.term_taxonomy_id')
|
|
->where('tr.object_id', $post->ID)
|
|
->where('tt.taxonomy', 'news-category')
|
|
->value('tt.term_taxonomy_id');
|
|
|
|
$categoryId = null;
|
|
if( $categoryTtId ){
|
|
$categoryId = DB::table('migrations_logs')
|
|
->where('source_system', 'wp')
|
|
->where('target_table', 'categories' )
|
|
->where('source_id', $categoryTtId)
|
|
->value('target_id');
|
|
if( !$categoryId ){
|
|
$this->stats['missing_category']++;
|
|
}
|
|
}
|
|
|
|
$userId = DB::table('migration_user_plan')
|
|
->where('wp_user_id', $post->post_author )
|
|
->value('user_id');
|
|
|
|
if( !$userId ){
|
|
$this->stats['missing_author']++;
|
|
return;
|
|
}
|
|
|
|
$slug = $this->uniqueSlug(rawurldecode($post->post_name), 'news');
|
|
$description = trim($post->post_content) === '' ? '' : MigrationHelpers::htmlToMarkdown($post->post_content);
|
|
|
|
if( isset( $meta['romhacks_page'] ) && $meta['romhacks_page'] !== null && $meta['romhacks_page'] !== '' ){
|
|
$description .= "\n\nLink to: " . $meta['romhacks_page'];
|
|
}
|
|
|
|
$newsId = DB::table('news')
|
|
->insertGetId([
|
|
'title' => $post->post_title,
|
|
'slug' => $slug,
|
|
'category_id' => $categoryId,
|
|
'description' => $description,
|
|
'state' => self::STATE_MAP[$post->post_status],
|
|
'entry_id' => null,
|
|
'relevant_link' => $meta['release_site'] ?? null,
|
|
'youtube_link' => $meta['youtube_video'] ?? null,
|
|
'user_id' => $userId,
|
|
'created_at' => $post->post_date,
|
|
'updated_at' => $post->post_modified,
|
|
]);
|
|
|
|
DB::table('migrations_logs')->insert([
|
|
'source_system' => 'wp',
|
|
'source_table' => 'wp_posts__news',
|
|
'source_id' => $post->ID,
|
|
'target_table' => 'news',
|
|
'target_id' => $newsId,
|
|
'status' => 'done',
|
|
'migrated_at' => now(),
|
|
'created_at' => now(),
|
|
'updated_at' => now(),
|
|
]);
|
|
|
|
$this->stats['created']++;
|
|
}
|
|
|
|
public function handle()
|
|
{
|
|
$this->stats = [ 'created' => 0, 'missing_author' => 0, 'missing_category' => 0 ];
|
|
|
|
$query = DB::connection('old_wp')
|
|
->table('posts')
|
|
->where('post_type', 'news')
|
|
->whereIn('post_status', array_keys(self::STATE_MAP))
|
|
;
|
|
|
|
if( $limit = $this->option('limit') ) {
|
|
$query->limit((int)$limit);
|
|
}
|
|
|
|
$posts = $query->select('ID', 'post_title', 'post_name', 'post_content', 'post_author', 'post_status', 'post_date', 'post_modified')->get();
|
|
|
|
$this->info( "{$posts->count()} posts found" );
|
|
|
|
$this->withProgressBar($posts, fn($post) => $this->migrateNews($post) );
|
|
|
|
$this->newLine();
|
|
$this->info( "Created {$this->stats['created']} posts. Missing authors: {$this->stats['missing_author']}. Missing category: {$this->stats['missing_category']}" );
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
}
|