Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php /** * Plugin Name: Multisite Article Sync * Description: Plugin untuk sinkronis..

Decoded Output download

<?php 
/** 
 * Plugin Name: Multisite Article Sync 
 * Description: Plugin untuk sinkronisasi artikel dan gambar dari domain utama ke subdomain dalam jaringan multisite WordPress dan domain eksternal. 
 * Version: 3.0 
 * Author: BidayyCom 
 */ 
 
class MultisiteArticleSync { 
     
    private $license_server = 'https://domain-utama.com'; 
     
    public function __construct() { 
        add_action('admin_menu', [$this, 'add_admin_menu']); 
        add_action('save_post', [$this, 'generate_seo_data'], 9, 3); 
        add_action('save_post', [$this, 'sync_post_to_subsites'], 10, 3); 
        add_action('before_delete_post', [$this, 'delete_post_from_subsites']); 
        add_action('admin_post_delete_subdomain_posts', [$this, 'handle_post_deletion']); 
        add_action('admin_enqueue_scripts', [$this, 'enqueue_admin_styles']); 
        add_action('rest_api_init', [$this, 'register_api_endpoints']); 
    } 
 
    public function enqueue_admin_styles($hook) { 
        if ($hook === 'toplevel_page_multisite-sync-settings' || $hook === 'multisite-sync_page_multisite-sync-posts') { 
            echo '<style> 
                .multisite-grid { 
                    display: grid; 
                    grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); 
                    gap: 1rem; 
                    margin: 20px 0; 
                } 
                .multisite-card { 
                    background: #fff; 
                    border: 1px solid #ccd0d4; 
                    padding: 20px; 
                    border-radius: 4px; 
                    transition: all 0.2s; 
                } 
                .multisite-card:hover { 
                    box-shadow: 0 2px 5px rgba(0,0,0,0.1); 
                    transform: translateY(-2px); 
                } 
                .multisite-card label { 
                    display: flex; 
                    align-items: center; 
                    cursor: pointer; 
                } 
                .external-domain-template { 
                    margin-bottom: 10px; 
                    display: flex; 
                    align-items: center; 
                    gap: 10px; 
                } 
                .multisite-nav a { 
                    text-decoration: none; 
                    padding: 8px 15px; 
                    border-radius: 3px; 
                    background: #f0f0f1; 
                    color: #1d2327; 
                } 
                .multisite-nav a.active { 
                    background: #2271b1; 
                    color: white; 
                } 
            </style>'; 
             
            wp_enqueue_script('multisite-sync-admin', plugins_url('admin.js', __FILE__), ['jquery'], '1.0', true); 
        } 
    } 
 
    public function add_admin_menu() { 
        add_menu_page( 
            'Pengaturan Sinkronisasi Multisite', 
            'Sinkronisasi Multisite', 
            'manage_options', 
            'multisite-sync-settings', 
            [$this, 'settings_page'], 
            'dashicons-networking', 
            20 
        ); 
         
        add_submenu_page( 
            'multisite-sync-settings', 
            'Kelola Posting Subdomain', 
            'Kelola Posting', 
            'manage_options', 
            'multisite-sync-posts', 
            [$this, 'subdomain_posts_page'] 
        ); 
    } 
 
    public function settings_page() { 
        if (isset($_POST['save_settings'])) { 
            $settings = [ 
                'sync_sites' => $_POST['settings']['sync_sites'] ?? [], 
                'external_domains' => $_POST['settings']['external_domains'] ?? [] 
            ]; 
            update_option('multisite_article_sync_options', $settings); 
            echo '<div class="notice notice-success is-dismissible"><p>Pengaturan berhasil disimpan!</p></div>'; 
        } 
         
        $sites = get_sites(); 
        $options = get_option('multisite_article_sync_options', []); 
        $selected_sites = $options['sync_sites'] ?? []; 
        $external_domains = $options['external_domains'] ?? []; 
         
        echo '<div class="wrap"> 
            <h1> Pengaturan Sinkronisasi Multisite</h1> 
            <div class="multisite-nav"> 
                <a href="'.admin_url('admin.php?page=multisite-sync-settings').'" class="active"> Pengaturan</a> 
                <a href="'.admin_url('admin.php?page=multisite-sync-posts').'"> Kelola Posting</a> 
            </div> 
 
            <div class="card"> 
                <form method="post"> 
                    <h2>Pilih Subsite untuk Sinkronisasi</h2> 
                    <div class="multisite-grid">'; 
 
        foreach ($sites as $site) { 
            $checked = in_array($site->blog_id, $selected_sites) ? 'checked' : ''; 
            echo '<div class="multisite-card"> 
                <label> 
                    <input type="checkbox" name="settings[sync_sites][]"  
                        value="' . esc_attr($site->blog_id) . '" ' . $checked . '> 
                    ' . esc_html($site->domain) . ' 
                </label> 
            </div>'; 
        } 
 
        echo '</div> 
                    <h2 style="margin-top:30px"> Domain Eksternal</h2> 
                    <div id="external-domains">'; 
 
        foreach ($external_domains as $index => $domain) { 
            echo '<div class="external-domain-template"> 
                <input type="text" name="settings[external_domains]['.$index.'][url]"  
                    value="'.esc_attr($domain['url']).'" 
                    placeholder="URL Domain (contoh: https://domain.com)"  
                    style="width:300px"> 
                <input type="text" name="settings[external_domains]['.$index.'][api_key]"  
                    value="'.esc_attr($domain['api_key']).'" 
                    placeholder="API Key"  
                    style="width:200px"> 
                <button type="button" class="button remove-domain">Hapus</button> 
            </div>'; 
        } 
 
        echo '<div class="external-domain-fields"></div> 
                        <button type="button" class="button" id="add-external-domain">+ Tambah Domain</button> 
                    </div> 
 
                    <button type="submit" name="save_settings" class="button button-primary button-large" style="margin-top:20px"> 
                         Simpan Pengaturan 
                    </button> 
                </form> 
            </div> 
        </div>'; 
    } 
 
    public function subdomain_posts_page() { 
        $options = get_option('multisite_article_sync_options', []); 
        $selected_sites = $options['sync_sites'] ?? []; 
        $all_posts = []; 
         
        foreach ($selected_sites as $site_id) { 
            switch_to_blog($site_id); 
            $posts = get_posts([ 
                'post_type' => 'post', 
                'meta_key' => '_synced_from_main_site', 
                'posts_per_page' => -1, 
                'post_status' => 'any' 
            ]); 
             
            foreach ($posts as $post) { 
                $all_posts[] = [ 
                    'blog_id' => $site_id, 
                    'post_id' => $post->ID, 
                    'title' => $post->post_title, 
                    'domain' => get_blog_details($site_id)->domain, 
                    'edit_link' => get_edit_post_link($post->ID) 
                ]; 
            } 
            restore_current_blog(); 
        } 
         
        echo '<div class="wrap"> 
            <h1> Posting Tersinkronisasi</h1> 
            <div class="multisite-nav"> 
                <a href="'.admin_url('admin.php?page=multisite-sync-settings').'"> Pengaturan</a> 
                <a href="'.admin_url('admin.php?page=multisite-sync-posts').'" class="active"> Kelola Posting</a> 
            </div> 
 
            <form method="post" action="' . admin_url('admin-post.php') . '" class="card"> 
                <input type="hidden" name="action" value="delete_subdomain_posts"> 
                ' . wp_nonce_field('bulk_delete_subdomain_posts', '_wpnonce', true, false) . ' 
                 
                <table class="wp-list-table widefat fixed striped"> 
                    <thead> 
                        <tr> 
                            <th class="check-column"><input type="checkbox" id="select_all"></th> 
                            <th>Judul Posting</th> 
                            <th>Domain</th> 
                            <th>Aksi</th> 
                        </tr> 
                    </thead> 
                    <tbody>'; 
         
        foreach ($all_posts as $post) { 
            echo '<tr> 
                <td><input type="checkbox" name="posts_to_delete[]" value="' . $post['blog_id'] . ':' . $post['post_id'] . '"></td> 
                <td>' . esc_html($post['title']) . '</td> 
                <td>' . esc_html($post['domain']) . '</td> 
                <td> 
                    <a href="' . esc_url($post['edit_link']) . '"  
                       class="button"  
                       target="_blank"> 
                        Buka 
                    </a> 
                </td> 
            </tr>'; 
        } 
         
        echo '</tbody> 
                </table> 
                 
                <div style="padding:15px"> 
                    <button type="submit"  
                            class="button button-danger"  
                            onclick="return confirm(\'Yakin ingin menghapus posting terpilih?\')"> 
                        Hapus yang Dipilih 
                    </button> 
                </div> 
            </form> 
        </div>'; 
    } 
 
    // Fungsi-fungsi lainnya (generate_seo_data, sync_post_to_subsites, dll) 
    // ... [Tetap sama seperti versi sebelumnya dengan penyesuaian terjemahan] 
 
    public function register_api_endpoints() { 
        register_rest_route('multisite-sync/v1', '/create-post', [ 
            'methods' => 'POST', 
            'callback' => [$this, 'handle_external_post_create'], 
            'permission_callback' => '__return_true' 
        ]); 
         
        register_rest_route('multisite-sync/v1', '/delete-post', [ 
            'methods' => 'POST', 
            'callback' => [$this, 'handle_external_post_delete'], 
            'permission_callback' => '__return_true' 
        ]); 
    } 
 
    public function handle_external_post_create(WP_REST_Request $request) { 
        // Validasi API Key 
        $api_key = $request->get_param('api_key'); 
        $valid_keys = array_column(get_option('multisite_article_sync_options')['external_domains'] ?? [], 'api_key'); 
         
        if (!in_array($api_key, $valid_keys)) { 
            return new WP_Error('unauthorized', 'API Key tidak valid', ['status' => 401]); 
        } 
 
        // Proses pembuatan posting 
        $post_data = [ 
            'post_title' => $request['title'], 
            'post_content' => $request['content'], 
            'post_excerpt' => $request['excerpt'], 
            'post_status' => $request['status'], 
            'post_type' => 'post' 
        ]; 
         
        $post_id = wp_insert_post($post_data); 
         
        // Simpan meta data 
        update_post_meta($post_id, '_synced_from_main_site', $request['original_id']); 
        update_post_meta($post_id, '_seo_title', $request['seo_title']); 
        update_post_meta($post_id, '_seo_description', $request['seo_description']); 
         
        // Proses gambar unggulan 
        if (!empty($request['featured_image'])) { 
            $this->upload_featured_image($request['featured_image'], $post_id); 
        } 
         
        return ['success' => true, 'post_id' => $post_id]; 
    } 
 
    private function upload_featured_image($image_url, $post_id) { 
        require_once(ABSPATH . 'wp-admin/includes/image.php'); 
        require_once(ABSPATH . 'wp-admin/includes/file.php'); 
        require_once(ABSPATH . 'wp-admin/includes/media.php'); 
         
        $media = media_sideload_image($image_url, $post_id); 
        $attachments = get_posts(['post_type' => 'attachment', 'post_parent' => $post_id]); 
         
        if (!empty($attachments)) { 
            set_post_thumbnail($post_id, $attachments[0]->ID); 
        } 
    } 
 
    public function handle_external_post_delete(WP_REST_Request $request) { 
        // Validasi API Key 
        $api_key = $request->get_param('api_key'); 
        $valid_keys = array_column(get_option('multisite_article_sync_options')['external_domains'] ?? [], 'api_key'); 
         
        if (!in_array($api_key, $valid_keys)) { 
            return new WP_Error('unauthorized', 'API Key tidak valid', ['status' => 401]); 
        } 
 
        // Cari dan hapus posting 
        $posts = get_posts([ 
            'meta_key' => '_synced_from_main_site', 
            'meta_value' => $request['original_id'], 
            'post_type' => 'post', 
            'posts_per_page' => 1 
        ]); 
         
        if (!empty($posts)) { 
            wp_delete_post($posts[0]->ID, true); 
            return ['success' => true]; 
        } 
         
        return ['success' => false]; 
    } 
} 
 
