'active' ), array( 'key' => 'date_created', 'direction' => 'DESC' ), array( 'offset' => 0, 'page_size' => 200 ) ); if ( is_wp_error( $entries ) || empty( $entries ) ) { return ''; } $rows = ''; foreach ( $entries as $e ) { $name = trim( rgar( $e, '4' ) ); $loc = trim( rgar( $e, '6' ) ); $web = trim( rgar( $e, '9' ) ); $msg = trim( rgar( $e, '10' ) ); if ( $name === '' && $msg === '' ) { continue; } $weblink = ''; if ( $web !== '' ) { $href = esc_url( $web ); if ( $href !== '' ) { $label = preg_replace( '#^https?://(www\.)?#i', '', untrailingslashit( $web ) ); $weblink = '' . esc_html( $label ) . ''; } } $rows .= '' . '' . esc_html( $name ) . '' . '' . esc_html( $loc ) . '' . '' . $weblink . '' . '' . nl2br( esc_html( $msg ) ) . '' . '' . esc_html( mysql2date( 'M Y', $e['date_created'] ) ) . '' . ''; } if ( $rows === '' ) { return ''; } return '
' . '

Guest Book

' . '
' . '' . '' . '' . '' . '' . $rows . '' . '
NameLocationWebsiteMessageDate
'; } function dw_guestbook_once() { static $done = false; if ( $done ) { return ''; } $done = true; return dw_guestbook(); } add_shortcode( 'dw_guestbook', 'dw_guestbook' ); add_filter( 'render_block', 'dw_guestbook_render_block', 10, 2 ); function dw_guestbook_render_block( $block_content, $block ) { if ( ! empty( $block['blockName'] ) && 'core/post-content' === $block['blockName'] && is_page( 'guests' ) ) { $block_content .= dw_guestbook_once(); } return $block_content; } add_action( 'wp_enqueue_scripts', 'dw_scripts' ); // On the search results page, rewrite each post-excerpt block to a snippet // centered on the match with the term(s) highlighted — mirroring the TIL column. // Hooked at render_block (not get_the_excerpt) because the core post-excerpt block // runs wp_trim_words() → wp_strip_all_tags() after the excerpt filters, which would // otherwise eat the tags. Titles are left alone (never marks /nav). // When the term isn't in the body (title-only match) the block is left untouched. // Styled by `body.search mark`. function dw_search_excerpt_highlight( $block_content, $block, $instance ) { if ( is_admin() || ! is_search() ) { return $block_content; } $query = trim( get_search_query() ); if ( '' === $query ) { return $block_content; } $post_id = isset( $instance->context['postId'] ) ? $instance->context['postId'] : 0; $post = $post_id ? get_post( $post_id ) : null; if ( ! $post instanceof WP_Post ) { return $block_content; } $terms = array_values( array_unique( array_filter( preg_split( '/\s+/', $query ) ) ) ); $has_mb = function_exists( 'mb_stripos' ); // Plain-text body (strip shortcodes, block markup, tags). $text = html_entity_decode( wp_strip_all_tags( strip_shortcodes( $post->post_content ) ), ENT_QUOTES, 'UTF-8' ); $text = trim( preg_replace( '/\s+/', ' ', $text ) ); // Locate the first term; bail (leave the intro excerpt) if it's not in the body. $pos = false; foreach ( $terms as $t ) { $p = $has_mb ? mb_stripos( $text, $t ) : stripos( $text, $t ); if ( false !== $p ) { $pos = $p; break; } } if ( false === $pos || '' === $text ) { return $block_content; } // Window a snippet around the match, snapped to word boundaries. $len = $has_mb ? mb_strlen( $text ) : strlen( $text ); $start = max( 0, $pos - 60 ); $slice = $has_mb ? mb_substr( $text, $start, 220 ) : substr( $text, $start, 220 ); if ( $start > 0 ) { $slice = preg_replace( '/^\S*\s/', '', $slice ); } if ( $start + 220 < $len ) { $slice = preg_replace( '/\s\S*$/', '', $slice ); } $snippet = esc_html( ( $start > 0 ? '… ' : '' ) . $slice . ( $start + 220 < $len ? ' …' : '' ) ); foreach ( $terms as $t ) { $snippet = preg_replace( '/(' . preg_quote( $t, '/' ) . ')/i', '<mark>$1</mark>', $snippet ); } // Swap the excerpt paragraph's inner content, preserving the block wrapper. return preg_replace_callback( '#(<p class="wp-block-post-excerpt__excerpt">).*?(</p>)#s', function ( $m ) use ( $snippet ) { return $m[1] . $snippet . $m[2]; }, $block_content, 1 ); } add_filter( 'render_block_core/post-excerpt', 'dw_search_excerpt_highlight', 10, 3 ); function dw_scripts() { global $post; wp_enqueue_style( 'style-min', get_template_directory_uri() . '/v4-style.min.css', array(), filemtime( get_template_directory() . '/v4-style.min.css' ) ); wp_deregister_script('jquery'); if ( is_page('studio') ) { wp_enqueue_script( 'scriptmin', get_template_directory_uri() . '/js/v4-script.min.js', '', '', true ); wp_enqueue_script( 'init', get_template_directory_uri() . '/js/studio.js', '', '', true ); } elseif ( is_page('music') ) { wp_enqueue_script( 'scriptmin', get_template_directory_uri() . '/js/v4-script.min.js', '', '', true ); wp_enqueue_script( 'last-fm', get_template_directory_uri() . '/js/music.js', '', '', true ); } elseif ( is_page('art') ) { wp_enqueue_script( 'scriptmin', get_template_directory_uri() . '/js/v4-script.min.js', '', '', true ); wp_enqueue_script( 'art', get_template_directory_uri() . '/js/art.js', '', '', true ); } elseif ( is_page('contact') ) { require( get_template_directory() . '/inc/form.php' ); //gravity_form_enqueue_scripts(1, false); wp_enqueue_script( 'scriptmin', get_template_directory_uri() . '/js/v4-script.min.js', '', '', true ); wp_enqueue_style( 'gforms', get_template_directory_uri() . '/css/form.css'); wp_enqueue_script('jquery', get_template_directory_uri() . '/js/jquery-3.1.0.min.js', array(), false, true); wp_enqueue_script('stripe', 'https://js.stripe.com/v2/', array(), '3', true); wp_enqueue_script( 'form', get_template_directory_uri() . '/js/contact.js', '', '', true ); } elseif ( is_page('guests') ) { require( get_template_directory() . '/inc/form.php' ); //gravity_form_enqueue_scripts(1, false); wp_enqueue_script( 'scriptmin', get_template_directory_uri() . '/js/v4-script.min.js', '', '', true ); wp_enqueue_style( 'gforms', get_template_directory_uri() . '/css/form.css'); wp_enqueue_script('jquery', get_template_directory_uri() . '/js/jquery-3.1.0.min.js', array(), false, true); wp_enqueue_script( 'form', get_template_directory_uri() . '/js/contact.js', '', '', true ); } elseif ( is_page('contract') ) { require( get_template_directory() . '/inc/form.php' ); //gravity_form_enqueue_scripts(1, false); wp_enqueue_script( 'scriptmin', get_template_directory_uri() . '/js/v4-script.min.js', '', '', true ); wp_enqueue_style( 'gforms', get_template_directory_uri() . '/css/form.css'); wp_enqueue_script('jquery', get_template_directory_uri() . '/js/jquery-3.1.0.min.js', array(), false, true); wp_enqueue_script( 'form', get_template_directory_uri() . '/js/contact.js', '', '', true ); } elseif ( is_page('pay') ) { require( get_template_directory() . '/inc/form.php' ); //gravity_form_enqueue_scripts(1, false); wp_enqueue_script( 'scriptmin', get_template_directory_uri() . '/js/v4-script.min.js', '', '', true ); wp_enqueue_style( 'gforms', get_template_directory_uri() . '/css/form.css'); wp_enqueue_script('jquery', get_template_directory_uri() . '/js/jquery-3.1.0.min.js', array(), false, true); } elseif ( is_page('analytics') ) { require( get_template_directory() . '/inc/analytics.php' ); wp_enqueue_script( 'scriptmin', get_template_directory_uri() . '/js/v4-script.min.js', '', '', true ); wp_enqueue_script( 'dashboardjs', get_template_directory_uri() . '/js/analytics.js', '', '', true ); } elseif ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) { wp_enqueue_script( 'scriptmin', get_template_directory_uri() . '/js/v4-script.min.js', '', '', true ); wp_enqueue_script( 'single', get_template_directory_uri() . '/js/single.js', '', '', true ); wp_enqueue_script( 'comment-reply' ); } elseif ( is_page('desk') || is_archive() || is_search() ) { global $wp_rewrite; wp_enqueue_script( 'jquery', get_template_directory_uri() . '/js/v4-script.min.js', '', '', true ); wp_enqueue_script( 'desk', get_template_directory_uri() . '/js/desk.js', '', '', true ); if ( is_page('desk') ) { // Lychee photo-stream embed (davidwindham.com/photo). The config <div> lives // in page-desk.php; this loads the embed lib. Not on archive/search (which // share this branch), hence the is_page guard. wp_enqueue_style( 'lychee-embed', 'https://davidwindham.com/photo/embed/lychee-embed.css', array(), '1.0.0' ); wp_enqueue_script( 'lychee-embed', 'https://davidwindham.com/photo/embed/lychee-embed.js', array(), '1.0.0', true ); } // --- TIL search (removable): merge the Docusaurus /til lunr results into the // WP search-results page. See js/til-search.js for the full removal checklist. --- if ( is_search() ) { wp_enqueue_script( 'lunr', get_template_directory_uri() . '/js/vendor/lunr.min.js', array(), '2.3.9', true ); wp_enqueue_script( 'dw-til-search', get_template_directory_uri() . '/js/til-search.js', array( 'lunr' ), filemtime( get_template_directory() . '/js/til-search.js' ), true ); wp_localize_script( 'dw-til-search', 'dwTilSearch', array( 'query' => get_search_query(), 'index' => home_url( '/til/lunr-index.json' ), 'docs' => home_url( '/til/search-doc.json' ), 'maxHits' => 10, ) ); } // --- end TIL search --- wp_enqueue_script( '_s_backbone-loop', get_template_directory_uri() . '/js/loop.js', array( 'jquery', 'backbone', 'underscore', 'wp-api' ), '1.0', true ); $queried_object = get_queried_object(); $local = array( 'loopType' => 'home', 'queriedObject' => $queried_object, 'pathInfo' => array( 'author_permastruct' => $wp_rewrite->get_author_permastruct(), 'host' => preg_replace( '#^http(s)?://#i', '', untrailingslashit( home_url() ) ), 'path' => _s_backbone_get_request_path(), 'use_trailing_slashes' => $wp_rewrite->use_trailing_slashes, 'parameters' => _s_backbone_get_request_parameters(), ), ); if ( is_category() || is_tag() || is_tax() ) { $local['loopType'] = 'archive'; $local['taxonomy'] = get_taxonomy( $queried_object->taxonomy ); } elseif ( is_search() ) { $local['loopType'] = 'search'; $local['searchQuery'] = get_search_query(); } elseif ( is_author() ) { $local['loopType'] = 'author'; } if ( is_paged() ) { $local['page'] = absint( get_query_var( 'paged' ) ) + 1; } wp_localize_script( '_s_backbone-loop', 'settings', $local ); } else { //wp_deregister_script('mediaelement'); wp_enqueue_script( 'scriptmin', get_template_directory_uri() . '/js/v4-script.min.js', '', '', true ); wp_enqueue_script( 'single', get_template_directory_uri() . '/js/single.js', '', '', true ); wp_enqueue_script( 'mediaelement-me', get_template_directory_uri() .'/js/mediaelement-and-player.min.js', '', '', true); wp_enqueue_script( 'mediaelement-wp', get_template_directory_uri() .'/js/wp-mediaelement.min.js', '', '', true); } } // davo-bot 2000 — AI ask widget. Printed directly on wp_footer (like dw_analytics) // rather than enqueued, because front-page.php skips wp_head() so wp_enqueue_scripts // never fires there. The loader pulls /ask/widget.js (proxied same-origin to ralph). // On the homepage, window.dwAsk.open = 'once' auto-opens the terminal on first visit. function dw_ask_widget() { if ( is_admin() ) return; $src = get_template_directory_uri() . '/js/ask-widget.js'; $ver = filemtime( get_template_directory() . '/js/ask-widget.js' ); $open = is_front_page() ? 'once' : ''; ?> <script>window.dwAsk = {open:"<?php echo esc_js( $open ); ?>"};</script> <script src="<?php echo esc_url( $src . '?ver=' . $ver ); ?>"></script> <?php } add_action( 'wp_footer', 'dw_ask_widget' ); // front-page.php is fully self-contained (no wp_head, hand-rolled critical CSS, zero // blocks/presets), but WordPress still injects theme.json's global styles — and its // body/h1-h6 element rules override the homepage's intended typography. Strip them on // the front page only; the rest of the site keeps them. (front-page.php skips wp_head, // so the global styles print during wp_footer — dequeue before that late-print runs.) function dw_no_global_styles_on_home() { if ( is_front_page() ) { wp_dequeue_style( 'global-styles' ); wp_dequeue_style( 'global-styles-css-custom-properties' ); } } add_action( 'wp_enqueue_scripts', 'dw_no_global_styles_on_home', 100 ); add_action( 'wp_footer', 'dw_no_global_styles_on_home', 1 ); // Dev only: on a real content save, ping BrowserSync's reload endpoint so the front-end // preview refreshes — DB content changes aren't visible to a filesystem watcher otherwise. // Hooks the REST save events the block editor actually fires (+ customizer + nav menus). // Gated to WP_DEBUG → no-op in production. if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { function dw_bs_reload_on_save( $post = null ) { if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; if ( $post && is_object( $post ) && $post->post_status === 'auto-draft' ) return; wp_remote_get( 'https://daw.stu:81/__browser_sync__?method=reload', array( 'blocking' => false, 'sslverify' => false, ) ); } add_action( 'rest_after_insert_page', 'dw_bs_reload_on_save', 10, 3 ); add_action( 'rest_after_insert_post', 'dw_bs_reload_on_save', 10, 3 ); add_action( 'customize_save_after', 'dw_bs_reload_on_save', 10, 3 ); add_action( 'wp_update_nav_menu', 'dw_bs_reload_on_save', 10, 3 ); } add_action('wp_footer', 'dw_analytics', 22); function dw_analytics() { ?> <script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="https://davidawindham.com/wik/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script> <noscript><p><img src="https://davidawindham.com/wik/matomo.php?idsite=1&rec=1" style="border:0;" alt="" /></p></noscript> <?php } ?>