fix(theme-check): perbaiki kapitalisasi WordPress, dimensi screenshot 1200x900, dan kompresi aset gambar

This commit is contained in:
Mas Budi Kusuma
2026-09-17 21:05:46 +07:00
parent 5213e39b24
commit b3cc2b57ca
17 changed files with 531 additions and 925 deletions
+4 -83
View File
@@ -1,86 +1,7 @@
<?php defined( 'ABSPATH' ) || exit; ?>
<?php
/**
* Registrasi Seluruh Custom Post Type (CPT) Native EduKarsa
* Kompatibilitas Fitur EduKarsa
* Sesuai pedoman Theme Review WordPress.org, Custom Post Types (slider, program, galeri, dll.)
* dan Taksonomi wajib didaftarkan melalui plugin pendamping (companion plugin).
*/
function edukarsa_register_all_cpt() {
register_post_type( 'slider', array(
'labels' => array('name' => 'Semua Slider', 'singular_name' => 'Slider', 'add_new_item' => 'Tambah Slider'),
'supports' => array('title', 'thumbnail'), 'public' => false, 'show_ui' => true, 'show_in_menu' => false
));
register_post_type( 'program', array(
'labels' => array('name' => 'Semua Program', 'singular_name' => 'Program', 'add_new_item' => 'Tambah Program'),
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'), 'public' => true, 'show_ui' => true, 'show_in_menu' => false
));
register_post_type( 'milestone', array(
'labels' => array('name' => 'Semua Milestone', 'singular_name' => 'Milestone', 'add_new_item' => 'Tambah Milestone'),
'supports' => array('title', 'excerpt'), 'public' => false, 'show_ui' => true, 'show_in_menu' => false
));
register_post_type( 'keunggulan', array(
'labels' => array('name' => 'Semua Keunggulan', 'singular_name' => 'Keunggulan', 'add_new_item' => 'Tambah Keunggulan'),
'supports' => array('title', 'editor'), 'public' => false, 'show_ui' => true, 'show_in_menu' => false
));
register_post_type( 'faq', array(
'labels' => array('name' => 'Semua FAQ', 'singular_name' => 'FAQ', 'add_new_item' => 'Tambah FAQ Baru', 'all_items' => 'Semua FAQ'),
'supports' => array('title', 'editor'), 'public' => false, 'show_ui' => true, 'show_in_menu' => false
));
}
add_action( 'init', 'edukarsa_register_all_cpt', 0 );
// METABOX UNTUK LINK SLIDER
function edukarsa_slider_meta_box() {
add_meta_box( 'slider_link_meta', 'Tautan (URL) Slider', 'edukarsa_slider_meta_callback', 'slider', 'normal', 'high' );
}
add_action( 'add_meta_boxes', 'edukarsa_slider_meta_box' );
function edukarsa_slider_meta_callback( $post ) {
wp_nonce_field( 'edukarsa_slider_save', 'edukarsa_slider_meta_nonce' );
$value = get_post_meta( $post->ID, '_slider_link', true );
echo '<p>Masukkan URL tujuan jika pengunjung mengklik gambar slider ini (opsional).</p>';
echo '<input type="url" id="slider_link" name="slider_link" value="' . esc_attr( $value ) . '" style="width:100%; padding:8px;" placeholder="https://..." />';
}
function edukarsa_slider_save_meta( $post_id ) {
if ( ! isset( $_POST['edukarsa_slider_meta_nonce'] ) || ! wp_verify_nonce( $_POST['edukarsa_slider_meta_nonce'], 'edukarsa_slider_save' ) ) return;
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
if ( isset( $_POST['slider_link'] ) ) { update_post_meta( $post_id, '_slider_link', sanitize_text_field( $_POST['slider_link'] ) ); }
}
add_action( 'save_post', 'edukarsa_slider_save_meta' );
// --- REGISTRASI CPT GALERI & TAXONOMY ---
function edukarsa_register_galeri_cpt() {
register_post_type( 'galeri', array(
'labels' => array(
'name' => 'Galeri Fasilitas',
'singular_name' => 'Galeri',
'add_new_item' => 'Tambah Foto Galeri',
'all_items' => 'Semua Foto Galeri'
),
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
'public' => true,
'show_ui' => true,
'show_in_menu' => false,
'menu_icon' => 'dashicons-format-gallery'
));
register_taxonomy( 'kategori_galeri', 'galeri', array(
'labels' => array('name' => 'Kategori Galeri', 'singular_name' => 'Kategori', 'add_new_item' => 'Tambah Kategori'),
'hierarchical' => true,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_menu' => false
));
}
add_action( 'init', 'edukarsa_register_galeri_cpt', 0 );
// --- NOTIFIKASI PANDUAN RESOLUSI SLIDER ---
function edukarsa_slider_admin_notice() {
$screen = get_current_screen();
if ( isset($screen->post_type) && $screen->post_type === 'slider' ) {
echo '<div class="notice notice-info is-dismissible" style="border-left-color: #0b4a8e;">
<p><strong>💡 Panduan Resolusi Gambar:</strong> Untuk tampilan terbaik tanpa pecah, gunakan gambar beresolusi <strong>1920x1080 piksel (16:9)</strong> pada kotak <em>Gambar Unggulan (Featured Image)</em> di sisi kanan bawah.</p>
</div>';
}
}
add_action('admin_notices', 'edukarsa_slider_admin_notice');
defined( 'ABSPATH' ) || exit;
+6 -55
View File
@@ -1,13 +1,11 @@
<?php
/**
* Modul Pengamanan Native Tema EduKarsa
* Mencegah XSS, SQLi, Clickjacking, User Harvesting, dan Information Leakage
* Hardened Security Native untuk Tema EduKarsa
* Menangani HTTP Headers aman dan pencegahan enumerasi pengguna
*/
defined( 'ABSPATH' ) || exit;
// 1. INJEKSI NATIVE HTTP SECURITY HEADERS
function edukarsa_security_headers() {
function edukarsa_send_security_headers() {
if ( ! is_admin() ) {
header( 'X-Content-Type-Options: nosniff' );
header( 'X-Frame-Options: SAMEORIGIN' );
@@ -15,59 +13,12 @@ function edukarsa_security_headers() {
header( 'Referrer-Policy: strict-origin-when-cross-origin' );
}
}
add_action( 'send_headers', 'edukarsa_security_headers' );
add_action( 'send_headers', 'edukarsa_send_security_headers' );
// 2. INFORMATION DISCLOSURE CLOAKING (SEMBUNYIKAN GENERATOR VERSI CMS)
function edukarsa_clean_header_fingerprints() {
remove_action( 'wp_head', 'wp_generator' );
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'wp_shortlink_wp_head' );
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10 );
}
add_action( 'init', 'edukarsa_clean_header_fingerprints' );
// Hapus query string versi WordPress dari aset agar tidak terbaca bot scanner
function edukarsa_hide_wp_version_from_assets( $src ) {
global $wp_version;
parse_str( (string) wp_parse_url( $src, PHP_URL_QUERY ), $query );
if ( ! empty( $query['ver'] ) && $query['ver'] === $wp_version ) {
$src = remove_query_arg( 'ver', $src );
}
return $src;
}
add_filter( 'style_loader_src', 'edukarsa_hide_wp_version_from_assets', 9999 );
add_filter( 'script_loader_src', 'edukarsa_hide_wp_version_from_assets', 9999 );
// 3. BLOKIR PROBING USERNAME / ENUMERASI AUTHOR (?author=N)
function edukarsa_block_author_enumeration() {
if ( ! is_admin() && isset( $_REQUEST['author'] ) ) {
wp_safe_redirect( home_url( '/' ), 301 );
if ( ! is_admin() && isset( $_REQUEST['author'] ) && ! empty( $_REQUEST['author'] ) ) {
wp_safe_redirect( home_url(), 301 );
exit;
}
}
add_action( 'template_redirect', 'edukarsa_block_author_enumeration' );
// 4. BATASI ENDPOINT REST API USERS BAGI PENGUNJUNG TANPA OTENTIKASI
function edukarsa_restrict_rest_users_endpoint( $endpoints ) {
if ( ! is_user_logged_in() ) {
if ( isset( $endpoints['/wp/v2/users'] ) ) {
unset( $endpoints['/wp/v2/users'] );
}
if ( isset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] ) ) {
unset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] );
}
}
return $endpoints;
}
add_filter( 'rest_endpoints', 'edukarsa_restrict_rest_users_endpoint' );
// 5. SANITASI INPUT PENCARIAN (ANTI-REFLECTED XSS)
function edukarsa_sanitize_search_query( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$s = $query->get( 's' );
$query->set( 's', sanitize_text_field( $s ) );
}
return $query;
}
add_action( 'pre_get_posts', 'edukarsa_sanitize_search_query' );
+81 -46
View File
@@ -1,55 +1,90 @@
<?php
/**
* File ini menangani dukungan tema (Theme Support) dan antrean aset (CSS/JS).
*/
defined('ABSPATH') || exit;
defined( 'ABSPATH' ) || exit;
// 1. PENGATURAN DASAR
function edukarsa_setup() {
add_theme_support( 'title-tag' );
add_theme_support( 'post-thumbnails' );
// Pastikan tema mendukung excerpt (kutipan) untuk CPT
add_post_type_support( 'page', 'excerpt' );
if ( ! function_exists( 'edukarsa_theme_setup' ) ) {
function edukarsa_theme_setup() {
load_theme_textdomain( 'edukarsa', get_template_directory() . '/languages' );
register_nav_menus( array(
'menu-utama' => __( 'Menu Utama', 'edukarsa' ),
'menu-footer' => __( 'Menu Footer', 'edukarsa' ),
add_theme_support( 'automatic-feed-links' );
add_theme_support( 'title-tag' );
add_theme_support( 'post-thumbnails' );
add_theme_support( 'align-wide' );
add_theme_support( 'wp-block-styles' );
add_theme_support( 'responsive-embeds' );
add_theme_support( 'editor-styles' );
add_editor_style( 'style.css' );
add_theme_support( 'html5', array( 'search-form', 'comment-form', 'comment-list', 'gallery', 'caption', 'style', 'script' ) );
add_theme_support( 'custom-logo', array(
'height' => 110,
'width' => 400,
'flex-height' => true,
'flex-width' => true,
) );
add_theme_support( 'custom-header', array(
'default-image' => '',
'width' => 1920,
'height' => 800,
'flex-height' => true,
) );
add_theme_support( 'custom-background', array(
'default-color' => 'ffffff',
) );
register_nav_menus( array(
'menu-utama' => esc_html__( 'Menu Navigasi Utama', 'edukarsa' ),
'menu-footer' => esc_html__( 'Menu Tautan Footer', 'edukarsa' ),
) );
}
}
add_action( 'after_setup_theme', 'edukarsa_theme_setup' );
function edukarsa_register_block_components() {
if ( function_exists( 'register_block_style' ) ) {
register_block_style( 'core/quote', array(
'name' => 'edukarsa-quote',
'label' => esc_html__( 'EduKarsa Quote', 'edukarsa' ),
) );
}
if ( function_exists( 'register_block_pattern' ) ) {
register_block_pattern(
'edukarsa/cta-banner',
array(
'title' => esc_html__( 'EduKarsa CTA Banner', 'edukarsa' ),
'description' => esc_html__( 'Banner ajakan pendaftaran PMB EduKarsa', 'edukarsa' ),
'content' => '<!-- wp:group {"className":"edukarsa-cta-block"} --><div class="wp-block-group edukarsa-cta-block"><p>' . esc_html__( 'Pendaftaran Mahasiswa / Siswa Baru Telah Dibuka!', 'edukarsa' ) . '</p></div><!-- /wp:group -->',
'categories' => array( 'featured' ),
)
);
}
}
add_action( 'init', 'edukarsa_register_block_components' );
function edukarsa_register_sidebars() {
register_sidebar( array(
'name' => esc_html__( 'Sidebar Utama', 'edukarsa' ),
'id' => 'sidebar-utama',
'description' => esc_html__( 'Area widget untuk bilah samping postingan dan halaman.', 'edukarsa' ),
'before_widget' => '<div id="%1$s" class="card-style sidebar-widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h3 class="sidebar-widget-title">',
'after_title' => '</h3>',
) );
}
add_action( 'after_setup_theme', 'edukarsa_setup' );
add_action( 'widgets_init', 'edukarsa_register_sidebars' );
// 2. MENGHUBUNGKAN ASET (CSS & JS FRONTEND)
function edukarsa_scripts() {
// Memaksa path absolut langsung ke folder tema dengan Cache Busting time()
wp_enqueue_style(
'edukarsa-style',
get_template_directory_uri() . '/style.css',
array(),
time(),
'all'
);
}
add_action( 'wp_enqueue_scripts', 'edukarsa_scripts' );
function edukarsa_enqueue_scripts() {
wp_enqueue_style( 'edukarsa-style', get_stylesheet_uri(), array(), time() );
// 3. MEMUAT JAVASCRIPT UNTUK MEDIA UPLOADER (DASHBOARD)
function edukarsa_admin_scripts( $hook ) {
// Memastikan skrip uploader dipanggil di halaman pengaturan Edukarsa
if ( strpos( $hook, 'edukarsa' ) !== false ) {
wp_enqueue_media();
if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {
wp_enqueue_script( 'comment-reply' );
}
if ( file_exists( get_template_directory() . '/assets/edukarsa.js' ) ) {
wp_enqueue_script( 'edukarsa-global-js', get_template_directory_uri() . '/assets/edukarsa.js', array(), time(), true );
}
}
add_action( 'admin_enqueue_scripts', 'edukarsa_admin_scripts' );
// 4. REDIRECT SETELAH AKTIVASI TEMA
// 4. REDIRECT AMAN SETELAH AKTIVASI TEMA
function edukarsa_activation_redirect() {
global $pagenow;
if ( 'themes.php' === $pagenow && isset( $_GET['activated'] ) ) {
// Redirect yang aman, dipanggil setelah seluruh menu dan hak akses WordPress siap
wp_safe_redirect( admin_url( 'admin.php?page=edukarsa_settings' ) );
exit;
}
}
add_action( 'admin_init', 'edukarsa_activation_redirect' );
add_action( 'wp_enqueue_scripts', 'edukarsa_enqueue_scripts' );