new MultisiteArticleSync(); ?>

Did this file decode correctly?

Original Code

<?php
/**
 * Plugin Name: Multisite Article Sync
 * Description: Plugin untuk sinkronisasi artikel dan gambar dari domain utama ke subdomain dalam jaringan multisite WordPress dan domain eksternal.
 * Version: 3.0
 * Author: BidayyCom
 */

class MultisiteArticleSync {
    
    private $license_server = 'https://domain-utama.com';
    
    public function __construct() {
        add_action('admin_menu', [$this, 'add_admin_menu']);
        add_action('save_post', [$this, 'generate_seo_data'], 9, 3);
        add_action('save_post', [$this, 'sync_post_to_subsites'], 10, 3);
        add_action('before_delete_post', [$this, 'delete_post_from_subsites']);
        add_action('admin_post_delete_subdomain_posts', [$this, 'handle_post_deletion']);
        add_action('admin_enqueue_scripts', [$this, 'enqueue_admin_styles']);
        add_action('rest_api_init', [$this, 'register_api_endpoints']);
    }

    public function enqueue_admin_styles($hook) {
        if ($hook === 'toplevel_page_multisite-sync-settings' || $hook === 'multisite-sync_page_multisite-sync-posts') {
            echo '<style>
                .multisite-grid {
                    display: grid;
                    grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
                    gap: 1rem;
                    margin: 20px 0;
                }
                .multisite-card {
                    background: #fff;
                    border: 1px solid #ccd0d4;
                    padding: 20px;
                    border-radius: 4px;
                    transition: all 0.2s;
                }
                .multisite-card:hover {
                    box-shadow: 0 2px 5px rgba(0,0,0,0.1);
                    transform: translateY(-2px);
                }
                .multisite-card label {
                    display: flex;
                    align-items: center;
                    cursor: pointer;
                }
                .external-domain-template {
                    margin-bottom: 10px;
                    display: flex;
                    align-items: center;
                    gap: 10px;
                }
                .multisite-nav a {
                    text-decoration: none;
                    padding: 8px 15px;
                    border-radius: 3px;
                    background: #f0f0f1;
                    color: #1d2327;
                }
                .multisite-nav a.active {
                    background: #2271b1;
                    color: white;
                }
            </style>';
            
            wp_enqueue_script('multisite-sync-admin', plugins_url('admin.js', __FILE__), ['jquery'], '1.0', true);
        }
    }

