<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
puleeno / rake-wordpress-migration-example example snippets
// Thay vì viết code thủ công
$data = file_get_contents($url);
$parsed = parseData($data);
saveToDatabase($parsed);
// Sử dụng visual flow composer
// Drag & drop các components
// Auto generate code
// Tích hợp hoàn hảo với WordPress
add_action('wp_ajax_crawlflow_save_project', [$this, 'handleSaveProject']);
add_action('admin_menu', [$this, 'registerMenu']);
add_action('wp_loaded', [$this, 'initialize']);
// Tự động migrate database
$migrationService = new MigrationService();
$result = $migrationService->runMigrations();
// Version tracking
$version = $migrationService->getCurrentVersion();
// WP-CrawlFlow sử dụng Rake Core
use Rake\Rake;
use Rake\Facade\Logger;
use Rake\Manager\Database\MigrationManager;
// WP-CrawlFlow sử dụng Rake WordPress Adapter
use Rake\WordPress\Database\WordPressDatabaseAdapter;
use Rake\WordPress\Hooks\WordPressHooksAdapter;
use Rake\WordPress\Admin\WordPressAdminAdapter;
// Service registration
$app = new Rake();
$app->singleton(DatabaseAdapterInterface::class, WordPressDatabaseAdapter::class);
$app->singleton(WordPressHooksInterface::class, WordPressHooksAdapter::class);
$app->singleton(WordPressAdminInterface::class, WordPressAdminAdapter::class);
// Trong wp-crawlflow.php
class WP_CrawlFlow
{
private Rake $app;
private CrawlFlowController $controller;
public function __construct()
{
// Initialize Rake container
$this->app = new Rake();
// Register service providers
$this->app->register(new CrawlFlowCoreServiceProvider());
$this->app->register(new CrawlFlowDashboardServiceProvider());
$this->app->register(new CrawlFlowMigrationServiceProvider());
// Initialize controller
$this->controller = new CrawlFlowController($this->app);
$this->controller->registerHooks();
}
}
// Sử dụng ProjectService
$projectService = new ProjectService();
$project = $projectService->createProject([
'name' => 'My Crawl Project',
'description' => 'Crawl data from website',
'settings' => [
'url' => 'https://example.com',
'selectors' => ['h1', 'h2', '.content'],
'output_format' => 'json'
]
]);
// Plugin tự động run migrations khi activate
$migrationService = new MigrationService($app);
$result = $migrationService->runMigrations();
if ($result['success']) {
Logger::info('Migrations completed successfully');
} else {
Logger::error('Migration failed: ' . $result['error']);
}
// Run migrations manually
$kernel = new CrawlFlowMigrationKernel($app);
$kernel->runMigrations();
// Check migration status
$status = $kernel->checkMigrationStatus();
echo "Current version: " . $status['current_version'];
use Rake\Facade\Logger;
// Logger chỉ được initialize khi cần
Logger::info('Starting crawl process');
Logger::error('Crawl failed', ['url' => $url, 'error' => $error]);
Logger::debug('Processing data', ['count' => count($data)]);
// PHP Handler
public function handleSaveProject()
{
if (!wp_verify_nonce($_POST['nonce'], 'crawlflow_save_project')) {
wp_die('Security check failed');
}
$projectService = new ProjectService();
$result = $projectService->createProject($_POST['project']);
if ($result) {
wp_send_json_success(['id' => $result]);
} else {
wp_send_json_error('Failed to save project');
}
}
class CrawlFlowDashboardKernel extends AbstractKernel
{
private DashboardService $dashboardService;
private CrawlFlowController $controller;
public function __construct(Rake $app)
{
parent::__construct($app);
$this->dashboardService = new DashboardService();
$this->controller = new CrawlFlowController($app);
$this->detectCurrentScreen();
$this->loadScreenData();
}
public function render(): void
{
$this->controller->renderPage();
}
}
class MigrationService
{
private Rake $app;
private WordPressDatabaseAdapter $adapter;
public function __construct(Rake $app)
{
$this->app = $app;
$this->adapter = new WordPressDatabaseAdapter();
}
public function runMigrations(): array
{
try {
$schemaPath = $this->app->get('migration_schema_path');
$definitions = $this->getSchemaDefinitions($schemaPath);
foreach ($definitions as $table => $schema) {
$this->createTable($table, $schema);
}
return ['success' => true];
} catch (Exception $e) {
Logger::error('Migration failed: ' . $e->getMessage());
return ['success' => false, 'error' => $e->getMessage()];
}
}
}
class ProjectService
{
private WordPressDatabaseAdapter $adapter;
public function createProject(array $data): int
{
$data['created_at'] = current_time('mysql');
$data['updated_at'] = current_time('mysql');
return $this->adapter->insert('crawlflow_projects', $data);
}
public function getProjects(): array
{
return $this->adapter->getResults("
SELECT * FROM {$this->adapter->getPrefix()}crawlflow_projects
ORDER BY created_at DESC
");
}
}
// Always use WordPress functions with backslash prefix
$result = \wp_verify_nonce($nonce, $action);
// Use WordPress security functions
$sanitized = \sanitize_text_field($input);
// Check capabilities before actions
if (\current_user_can('manage_options')) {
// Perform admin action
}
// Use WordPress hooks properly
\add_action('init', [$this, 'initialize']);
// Use Rake Facades
use Rake\Facade\Logger;
Logger::info('Operation started');
Logger::error('Operation failed', ['context' => $data]);
// Use Rake Container
$app = new Rake();
$service = $app->make(ServiceInterface::class);
// Use Rake Database Adapter
$adapter = new WordPressDatabaseAdapter();
$result = $adapter->query('SELECT * FROM table');
class CrawlFlowControllerTest extends TestCase
{
private CrawlFlowController $controller;
protected function setUp(): void
{
$app = new Rake();
$this->controller = new CrawlFlowController($app);
}
public function testSaveProject(): void
{
// Arrange
$projectData = [
'name' => 'Test Project',
'description' => 'Test Description'
];
// Act
$result = $this->controller->handleSaveProject($projectData);
// Assert
$this->assertTrue($result['success']);
}
}
class CrawlFlowIntegrationTest extends TestCase
{
public function testDashboardRendering(): void
{
// Arrange
$app = new Rake();
$kernel = new CrawlFlowDashboardKernel($app);
// Act
ob_start();
$kernel->render();
$output = ob_get_clean();
// Assert
$this->assertStringContainsString('CrawlFlow', $output);
}
}
// Use transactions for multiple operations
$adapter->beginTransaction();
try {
foreach ($projects as $project) {
$adapter->insert('crawlflow_projects', $project);
}
$adapter->commit();
} catch (Exception $e) {
$adapter->rollback();
throw $e;
}
// Use batch operations
$adapter->getResults("SELECT * FROM crawlflow_projects LIMIT 1000");
// Use specific columns
$adapter->getResults("SELECT id, name FROM crawlflow_projects WHERE status = 'active'");
// Initialize plugin
$plugin = new WP_CrawlFlow();
// Use dashboard
// WordPress Admin → CrawlFlow → Projects
// Use visual composer
// Projects → Add New → Visual Flow Composer
// Use migration
$migrationService = new MigrationService($app);
$result = $migrationService->runMigrations();
bash
composer dump-autoload
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.