<?php /** * Perlen Blocks functions and definitions * * @package Perlen_Blocks * @version 1.0.0 */ declare(strict_types=1); if (!defined('ABSPATH')) { exit; } /** * Sets up theme defaults and registers support for various WordPress features. */ function perlen_blocks_setup(): void { load_theme_textdomain('perlen-blocks', get_template_directory() . '/languages'); add_theme_support('automatic-feed-links'); add_theme_support('title-tag'); add_theme_support('post-thumbnails'); add_theme_support('custom-logo'); add_theme_support('custom-header'); add_theme_support('html5', [ 'search-form', 'comment-form', 'comment-list', 'gallery', 'caption', 'style', 'script', ]); // Full Site Editing add_theme_support('block-templates'); // Wide alignments add_theme_support('align-wide'); // Editor styles add_theme_support('editor-styles'); // Responsive embeds add_theme_support('responsive-embeds'); } add_action('after_setup_theme', 'perlen_blocks_setup'); /** * Register block patterns and pattern categories. */ function perlen_blocks_register_block_patterns(): void { register_block_pattern_category('perlen-blocks', [ 'label' => __('Perlen Blocks', 'perlen-blocks'), ]); // Hero section pattern register_block_pattern('perlen-blocks/hero-section', [ 'title' => __('Hero Section', 'perlen-blocks'), 'description' => __('Full-width hero banner with image and CTA', 'perlen-blocks'), 'categories' => ['perlen-blocks', 'featured'], 'content' => perlen_blocks_get_pattern_hero(), ]); // Product grid pattern register_block_pattern('perlen-blocks/product-grid', [ 'title' => __('Product Grid', 'perlen-blocks'), 'description' => __('5-column product grid', 'perlen-blocks'), 'categories' => ['perlen-blocks'], 'content' => perlen_blocks_get_pattern_product_grid(), ]); // Category grid pattern register_block_pattern('perlen-blocks/category-grid', [ 'title' => __('Category Grid', 'perlen-blocks'), 'description' => __('Circular category cards grid', 'perlen-blocks'), 'categories' => ['perlen-blocks'], 'content' => perlen_blocks_get_pattern_category_grid(), ]); // Newsletter section pattern register_block_pattern('perlen-blocks/newsletter', [ 'title' => __('Newsletter Section', 'perlen-blocks'), 'description' => __('Newsletter signup with purple gradient background', 'perlen-blocks'), 'categories' => ['perlen-blocks'], 'content' => perlen_blocks_get_pattern_newsletter(), ]); // Trust bar pattern register_block_pattern('perlen-blocks/trust-bar', [ 'title' => __('Trust Bar', 'perlen-blocks'), 'description' => __('Feature icons trust bar', 'perlen-blocks'), 'categories' => ['perlen-blocks'], 'content' => perlen_blocks_get_pattern_trust_bar(), ]); // Full Page pattern register_block_pattern('perlen-blocks/full-page', [ 'title' => __('Full Page', 'perlen-blocks'), 'description' => __('Full-width page without sidebar', 'perlen-blocks'), 'categories' => ['perlen-blocks'], 'content' => perlen_blocks_get_pattern_full_page(), ]); // Sidebar + Content layout register_block_pattern('perlen-blocks/sidebar-layout', [ 'title' => __('Sidebar Layout', 'perlen-blocks'), 'description' => __('Sidebar navigation with content area', 'perlen-blocks'), 'categories' => ['perlen-blocks'], 'content' => perlen_blocks_get_pattern_sidebar_layout(), ]); } add_action('init', 'perlen_blocks_register_block_patterns'); /** * Enqueue block editor assets. */ function perlen_blocks_enqueue_editor_assets(): void { wp_enqueue_style( 'perlen-blocks-editor', get_template_directory_uri() . '/style.css', [], wp_get_theme()->get('Version') ); } add_action('enqueue_block_editor_assets', 'perlen_blocks_enqueue_editor_assets'); /** * Enqueue frontend assets. */ function perlen_blocks_enqueue_frontend_assets(): void { wp_enqueue_style( 'perlen-blocks-style', get_template_directory_uri() . '/style.css', [], wp_get_theme()->get('Version') ); } add_action('wp_enqueue_scripts', 'perlen_blocks_enqueue_frontend_assets'); /* ============================================================ 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'); /** * Remove default WooCommerce wrappers. */ remove_action('woocommerce_before_main_content', 'woocommerce_output_content_wrapper', 10); remove_action('woocommerce_after_main_content', 'woocommerce_output_content_wrapper_end', 10); /** * Custom WooCommerce content wrapper start. */ function perlen_blocks_woocommerce_content_wrapper_start(): void { echo '<div class="woocommerce-content">'; } add_action('woocommerce_before_main_content', 'perlen_blocks_woocommerce_content_wrapper_start', 10); /** * Custom WooCommerce content wrapper end. */ function perlen_blocks_woocommerce_content_wrapper_end(): void { echo '</div>'; } add_action('woocommerce_after_main_content', 'perlen_blocks_woocommerce_content_wrapper_end', 10); /** * Register WooCommerce-specific widget areas. */ function perlen_blocks_widgets_init(): void { register_sidebar([ 'name' => __('Shop Sidebar', 'perlen-blocks'), 'id' => 'shop-sidebar', 'description' => __('Widgets for the shop sidebar', 'perlen-blocks'), 'before_widget' => '<div id="%1$s" class="widget %2$s">', 'after_widget' => '</div>', 'before_title' => '<h3 class="widget-title">', 'after_title' => '</h3>', ]); } add_action('widgets_init', 'perlen_blocks_widgets_init'); /* ============================================================ Block Pattern HTML Helpers ============================================================ */ function perlen_blocks_get_pattern_hero(): string { return '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|xl","bottom":"var:preset|spacing|xl"}}},"backgroundColor":"surface","layout":{"type":"constrained"}} --> <div class="wp-block-group alignfull has-surface-background-color has-background" style="padding-top:var(--wp--preset--spacing--xl);padding-bottom:var(--wp--preset--spacing--xl)"> <!-- wp:columns {"align":"wide","style":{"spacing":{"padding":{"top":"0","bottom":"0","left":"0","right":"0"}}}} --> <div class="wp-block-columns alignwide" style="padding-top:0;padding-right:0;padding-bottom:0;padding-left:0"> <!-- wp:column {"width":"50%"} --> <div class="wp-block-column" style="flex-basis:50%"> <!-- wp:heading {"level":1,"style":{"typography":{"fontSize":"2.5rem"}}} --> <h1 class="wp-block-heading" style="font-size:2.5rem">' . esc_html__('Perlen & Schmuckzubehör', 'perlen-blocks') . '</h1> <!-- /wp:heading --> <!-- wp:paragraph {"style":{"color":{"text":"#6B5B7A"}}} --> <p style="color:#6B5B7A;font-size:1.25rem">' . esc_html__('Qualität zu unschlagbaren Preisen – Preciosa Kristallperlen, Toho-Saatperlen, Miyuki-Perlen und vieles mehr.', 'perlen-blocks') . '</p> <!-- /wp:paragraph --> <!-- wp:buttons {"style":{"spacing":{"margin":{"top":"var:preset|spacing|md"}}}} --> <div class="wp-block-buttons" style="margin-top:var(--wp--preset--spacing--md)"> <!-- wp:button --> <div class="wp-block-button"><a class="wp-block-button__link wp-element-button">' . esc_html__('Jetzt einkaufen', 'perlen-blocks') . '</a></div> <!-- /wp:button --> <!-- wp:button {"className":"is-style-outline"} --> <div class="wp-block-button is-style-outline"><a class="wp-block-button__link wp-element-button">' . esc_html__('Mehr erfahren', 'perlen-blocks') . '</a></div> <!-- /wp:button --> </div> <!-- /wp:buttons --> </div> <!-- /wp:column --> <!-- wp:column {"width":"50%"} --> <div class="wp-block-column" style="flex-basis:50%"> <!-- wp:image {"sizeSlug":"large","linkDestination":"none"} --> <figure class="wp-block-image size-large"><img src="' . esc_url(get_template_directory_uri()) . '/assets/images/hero-placeholder.jpg" alt="' . esc_attr__('Hero image', 'perlen-blocks') . '"/></figure> <!-- /wp:image --> </div> <!-- /wp:column --> </div> <!-- /wp:columns --> </div> <!-- /wp:group -->'; } function perlen_blocks_get_pattern_product_grid(): string { return '<!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"var:preset|spacing|xl","bottom":"var:preset|spacing|xl"}}},"layout":{"type":"constrained"}} --> <div class="wp-block-group alignwide" style="padding-top:var(--wp--preset--spacing--xl);padding-bottom:var(--wp--preset--spacing--xl)"> <!-- wp:heading {"textAlign":"center","style":{"spacing":{"margin":{"bottom":"var:preset|spacing|lg"}}}} --> <h2 class="wp-block-heading has-text-align-center" style="margin-bottom:var(--wp--preset--spacing--lg)">' . esc_html__('Neue Produkte', 'perlen-blocks') . '</h2> <!-- /wp:heading --> <!-- wp:woocommerce/product-new {"columns":5} /--> </div> <!-- /wp:group -->'; } function perlen_blocks_get_pattern_category_grid(): string { return '<!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"var:preset|spacing|xl","bottom":"var--preset|spacing|xl"}}},"backgroundColor":"muted","layout":{"type":"constrained"}} --> <div class="wp-block-group alignwide has-muted-background-color has-background" style="padding-top:var(--wp--preset--spacing--xl);padding-bottom:var(--wp--preset--spacing--xl)"> <!-- wp:heading {"textAlign":"center","style":{"spacing":{"margin":{"bottom":"var:preset|spacing|lg"}}}} --> <h2 class="wp-block-heading has-text-align-center" style="margin-bottom:var(--wp--preset--spacing--lg)">' . esc_html__('Kategorien', 'perlen-blocks') . '</h2> <!-- /wp:heading --> <!-- wp:columns {"align":"wide"} --> <div class="wp-block-columns alignwide"> <!-- wp:column --> <div class="wp-block-column"> <!-- wp:group {"className":"category-card","layout":{"type":"flex","orientation":"vertical","justifyContent":"center"}} --> <div class="wp-block-group category-card"> <!-- wp:image {"width":"120px","height":"120px","sizeSlug":"thumbnail","className":"category-card__circle"} --> <figure class="wp-block-image size-thumbnail is-resized category-card__circle"><img src="' . esc_url(get_template_directory_uri()) . '/assets/images/cat-kristall.jpg" alt="' . esc_attr__('Kristall', 'perlen-blocks') . '" style="width:120px;height:120px"/></figure> <!-- /wp:image --> <!-- wp:paragraph {"style":{"typography":{"fontWeight":"600"}}} --> <p class="" style="font-weight:600">' . esc_html__('Kristall', 'perlen-blocks') . '</p> <!-- /wp:paragraph --> </div> <!-- /wp:group --> </div> <!-- /wp:column --> <!-- wp:column --> <div class="wp-block-column"> <!-- wp:group {"className":"category-card","layout":{"type":"flex","orientation":"vertical","justifyContent":"center"}} --> <div class="wp-block-group category-card"> <!-- wp:image {"width":"120px","height":"120px","sizeSlug":"thumbnail","className":"category-card__circle"} --> <figure class="wp-block-image size-thumbnail is-resized category-card__circle"><img src="' . esc_url(get_template_directory_uri()) . '/assets/images/cat-toho.jpg" alt="' . esc_attr__('TOHO Rocailles', 'perlen-blocks') . '" style="width:120px;height:120px"/></figure> <!-- /wp:image --> <!-- wp:paragraph {"style":{"typography":{"fontWeight":"600"}}} --> <p class="" style="font-weight:600">' . esc_html__('TOHO Rocailles', 'perlen-blocks') . '</p> <!-- /wp:paragraph --> </div> <!-- /wp:group --> </div> <!-- /wp:column --> <!-- wp:column --> <div class="wp-block-column"> <!-- wp:group {"className":"category-card","layout":{"type":"flex","orientation":"vertical","justifyContent":"center"}} --> <div class="wp-block-group category-card"> <!-- wp:image {"width":"120px","height":"120px","sizeSlug":"thumbnail","className":"category-card__circle"} --> <figure class="wp-block-image size-thumbnail is-resized category-card__circle"><img src="' . esc_url(get_template_directory_uri()) . '/assets/images/cat-holz.jpg" alt="' . esc_attr__('Holzperlen', 'perlen-blocks') . '" style="width:120px;height:120px"/></figure> <!-- /wp:image --> <!-- wp:paragraph {"style":{"typography":{"fontWeight":"600"}}} --> <p class="" style="font-weight:600">' . esc_html__('Holzperlen', 'perlen-blocks') . '</p> <!-- /wp:paragraph --> </div> <!-- /wp:group --> </div> <!-- /wp:column --> <!-- wp:column --> <div class="wp-block-column"> <!-- wp:group {"className":"category-card","layout":{"type":"flex","orientation":"vertical","justifyContent":"center"}} --> <div class="wp-block-group category-card"> <!-- wp:image {"width":"120px","height":"120px","sizeSlug":"thumbnail","className":"category-card__circle"} --> <figure class="wp-block-image size-thumbnail is-resized category-card__circle"><img src="' . esc_url(get_template_directory_uri()) . '/assets/images/cat-natursteine.jpg" alt="' . esc_attr__('Natursteine', 'perlen-blocks') . '" style="width:120px;height:120px"/></figure> <!-- /wp:image --> <!-- wp:paragraph {"style":{"typography":{"fontWeight":"600"}}} --> <p class="" style="font-weight:600">' . esc_html__('Natursteine', 'perlen-blocks') . '</p> <!-- /wp:paragraph --> </div> <!-- /wp:group --> </div> <!-- /wp:column --> <!-- wp:column --> <div class="wp-block-column"> <!-- wp:group {"className":"category-card","layout":{"type":"flex","orientation":"vertical","justifyContent":"center"}} --> <div class="wp-block-group category-card"> <!-- wp:image {"width":"120px","height":"120px","sizeSlug":"thumbnail","className":"category-card__circle"} --> <figure class="wp-block-image size-thumbnail is-resized category-card__circle"><img src="' . esc_url(get_template_directory_uri()) . '/assets/images/cat-zubehoer.jpg" alt="' . esc_attr__('Zubehör', 'perlen-blocks') . '" style="width:120px;height:120px"/></figure> <!-- /wp:image --> <!-- wp:paragraph {"style":{"typography":{"fontWeight":"600"}}} --> <p class="" style="font-weight:600">' . esc_html__('Zubehör', 'perlen-blocks') . '</p> <!-- /wp:paragraph --> </div> <!-- /wp:group --> </div> <!-- /wp:column --> <!-- wp:column --> <div class="wp-block-column"> <!-- wp:group {"className":"category-card","layout":{"type":"flex","orientation":"vertical","justifyContent":"center"}} --> <div class="wp-block-group category-card"> <!-- wp:image {"width":"120px","height":"120px","sizeSlug":"thumbnail","className":"category-card__circle"} --> <figure class="wp-block-image size-thumbnail is-resized category-card__circle"><img src="' . esc_url(get_template_directory_uri()) . '/assets/images/cat-schmuck.jpg" alt="' . esc_attr__('Schmuck', 'perlen-blocks') . '" style="width:120px;height:120px"/></figure> <!-- /wp:image --> <!-- wp:paragraph {"style":{"typography":{"fontWeight":"600"}}} --> <p class="" style="font-weight:600">' . esc_html__('Schmuck', 'perlen-blocks') . '</p> <!-- /wp:paragraph --> </div> <!-- /wp:group --> </div> <!-- /wp:column --> </div> <!-- /wp:columns --> </div> <!-- /wp:group -->'; } function perlen_blocks_get_pattern_newsletter(): string { return '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|xl","bottom":"var:preset|spacing|xl"}}},"gradient":"purple-gradient","layout":{"type":"constrained"}} --> <div class="wp-block-group alignfull has-purple-gradient-gradient-background has-background" style="padding-top:var(--wp--preset--spacing--xl);padding-bottom:var(--wp--preset--spacing--xl)"> <!-- wp:heading {"textAlign":"center","style":{"typography":{"fontSize":"2rem"}},"textColor":"white"} --> <h2 class="wp-block-heading has-text-align-center has-white-color has-text-color" style="font-size:2rem">' . esc_html__('Newsletter', 'perlen-blocks') . '</h2> <!-- /wp:heading --> <!-- wp:paragraph {"textAlign":"center","style":{"elements":{"link":{"color":{"text":"#C4A8E0"}}}}},"textColor":"white"} --> <p class="has-text-align-center has-white-color has-text-color">' . esc_html__('Bleiben Sie informiert über neue Produkte und Angebote.', 'perlen-blocks') . '</p> <!-- /wp:paragraph --> <!-- wp:buttons {"layout":{"type":"flex","justifyContent":"center"},"style":{"spacing":{"margin":{"top":"var:preset|spacing|md"}}}} --> <div class="wp-block-buttons" style="margin-top:var(--wp--preset--spacing--md)"> <!-- wp:button {"backgroundColor":"white","textColor":"accent"} --> <div class="wp-block-button"><a class="wp-block-button__link has-white-background-color has-accent-color has-text-color has-background wp-element-button">' . esc_html__('Anmelden', 'perlen-blocks') . '</a></div> <!-- /wp:button --> </div> <!-- /wp:buttons --> </div> <!-- /wp:group -->'; } function perlen_blocks_get_pattern_trust_bar(): string { return '<!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"var:preset|spacing|md","bottom":"var:preset|spacing|md"}}},"backgroundColor":"muted","className":"trust-bar","layout":{"type":"constrained"}} --> <div class="wp-block-group alignwide trust-bar has-muted-background-color has-background" style="padding-top:var(--wp--preset--spacing--md);padding-bottom:var(--wp--preset--spacing--md)"> <!-- wp:columns {"align":"wide","style":{"spacing":{"padding":{"top":"0","bottom":"0"}}}} --> <div class="wp-block-columns alignwide" style="padding-top:0;padding-bottom:0"> <!-- wp:column --> <div class="wp-block-column"> <!-- wp:group {"className":"trust-bar__item","layout":{"type":"flex","flexWrap":"nowrap"}} --> <div class="wp-block-group trust-bar__item"> <!-- wp:html --> <div class="trust-bar__icon">📦</div> <!-- /wp:html --> <!-- wp:paragraph --> <p>' . esc_html__('Kostenloser Versand ab €60', 'perlen-blocks') . '</p> <!-- /wp:paragraph --> </div> <!-- /wp:group --> </div> <!-- /wp:column --> <!-- wp:column --> <div class="wp-block-column"> <!-- wp:group {"className":"trust-bar__item","layout":{"type":"flex","flexWrap":"nowrap"}} --> <div class="wp-block-group trust-bar__item"> <!-- wp:html --> <div class="trust-bar__icon">📞</div> <!-- /wp:html --> <!-- wp:paragraph --> <p>' . esc_html__('Telefonischer Support', 'perlen-blocks') . '</p> <!-- /wp:paragraph --> </div> <!-- /wp:group --> </div> <!-- /wp:column --> <!-- wp:column --> <div class="wp-block-column"> <!-- wp:group {"className":"trust-bar__item","layout":{"type":"flex","flexWrap":"nowrap"}} --> <div class="wp-block-group trust-bar__item"> <!-- wp:html --> <div class="trust-bar__icon">↩️</div> <!-- /wp:html --> <!-- wp:paragraph --> <p>' . esc_html__('Einfache Rückgabe', 'perlen-blocks') . '</p> <!-- /wp:paragraph --> </div> <!-- /wp:group --> </div> <!-- /wp:column --> <!-- wp:column --> <div class="wp-block-column"> <!-- wp:group {"className":"trust-bar__item","layout":{"type":"flex","flexWrap":"nowrap"}} --> <div class="wp-block-group trust-bar__item"> <!-- wp:html --> <div class="trust-bar__icon">🔒</div> <!-- /wp:html --> <!-- wp:paragraph --> <p>' . esc_html__('Sichere Zahlung', 'perlen-blocks') . '</p> <!-- /wp:paragraph --> </div> <!-- /wp:group --> </div> <!-- /wp:column --> </div> <!-- /wp:columns --> </div> <!-- /wp:group -->'; } function perlen_blocks_get_pattern_full_page(): string { return '<!-- wp:group {"tagName":"main","style":{"spacing":{"padding":{"top":"0","bottom":"0","left":"0","right":"0"},"margin":{"top":"0","bottom":"0"}}},"className":"full-page-content","layout":{"type":"default"}} --> <main class="wp-block-group full-page-content" style="padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;margin-top:0;margin-bottom:0"> <!-- wp:group {"style":{"spacing":{"padding":{"top":"var:preset|spacing|xl","bottom":"var:preset|spacing|xl"}}},"layout":{"type":"constrained"}} --> <div class="wp-block-group" style="padding-top:var(--wp--preset--spacing--xl);padding-bottom:var(--wp--preset--spacing--xl)"> <!-- wp:post-title {"level":1,"style":{"typography":{"fontSize":"2.5rem"}}} /--> <!-- wp:post-content {"align":"wide"} /--> </div> <!-- /wp:group --> </main> <!-- /wp:group -->'; } function perlen_blocks_get_pattern_sidebar_layout(): string { return '<!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"var:preset|spacing|xl","bottom":"var:preset|spacing|xl"}}},"layout":{"type":"constrained"}} --> <div class="wp-block-group alignwide" style="padding-top:var(--wp--preset--spacing--xl);padding-bottom:var(--wp--preset--spacing--xl)"> <!-- wp:columns {"align":"wide","style":{"spacing":{"margin":{"bottom":"var:preset|spacing|lg"}}}} --> <div class="wp-block-columns alignwide" style="margin-bottom:var(--wp--preset--spacing--lg)"> <!-- wp:column {"width":"260px"} --> <div class="wp-block-column" style="flex-basis:260px"> <!-- wp:group {"className":"sidebar-nav","style":{"spacing":{"padding":{"top":"var:preset|spacing|md","bottom":"var:preset|spacing|md","left":"var:preset|spacing|md","right":"var:preset|spacing|md"}},"border":{"radius":"8px"}},"backgroundColor":"surface","borderColor":"border","layout":{"type":"default"}} --> <div class="wp-block-group sidebar-nav has-surface-background-color has-border-color" style="border-radius:8px;padding-top:var(--wp--preset--spacing--md);padding-right:var(--wp--preset--spacing--md);padding-bottom:var(--wp--preset--spacing--md);padding-left:var(--wp--preset--spacing--md)"> <!-- wp:heading {"level":3,"style":{"typography":{"fontSize":"1rem"}},"textColor":"primary"} --> <h3 class="wp-block-heading has-primary-color has-text-color" style="font-size:1rem">' . esc_html__('Kategorien', 'perlen-blocks') . '</h3> <!-- /wp:heading --> <!-- wp:navigation {"ref":"","overlayMenu":"never","layout":{"type":"flex","orientation":"vertical"},"style":{"spacing":{"blockGap":"0"}},"textColor":"text"} --> <!-- wp:navigation-link {"label":"Kristall","url":"#"} /--> <!-- wp:navigation-link {"label":"TOHO Rocailles","url":"#"} /--> <!-- wp:navigation-link {"label":"Holzperlen","url":"#"} /--> <!-- wp:navigation-link {"label":"Natursteine","url":"#"} /--> <!-- wp:navigation-link {"label":"Glasperlen","url":"#"} /--> <!-- wp:navigation-link {"label":"Zubehör","url":"#"} /--> <!-- wp:navigation-link {"label":"Werkzeuge","url":"#"} /--> <!-- /wp:navigation --> </div> <!-- /wp:group --> </div> <!-- /wp:column --> <!-- wp:column --> <div class="wp-block-column"> <!-- wp:woocommerce/product-new {"columns":3} /--> </div> <!-- /wp:column --> </div> <!-- /wp:columns --> </div> <!-- /wp:group -->'; } // Task 3: Dynamic Footer Copyright Year add_filter('the_content', function($content) { return str_replace('© 2026 MossCrystal', '© ' . date('Y') . ' MossCrystal', $content); }, 20);