    public function add_admin_menu() {
        add_menu_page(
            'Pengaturan Sinkronisasi Multisite',
            'Sinkronisasi Multisite',
            'manage_options',
            'multisite-sync-settings',
            [$this, 'settings_page'],
            'dashicons-networking',
            20
        );
        
        add_submenu_page(
            'multisite-sync-settings',
            'Kelola Posting Subdomain',
            'Kelola Posting',
            'manage_options',
            'multisite-sync-posts',
            [$this, 'subdomain_posts_page']
        );
    }

    public function settings_page() {
        if (isset($_POST['save_settings'])) {
            $settings = [
                'sync_sites' => $_POST['settings']['sync_sites'] ?? [],
                'external_domains' => $_POST['settings']['external_domains'] ?? []
            ];
            update_option('multisite_article_sync_options', $settings);
            echo '<div class="notice notice-success is-dismissible"><p>Pengaturan berhasil disimpan!</p></div>';
        }
        
        $sites = get_sites();
        $options = get_option('multisite_article_sync_options', []);
        $selected_sites = $options['sync_sites'] ?? [];
        $external_domains = $options['external_domains'] ?? [];
        
        echo '<div class="wrap">
            <h1> Pengaturan Sinkronisasi Multisite</h1>
            <div class="multisite-nav">
                <a href="'.admin_url('admin.php?page=multisite-sync-settings').'" class="active"> Pengaturan</a>
                <a href="'.admin_url('admin.php?page=multisite-sync-posts').'"> Kelola Posting</a>
            </div>

            <div class="card">
                <form method="post">
                    <h2>Pilih Subsite untuk Sinkronisasi</h2>
                    <div class="multisite-grid">';

        foreach ($sites as $site) {
            $checked = in_array($site->blog_id, $selected_sites) ? 'checked' : '';
            echo '<div class="multisite-card">
                <label>
                    <input type="checkbox" name="settings[sync_sites][]" 
                        value="' . esc_attr($site->blog_id) . '" ' . $checked . '>
                    ' . esc_html($site->domain) . '
                </label>
            </div>';
        }

        echo '</div>
                    <h2 style="margin-top:30px"> Domain Eksternal</h2>
                    <div id="external-domains">';

        foreach ($external_domains as $index => $domain) {
            echo '<div class="external-domain-template">
                <input type="text" name="settings[external_domains]['.$index.'][url]" 
                    value="'.esc_attr($domain['url']).'"
                    placeholder="URL Domain (contoh: https://domain.com)" 
                    style="width:300px">
                <input type="text" name="settings[external_domains]['.$index.'][api_key]" 
                    value="'.esc_attr($domain['api_key']).'"
                    placeholder="API Key" 
                    style="width:200px">
                <button type="button" class="button remove-domain">Hapus</button>
            </div>';
        }

        echo '<div class="external-domain-fields"></div>
                        <button type="button" class="button" id="add-external-domain">+ Tambah Domain</button>
                    </div>

                    <button type="submit" name="save_settings" class="button button-primary button-large" style="margin-top:20px">
                         Simpan Pengaturan
                    </button>
                </form>
            </div>
        </div>';
    }

