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 |
Stats
MD5 | 071fbcee7a385667db96058769ed657a |
Eval Count | 0 |
Decode Time | 65 ms |