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';