    public function subdomain_posts_page() {
        $options = get_option('multisite_article_sync_options', []);
        $selected_sites = $options['sync_sites'] ?? [];
        $all_posts = [];
        
        foreach ($selected_sites as $site_id) {
            switch_to_blog($site_id);
            $posts = get_posts([
                'post_type' => 'post',
                'meta_key' => '_synced_from_main_site',
                'posts_per_page' => -1,
                'post_status' => 'any'
            ]);
            
            foreach ($posts as $post) {
                $all_posts[] = [
                    'blog_id' => $site_id,
                    'post_id' => $post->ID,
                    'title' => $post->post_title,
                    'domain' => get_blog_details($site_id)->domain,
                    'edit_link' => get_edit_post_link($post->ID)
                ];
            }
            restore_current_blog();
        }
        
        echo '<div class="wrap">
            <h1> Posting Tersinkronisasi</h1>
            <div class="multisite-nav">
                <a href="'.admin_url('admin.php?page=multisite-sync-settings').'"> Pengaturan</a>
                <a href="'.admin_url('admin.php?page=multisite-sync-posts').'" class="active"> Kelola Posting</a>
            </div>

            <form method="post" action="' . admin_url('admin-post.php') . '" class="card">
                <input type="hidden" name="action" value="delete_subdomain_posts">
                ' . wp_nonce_field('bulk_delete_subdomain_posts', '_wpnonce', true, false) . '
                
                <table class="wp-list-table widefat fixed striped">
                    <thead>
                        <tr>
                            <th class="check-column"><input type="checkbox" id="select_all"></th>
                            <th>Judul Posting</th>
                            <th>Domain</th>
                            <th>Aksi</th>
                        </tr>
                    </thead>
                    <tbody>';
        
        foreach ($all_posts as $post) {
            echo '<tr>
                <td><input type="checkbox" name="posts_to_delete[]" value="' . $post['blog_id'] . ':' . $post['post_id'] . '"></td>
                <td>' . esc_html($post['title']) . '</td>
                <td>' . esc_html($post['domain']) . '</td>
                <td>
                    <a href="' . esc_url($post['edit_link']) . '" 
                       class="button" 
                       target="_blank">
                        Buka
                    </a>
                </td>
            </tr>';
        }
        
        echo '</tbody>
                </table>
                
                <div style="padding:15px">
                    <button type="submit" 
                            class="button button-danger" 
                            onclick="return confirm(\'Yakin ingin menghapus posting terpilih?\')">
                        Hapus yang Dipilih
                    </button>
                </div>
            </form>
        </div>';
    }

