HEX
Server: Apache/2.4.66 (Debian)
System: Linux 6dfabc3b2241 6.8.0-71-generic #71-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 22 16:52:38 UTC 2025 x86_64
User: (1000)
PHP: 8.3.30
Disabled: NONE
Upload Files
File: /var/www/html/wp-content/themes/custom-theme/functions.php
<?php

if (!defined('ABSPATH')) {
    exit;
}

/* ─── Theme Setup ─────────────────────────────────────────────────────────── */

function cae_theme_setup() {
    add_theme_support('title-tag');
    add_theme_support('post-thumbnails');
    add_theme_support('editor-styles');
    add_theme_support('wp-block-styles');
    add_theme_support('html5', ['search-form', 'comment-form', 'gallery', 'caption', 'style', 'script']);

    register_nav_menus([
        'primary' => 'Primary Navigation',
    ]);
}
add_action('after_setup_theme', 'cae_theme_setup');

/* ─── Enqueue Styles & Scripts ────────────────────────────────────────────── */

function cae_enqueue_assets() {
    // Theme CSS
    wp_enqueue_style('cae-theme', get_stylesheet_directory_uri() . '/assets/css/theme.css', [], '2.0.0');
}
add_action('wp_enqueue_scripts', 'cae_enqueue_assets');

/* ─── Hide Comments — not used ────────────────────────────────────────────── */

add_action('admin_menu', fn() => remove_menu_page('edit-comments.php'));
add_action('init', fn() => remove_post_type_support('post', 'comments'));

/* ─── ACF JSON sync ───────────────────────────────────────────────────────── */

add_filter('acf/settings/save_json', fn($path) => get_stylesheet_directory() . '/acf-json');
add_filter('acf/settings/load_json', function ($paths) {
    $paths[] = get_stylesheet_directory() . '/acf-json';
    return $paths;
});

/* ─── ACF Options Page ────────────────────────────────────────────────────── */

function cae_register_options_pages() {
    if (!function_exists('acf_add_options_page')) {
        return;
    }

    acf_add_options_page([
        'page_title'         => 'Sitewide Settings',
        'menu_title'         => 'Sitewide Settings',
        'menu_slug'          => 'sitewide-settings',
        'capability'         => 'edit_posts',
        'redirect'           => false,
    ]);
}
add_action('acf/init', 'cae_register_options_pages');

/* ─── ACF Block Registration ─────────────────────────────────────────────── */

function cae_register_acf_blocks() {
    if (!function_exists('acf_register_block_type')) {
        return;
    }

    $blocks = [
        ['name' => 'hero',              'title' => 'Hero',              'icon' => 'cover-image',       'keywords' => ['hero', 'banner', 'header']],
        ['name' => 'cta',               'title' => 'CTA',              'icon' => 'megaphone',         'keywords' => ['cta', 'call to action', 'button']],
        ['name' => 'cards',             'title' => 'Cards',            'icon' => 'grid-view',         'keywords' => ['cards', 'grid', 'features']],
        ['name' => 'text-image',        'title' => 'Text + Image',     'icon' => 'align-pull-right',  'keywords' => ['text', 'image', 'split']],
        ['name' => 'resource-list',     'title' => 'Resource List',    'icon' => 'media-document',    'keywords' => ['resources', 'documents']],
        ['name' => 'mission-section',   'title' => 'Mission Section',  'icon' => 'align-pull-right',  'keywords' => ['mission', 'about']],
        ['name' => 'vision-section',    'title' => 'Vision Section',   'icon' => 'visibility',        'keywords' => ['vision', 'about']],
        ['name' => 'values-list',       'title' => 'Values List',      'icon' => 'list-view',         'keywords' => ['values', 'list']],
        ['name' => 'process-grid',      'title' => 'Process Grid',     'icon' => 'grid-view',         'keywords' => ['process', 'grid']],
        ['name' => 'annual-reports-cta', 'title' => 'Annual Reports CTA', 'icon' => 'media-document', 'keywords' => ['annual', 'reports']],
        ['name' => 'brand-guidelines',  'title' => 'Brand Guidelines', 'icon' => 'art',               'keywords' => ['brand', 'guidelines']],
        ['name' => 'accordion-section', 'title' => 'Accordion Section', 'icon' => 'list-view',        'keywords' => ['accordion', 'faq', 'privacy']],
        ['name' => 'subscribe-form',    'title' => 'Subscribe Form',   'icon' => 'email',             'keywords' => ['subscribe', 'newsletter']],
        ['name' => 'news-events',       'title' => 'News & Events',    'icon' => 'calendar-alt',      'keywords' => ['news', 'events']],
        ['name' => 'support-cae',       'title' => 'Support CAE',      'icon' => 'heart',             'keywords' => ['support', 'donate', 'give']],
        ['name' => 'donate-vff',        'title' => 'Donate — Vermont Farm Fund', 'icon' => 'heart',     'keywords' => ['donate', 'vff', 'farm fund', 'giving']],
        ['name' => 'contact-directory', 'title' => 'Contact Directory', 'icon' => 'id-alt',           'keywords' => ['contact', 'directory', 'staff']],
        ['name' => 'donate',            'title' => 'Donate',            'icon' => 'money-alt',         'keywords' => ['donate', 'give', 'form', 'payment']],
    ];

    foreach ($blocks as $block) {
        $render_path = get_stylesheet_directory() . '/blocks/' . $block['name'] . '/render.php';

        acf_register_block_type([
            'name'              => $block['name'],
            'title'             => $block['title'],
            'description'       => $block['title'] . ' block.',
            'category'          => 'formatting',
            'icon'              => $block['icon'] ?? 'block-default',
            'keywords'          => $block['keywords'] ?? [],
            'render_template'   => file_exists($render_path) ? $render_path : get_stylesheet_directory() . '/blocks/fallback.php',
            'mode'              => 'preview',
            'supports'          => ['align' => false],
        ]);
    }
}
add_action('acf/init', 'cae_register_acf_blocks');

/* ─── Feature includes ────────────────────────────────────────────────────── */

require_once __DIR__ . '/inc/breadcrumb.php';
require_once __DIR__ . '/inc/logger.php';
require_once __DIR__ . '/inc/logger-dashboard.php';
require_once __DIR__ . '/inc/post-types.php';
require_once __DIR__ . '/inc/typesense.php';
require_once __DIR__ . '/inc/typesense-dashboard.php';