DevSkyy WordPress Theme Development
Expert knowledge in building custom WordPress themes, template hierarchy, hooks, filters, and WordPress.com compatibility. Triggers on keywords like "wordpress theme", "template", "wp_", "get_template_part", "theme.json", "block theme", "functions.php".
install
source · Clone the upstream repo
git clone https://github.com/The-Skyy-Rose-Collection-LLC/DevSkyy
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/The-Skyy-Rose-Collection-LLC/DevSkyy "$T" && mkdir -p ~/.claude/skills && cp -r "$T/wordpress-copilot/skills/theme-development" ~/.claude/skills/the-skyy-rose-collection-llc-devskyy-wordpress-theme-development && rm -rf "$T"
manifest:
wordpress-copilot/skills/theme-development/SKILL.mdsource content
WordPress Theme Development
Build modern, performant WordPress themes with proper structure, hooks, and WordPress.com compatibility for SkyyRose.
When to Use This Skill
Activate when working on:
- Custom WordPress theme development
- Template hierarchy and structure
- functions.php and theme setup
- WordPress hooks and filters
- Custom post types and taxonomies
- Theme customization API
- WordPress.com specific requirements
- Block themes (Full Site Editing)
Theme Structure
Modern WordPress Theme
skyyrose-2025/ ├── style.css # Theme header (required) ├── functions.php # Theme setup ├── index.php # Fallback template ├── screenshot.png # Theme preview (1200x900px) │ ├── header.php # Site header ├── footer.php # Site footer ├── sidebar.php # Sidebar │ ├── template-parts/ # Reusable template parts │ ├── content.php │ ├── content-single.php │ └── navigation.php │ ├── templates/ # Page templates │ ├── template-collection.php # Immersive collections │ └── template-home.php │ ├── inc/ # Theme includes │ ├── setup.php # Theme setup and registration │ ├── enqueue.php # Scripts and styles │ ├── custom-post-types.php # CPT registration │ ├── customizer.php # Customizer options │ └── security-hardening.php # Security headers │ ├── assets/ # Theme assets │ ├── css/ │ ├── js/ │ └── images/ │ ├── elementor-widgets/ # Custom Elementor widgets │ ├── product-3d-viewer.php │ └── collection-grid.php │ ├── woocommerce/ # WooCommerce template overrides │ ├── archive-product.php │ └── single-product.php │ └── languages/ # Translation files └── skyyrose.pot
style.css Header (Required)
/* Theme Name: SkyyRose 2025 Theme URI: https://skyyrose.co Author: SkyyRose LLC Author URI: https://skyyrose.co Description: Luxury fashion e-commerce theme with immersive 3D experiences Version: 1.0.0 Requires at least: 6.0 Tested up to: 6.4 Requires PHP: 8.0 License: Proprietary License URI: https://skyyrose.co/license Text Domain: skyyrose Tags: e-commerce, luxury, fashion, jewelry, woocommerce, elementor, 3d */
functions.php Setup
Theme Setup
<?php /** * SkyyRose 2025 Theme Functions * * @package SkyyRose_2025 */ // Prevent direct access if (!defined('ABSPATH')) { exit; } // Theme constants define('SKYYROSE_VERSION', '1.0.0'); define('SKYYROSE_THEME_DIR', get_template_directory()); define('SKYYROSE_THEME_URI', get_template_directory_uri()); // Load theme files require_once SKYYROSE_THEME_DIR . '/inc/setup.php'; require_once SKYYROSE_THEME_DIR . '/inc/enqueue.php'; require_once SKYYROSE_THEME_DIR . '/inc/customizer.php'; require_once SKYYROSE_THEME_DIR . '/inc/security-hardening.php'; // WooCommerce support if (class_exists('WooCommerce')) { require_once SKYYROSE_THEME_DIR . '/inc/woocommerce.php'; } // Elementor support if (did_action('elementor/loaded')) { require_once SKYYROSE_THEME_DIR . '/inc/elementor.php'; }
inc/setup.php
<?php /** * Theme setup and registration */ add_action('after_setup_theme', 'skyyrose_theme_setup'); function skyyrose_theme_setup() { // Translation support load_theme_textdomain('skyyrose', SKYYROSE_THEME_DIR . '/languages'); // Add theme support add_theme_support('title-tag'); add_theme_support('post-thumbnails'); add_theme_support('automatic-feed-links'); add_theme_support('html5', [ 'search-form', 'comment-form', 'comment-list', 'gallery', 'caption', 'style', 'script' ]); // Custom logo add_theme_support('custom-logo', [ 'height' => 100, 'width' => 400, 'flex-height' => true, 'flex-width' => true, ]); // WooCommerce support add_theme_support('woocommerce'); add_theme_support('wc-product-gallery-zoom'); add_theme_support('wc-product-gallery-lightbox'); add_theme_support('wc-product-gallery-slider'); // Custom image sizes add_image_size('skyyrose-hero', 1920, 1080, true); add_image_size('skyyrose-product', 800, 800, true); add_image_size('skyyrose-thumbnail', 400, 400, true); // Register navigation menus register_nav_menus([ 'primary' => esc_html__('Primary Menu', 'skyyrose'), 'footer' => esc_html__('Footer Menu', 'skyyrose'), ]); // Add editor styles add_editor_style('assets/css/editor-style.css'); // Enable Block Editor features add_theme_support('align-wide'); add_theme_support('responsive-embeds'); add_theme_support('editor-styles'); } // Register widget areas add_action('widgets_init', 'skyyrose_widgets_init'); function skyyrose_widgets_init() { register_sidebar([ 'name' => esc_html__('Shop Sidebar', 'skyyrose'), 'id' => 'shop-sidebar', 'description' => esc_html__('Appears on shop pages', 'skyyrose'), 'before_widget' => '<section id="%1$s" class="widget %2$s">', 'after_widget' => '</section>', 'before_title' => '<h3 class="widget-title">', 'after_title' => '</h3>', ]); register_sidebar([ 'name' => esc_html__('Footer Area', 'skyyrose'), 'id' => 'footer-sidebar', 'description' => esc_html__('Appears in the footer', 'skyyrose'), 'before_widget' => '<div class="footer-widget">', 'after_widget' => '</div>', 'before_title' => '<h4>', 'after_title' => '</h4>', ]); }
inc/enqueue.php
<?php /** * Enqueue scripts and styles */ add_action('wp_enqueue_scripts', 'skyyrose_enqueue_assets'); function skyyrose_enqueue_assets() { // Main stylesheet wp_enqueue_style( 'skyyrose-style', SKYYROSE_THEME_URI . '/style.css', [], SKYYROSE_VERSION ); // Custom styles wp_enqueue_style( 'skyyrose-custom', SKYYROSE_THEME_URI . '/assets/css/custom.css', ['skyyrose-style'], SKYYROSE_VERSION ); // Google Fonts wp_enqueue_style( 'skyyrose-fonts', 'https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;600&display=swap', [], null ); // Main JavaScript wp_enqueue_script( 'skyyrose-main', SKYYROSE_THEME_URI . '/assets/js/main.js', ['jquery'], SKYYROSE_VERSION, true ); // Localize script wp_localize_script('skyyrose-main', 'skyyrose', [ 'ajaxurl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('skyyrose-nonce'), 'siteUrl' => get_site_url(), 'brand' => [ 'primaryColor' => '#B76E79', 'tagline' => __('Where Love Meets Luxury', 'skyyrose'), ], ]); // Three.js for 3D viewers (only on product pages) if (is_product()) { wp_enqueue_script( 'threejs', 'https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.min.js', [], '0.160.0', true ); wp_enqueue_script( 'skyyrose-3d-viewer', SKYYROSE_THEME_URI . '/assets/js/3d-viewer.js', ['threejs'], SKYYROSE_VERSION, true ); } // Comments if (is_singular() && comments_open() && get_option('thread_comments')) { wp_enqueue_script('comment-reply'); } }
Template Hierarchy
homepage (index.php fallback)
<?php /** * The main template file */ get_header(); ?> <main id="main" class="site-main" role="main"> <?php if (have_posts()) : ?> <div class="posts-grid"> <?php while (have_posts()) : the_post(); ?> <?php get_template_part('template-parts/content', get_post_type()); ?> <?php endwhile; ?> </div> <?php the_posts_navigation(); ?> <?php else : ?> <?php get_template_part('template-parts/content', 'none'); ?> <?php endif; ?> </main> <?php get_sidebar(); get_footer();
Custom Page Template
<?php /** * Template Name: Immersive Collection * * @package SkyyRose_2025 */ get_header(); ?> <div class="immersive-collection" data-collection="<?php echo esc_attr(get_field('collection_name')); ?>"> <!-- 3D Canvas --> <canvas id="collection-3d-scene"></canvas> <!-- Collection Navigation --> <nav class="collection-nav"> <button class="nav-prev" aria-label="Previous room">←</button> <button class="nav-next" aria-label="Next room">→</button> </nav> <!-- Product Hotspots --> <div class="product-hotspots"> <?php $products = get_field('featured_products'); if ($products) : foreach ($products as $product) : ?> <div class="hotspot" data-product-id="<?php echo esc_attr($product->ID); ?>"> <button class="hotspot-trigger"> <span class="pulse"></span> <span class="sr-only"><?php echo esc_html($product->post_title); ?></span> </button> </div> <?php endforeach; endif; ?> </div> <!-- Product Quick View Modal --> <div id="product-quick-view" class="modal" aria-hidden="true"> <div class="modal-content"> <!-- Populated via AJAX --> </div> </div> </div> <script> // Initialize 3D scene document.addEventListener('DOMContentLoaded', () => { const collection = document.querySelector('.immersive-collection').dataset.collection; initCollectionScene(collection); }); </script> <?php get_footer(); ?>
WordPress Hooks
Common Action Hooks
// Header hooks add_action('wp_head', 'skyyrose_custom_head', 10); add_action('wp_enqueue_scripts', 'skyyrose_enqueue_assets', 10); // Content hooks add_action('before_post', 'skyyrose_before_post', 10); add_action('after_post', 'skyyrose_after_post', 10); // Footer hooks add_action('wp_footer', 'skyyrose_custom_footer', 10); // WooCommerce hooks add_action('woocommerce_before_main_content', 'skyyrose_woo_wrapper_start', 10); add_action('woocommerce_after_main_content', 'skyyrose_woo_wrapper_end', 10); add_action('woocommerce_before_shop_loop_item_title', 'skyyrose_product_badge', 15);
Common Filter Hooks
// Excerpt length add_filter('excerpt_length', 'skyyrose_excerpt_length', 10); function skyyrose_excerpt_length($length) { return 30; } // Excerpt more add_filter('excerpt_more', 'skyyrose_excerpt_more', 10); function skyyrose_excerpt_more($more) { return '...'; } // Body class add_filter('body_class', 'skyyrose_body_classes', 10); function skyyrose_body_classes($classes) { if (is_shop() || is_product()) { $classes[] = 'woocommerce-page'; } if (has_post_thumbnail()) { $classes[] = 'has-featured-image'; } return $classes; } // WooCommerce product class add_filter('woocommerce_post_class', 'skyyrose_product_class', 10, 2); function skyyrose_product_class($classes, $product) { $collection = get_post_meta($product->get_id(), '_skyyrose_collection', true); if ($collection) { $classes[] = 'collection-' . sanitize_html_class($collection); } return $classes; }
WordPress.com Compatibility
Critical Differences
/** * WordPress.com specific adjustments */ // Check if running on WordPress.com function skyyrose_is_wpcom() { return defined('IS_WPCOM') && IS_WPCOM; } // Adjust REST API endpoints function skyyrose_rest_url($endpoint) { if (skyyrose_is_wpcom()) { // WordPress.com uses index.php?rest_route= return home_url('/index.php?rest_route=' . $endpoint); } return rest_url($endpoint); } // WordPress.com Content Security Policy if (skyyrose_is_wpcom()) { // Use platform-level CSP // Don't try to override headers (won't work) // Ensure all resources in whitelist are HTTPS } // No FTP/SSH access on WordPress.com // All deployments via admin UI // Use WordPress.com Batcache (5-10 min TTL)
WordPress.com REST API
// WordPress.com REST API pattern const wpcomRestUrl = 'https://skyyrose.co/index.php?rest_route=/wp/v2/posts'; // NOT: https://skyyrose.co/wp-json/wp/v2/posts
Custom Post Types
/** * Register Collections CPT */ add_action('init', 'skyyrose_register_collections_cpt'); function skyyrose_register_collections_cpt() { $labels = [ 'name' => _x('Collections', 'post type general name', 'skyyrose'), 'singular_name' => _x('Collection', 'post type singular name', 'skyyrose'), 'menu_name' => _x('Collections', 'admin menu', 'skyyrose'), 'add_new' => _x('Add New', 'collection', 'skyyrose'), 'add_new_item' => __('Add New Collection', 'skyyrose'), 'edit_item' => __('Edit Collection', 'skyyrose'), 'new_item' => __('New Collection', 'skyyrose'), 'view_item' => __('View Collection', 'skyyrose'), 'search_items' => __('Search Collections', 'skyyrose'), 'not_found' => __('No collections found.', 'skyyrose'), 'not_found_in_trash' => __('No collections found in Trash.', 'skyyrose'), ]; $args = [ 'labels' => $labels, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => ['slug' => 'collection'], 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => 5, 'menu_icon' => 'dashicons-portfolio', 'supports' => ['title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'], 'show_in_rest' => true, // Block Editor support ]; register_post_type('collection', $args); }
Theme Customizer
/** * Customizer settings */ add_action('customize_register', 'skyyrose_customize_register'); function skyyrose_customize_register($wp_customize) { // Brand section $wp_customize->add_section('skyyrose_brand', [ 'title' => __('SkyyRose Branding', 'skyyrose'), 'priority' => 30, ]); // Primary color $wp_customize->add_setting('skyyrose_primary_color', [ 'default' => '#B76E79', 'sanitize_callback' => 'sanitize_hex_color', 'transport' => 'postMessage', ]); $wp_customize->add_control(new WP_Customize_Color_Control($wp_customize, 'skyyrose_primary_color', [ 'label' => __('Primary Color', 'skyyrose'), 'section' => 'skyyrose_brand', 'settings' => 'skyyrose_primary_color', ])); // Tagline $wp_customize->add_setting('skyyrose_tagline', [ 'default' => 'Where Love Meets Luxury', 'sanitize_callback' => 'sanitize_text_field', ]); $wp_customize->add_control('skyyrose_tagline', [ 'label' => __('Brand Tagline', 'skyyrose'), 'section' => 'skyyrose_brand', 'type' => 'text', ]); // Enable 3D viewers $wp_customize->add_setting('skyyrose_enable_3d', [ 'default' => true, 'sanitize_callback' => 'rest_sanitize_boolean', ]); $wp_customize->add_control('skyyrose_enable_3d', [ 'label' => __('Enable 3D Product Viewers', 'skyyrose'), 'section' => 'skyyrose_brand', 'type' => 'checkbox', ]); }
Security Best Practices
/** * Security hardening */ // Escape output echo esc_html($text); echo esc_attr($attribute); echo esc_url($url); echo wp_kses_post($html); // Sanitize input $clean = sanitize_text_field($_POST['field']); $clean_html = wp_kses_post($_POST['content']); $clean_url = esc_url_raw($_POST['url']); // Verify nonces if (!wp_verify_nonce($_POST['nonce'], 'skyyrose-action')) { wp_die('Security check failed'); } // Check capabilities if (!current_user_can('edit_posts')) { wp_die('Insufficient permissions'); } // Prepare SQL $wpdb->prepare( "SELECT * FROM {$wpdb->posts} WHERE post_title = %s", $title );
References
See
references/ for:
- Complete template hierarchytemplate-hierarchy-guide.md
- Common hooks and filtershooks-filters-reference.md
- WordPress.com specific requirementswpcom-compatibility.md
- Theme security best practicessecurity-checklist.md
Examples
See
examples/ for:
- CPT registrationcustom-post-type.php
- Customizer implementationcustomizer-settings.php
- Immersive page templatepage-template-immersive.php
- WooCommerce template overrideswoocommerce-overrides/