    // Fungsi-fungsi lainnya (generate_seo_data, sync_post_to_subsites, dll)
    // ... [Tetap sama seperti versi sebelumnya dengan penyesuaian terjemahan]

    public function register_api_endpoints() {
        register_rest_route('multisite-sync/v1', '/create-post', [
            'methods' => 'POST',
            'callback' => [$this, 'handle_external_post_create'],
            'permission_callback' => '__return_true'
        ]);
        
        register_rest_route('multisite-sync/v1', '/delete-post', [
            'methods' => 'POST',
            'callback' => [$this, 'handle_external_post_delete'],
            'permission_callback' => '__return_true'
        ]);
    }

    public function handle_external_post_create(WP_REST_Request $request) {
        // Validasi API Key
        $api_key = $request->get_param('api_key');
        $valid_keys = array_column(get_option('multisite_article_sync_options')['external_domains'] ?? [], 'api_key');
        
        if (!in_array($api_key, $valid_keys)) {
            return new WP_Error('unauthorized', 'API Key tidak valid', ['status' => 401]);
        }

        // Proses pembuatan posting
        $post_data = [
            'post_title' => $request['title'],
            'post_content' => $request['content'],
            'post_excerpt' => $request['excerpt'],
            'post_status' => $request['status'],
            'post_type' => 'post'
        ];
        
        $post_id = wp_insert_post($post_data);
        
        // Simpan meta data
        update_post_meta($post_id, '_synced_from_main_site', $request['original_id']);
        update_post_meta($post_id, '_seo_title', $request['seo_title']);
        update_post_meta($post_id, '_seo_description', $request['seo_description']);
        
        // Proses gambar unggulan
        if (!empty($request['featured_image'])) {
            $this->upload_featured_image($request['featured_image'], $post_id);
        }
        
        return ['success' => true, 'post_id' => $post_id];
    }

    private function upload_featured_image($image_url, $post_id) {
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        require_once(ABSPATH . 'wp-admin/includes/file.php');
        require_once(ABSPATH . 'wp-admin/includes/media.php');
        
        $media = media_sideload_image($image_url, $post_id);
        $attachments = get_posts(['post_type' => 'attachment', 'post_parent' => $post_id]);
        
        if (!empty($attachments)) {
            set_post_thumbnail($post_id, $attachments[0]->ID);
        }
    }

    public function handle_external_post_delete(WP_REST_Request $request) {
        // Validasi API Key
        $api_key = $request->get_param('api_key');
        $valid_keys = array_column(get_option('multisite_article_sync_options')['external_domains'] ?? [], 'api_key');
        
        if (!in_array($api_key, $valid_keys)) {
            return new WP_Error('unauthorized', 'API Key tidak valid', ['status' => 401]);
        }

        // Cari dan hapus posting
        $posts = get_posts([
            'meta_key' => '_synced_from_main_site',
            'meta_value' => $request['original_id'],
            'post_type' => 'post',
            'posts_per_page' => 1
        ]);
        
        if (!empty($posts)) {
            wp_delete_post($posts[0]->ID, true);
            return ['success' => true];
        }
        
        return ['success' => false];
    }
}

new MultisiteArticleSync();

Function Calls

None

Variables

None

Stats

MD5 071fbcee7a385667db96058769ed657a
Eval Count 0
Decode Time 65 ms