Compare commits

...

10 Commits

Author SHA1 Message Date
Adolfo Reyna
e265f2c2cb moving to container 2026-03-16 16:17:18 -04:00
Adolfo Reyna
e9c6786450 Integrated SVG logo in header and footer 2026-03-13 16:20:19 -04:00
Adolfo Reyna
0eb83a8515 Rename 'Wisdom for the Kingdom' to 'Wisdom from the Kingdom' in theme files 2026-03-13 15:18:24 -04:00
Adolfo Reyna
4752eec5d0 Implement AOS scroll animations for article cards 2026-03-13 12:05:33 -04:00
Adolfo Reyna
7ffd5532f9 Refactor search toggle to Bootstrap and add search results template 2026-03-13 11:57:56 -04:00
Adolfo Reyna
bd5222443f Update default author name and enable author section by default 2026-03-13 11:53:35 -04:00
Adolfo Reyna
cd0a626c33 Add configurable Author Section to front page 2026-03-13 11:51:36 -04:00
Adolfo Reyna
3597ef9008 Update footer text color and remove copyright text 2026-03-13 11:46:49 -04:00
Adolfo Reyna
e1f4370341 Extract newsletter into reusable template part and add Customizer support 2026-03-13 11:32:41 -04:00
Adolfo Reyna
c05a2980bb Reduce comment padding and move post navigation below comments using card template 2026-03-13 11:28:07 -04:00
14 changed files with 361 additions and 141 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

BIN
assets/.DS_Store vendored Normal file

Binary file not shown.

47
assets/images/logo.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 42 KiB

View File

@@ -8,7 +8,7 @@ if (post_password_required()) {
} }
?> ?>
<div id="comments" class="comments-area reading-container mt-5"> <div id="comments" class="comments-area reading-container mt-3">
<?php <?php
// Move the comment form ABOVE the comments thread. // Move the comment form ABOVE the comments thread.
@@ -17,13 +17,13 @@ if (post_password_required()) {
$html_req = ($req ? " required='required'" : ''); $html_req = ($req ? " required='required'" : '');
$args = array( $args = array(
'class_form' => 'comment-form mb-5', 'class_form' => 'comment-form mb-4',
'class_submit' => 'btn btn-secondary fw-bold text-uppercase mt-4 px-4 py-2', 'class_submit' => 'btn btn-secondary fw-bold text-uppercase mt-3 px-4 py-2',
'title_reply_before' => '<h2 id="reply-title" class="comment-reply-title h4 font-sans mb-4 fw-bold">', 'title_reply_before' => '<h2 id="reply-title" class="comment-reply-title h4 font-sans mb-3 fw-bold">',
'title_reply_after' => '</h2>', 'title_reply_after' => '</h2>',
'comment_field' => '<div class="comment-form-comment mb-4"><label for="comment" class="form-label text-muted small text-uppercase tracking-wider fw-bold">Add a Perspective <span class="text-danger">*</span></label><textarea id="comment" name="comment" cols="45" rows="4" maxlength="65525" required="required" class="form-control border-0" style="background-color: #f1f3f5;"></textarea></div>', 'comment_field' => '<div class="comment-form-comment mb-3"><label for="comment" class="form-label text-muted small text-uppercase tracking-wider fw-bold">Add a Perspective <span class="text-danger">*</span></label><textarea id="comment" name="comment" cols="45" rows="4" maxlength="65525" required="required" class="form-control border-0" style="background-color: #f1f3f5;"></textarea></div>',
'fields' => array( 'fields' => array(
'author' => '<div class="row g-3 mb-3"><div class="col-md-6 comment-form-author"><label for="author" class="form-label small fw-bold">Name ' . ($req ? '<span class="text-danger">*</span>' : '') . '</label><input id="author" name="author" type="text" value="' . esc_attr($commenter['comment_author']) . '" size="30" maxlength="245"' . $html_req . ' class="form-control bg-white" /></div>', 'author' => '<div class="row g-3 mb-2"><div class="col-md-6 comment-form-author"><label for="author" class="form-label small fw-bold">Name ' . ($req ? '<span class="text-danger">*</span>' : '') . '</label><input id="author" name="author" type="text" value="' . esc_attr($commenter['comment_author']) . '" size="30" maxlength="245"' . $html_req . ' class="form-control bg-white" /></div>',
'email' => '<div class="col-md-6 comment-form-email"><label for="email" class="form-label small fw-bold">Email ' . ($req ? '<span class="text-danger">*</span>' : '') . '</label><input id="email" name="email" type="email" value="' . esc_attr($commenter['comment_author_email']) . '" size="30" maxlength="100" aria-describedby="email-notes"' . $html_req . ' class="form-control bg-white" /></div></div>', 'email' => '<div class="col-md-6 comment-form-email"><label for="email" class="form-label small fw-bold">Email ' . ($req ? '<span class="text-danger">*</span>' : '') . '</label><input id="email" name="email" type="email" value="' . esc_attr($commenter['comment_author_email']) . '" size="30" maxlength="100" aria-describedby="email-notes"' . $html_req . ' class="form-control bg-white" /></div></div>',
'url' => '<div class="comment-form-url mb-4"><label for="url" class="form-label small fw-bold">Website</label><input id="url" name="url" type="url" value="' . esc_attr($commenter['comment_author_url']) . '" size="30" maxlength="200" class="form-control bg-white" /></div>', 'url' => '<div class="comment-form-url mb-4"><label for="url" class="form-label small fw-bold">Website</label><input id="url" name="url" type="url" value="' . esc_attr($commenter['comment_author_url']) . '" size="30" maxlength="200" class="form-control bg-white" /></div>',
), ),
@@ -32,7 +32,7 @@ if (post_password_required()) {
?> ?>
<?php if (have_comments()): ?> <?php if (have_comments()): ?>
<h2 class="comments-title mt-5 h5 font-sans border-bottom pb-3 mb-4"> <h2 class="comments-title mt-4 h5 font-sans border-bottom pb-2 mb-3">
<?php <?php
$comment_count = get_comments_number(); $comment_count = get_comments_number();
if ('1' === $comment_count) { if ('1' === $comment_count) {

View File

@@ -3,10 +3,12 @@
<div class="row g-5 mb-5"> <div class="row g-5 mb-5">
<div class="col-lg-5 col-md-12"> <div class="col-lg-5 col-md-12">
<div class="d-flex align-items-center gap-2 mb-3"> <div class="d-flex align-items-center gap-2 mb-3">
<div class="logo-icon border-white text-white">W</div> <img src="<?php echo esc_url(get_template_directory_uri() . '/assets/images/logo.svg'); ?>"
<span class="fs-4 fw-bold font-serif text-white">Wisdom for the Kingdom</span> alt="<?php bloginfo('name'); ?>"
style="height: 50px; width: auto; filter: brightness(0) invert(1);">
<span class="fs-4 fw-bold font-serif text-white">Wisdom from the Kingdom</span>
</div> </div>
<p class="small text-muted mb-0 font-sans lh-lg pe-lg-5"> <p class="small text-light mb-0 font-sans lh-lg pe-lg-5 opacity-75">
A collection of biblical insights curated for the thoughtful leader. Seek truth, lead with grace, A collection of biblical insights curated for the thoughtful leader. Seek truth, lead with grace,
and explore the ancient wisdom that powers modern impact. and explore the ancient wisdom that powers modern impact.
</p> </p>
@@ -43,11 +45,9 @@
</div> </div>
</div> </div>
<div class="pt-4 text-center text-md-start d-md-flex justify-content-between align-items-center" <div class="pt-4 text-center text-md-end" style="border-top: 1px solid rgba(255,255,255,0.1);">
style="border-top: 1px solid rgba(255,255,255,0.1);"> <p class="mb-0 small text-light font-sans mt-2 mt-md-0 d-none d-md-block opacity-50">Designed with purpose.
<p class="mb-0 small text-muted font-sans">&copy; <?php echo date('Y'); ?> <?php bloginfo('name'); ?>. All </p>
rights reserved.</p>
<p class="mb-0 small text-muted font-sans mt-2 mt-md-0 d-none d-md-block">Designed with purpose.</p>
</div> </div>
</div><!-- .container --> </div><!-- .container -->
</footer><!-- #colophon --> </footer><!-- #colophon -->
@@ -55,6 +55,17 @@
<?php wp_footer(); ?> <?php wp_footer(); ?>
<script>
// Initialize Anime On Scroll globally
document.addEventListener('DOMContentLoaded', function () {
AOS.init({
duration: 800,
once: true,
offset: 100
});
});
</script>
</body> </body>
</html> </html>

View File

@@ -35,7 +35,7 @@ $hero_bg = get_theme_mod('hero_background_image', get_template_directory_uri() .
while (have_posts()): while (have_posts()):
the_post(); the_post();
?> ?>
<?php get_template_part('template-parts/content', 'card'); ?> <?php get_template_part('template-parts/content', 'card'); ?>
<?php <?php
endwhile; endwhile;
@@ -54,21 +54,34 @@ $hero_bg = get_theme_mod('hero_background_image', get_template_directory_uri() .
</main><!-- #main --> </main><!-- #main -->
</div><!-- .container --> </div><!-- .container -->
<section class="bg-primary text-white py-5 mt-5"> <?php if (get_theme_mod('show_author_section', true)): ?>
<div class="container text-center py-5"> <section class="author-section py-5 bg-light border-top border-bottom">
<h3 class="display-6 fw-bold mb-4 font-serif text-white">Receive weekly insights directly in your inbox.</h3> <div class="container text-center py-4">
<p class="lead mb-4 font-sans text-light">Join our community and get our latest thoughts sent straight to you. <?php $author_image = get_theme_mod('author_image_url', ''); ?>
</p> <?php if ($author_image): ?>
<form class="mx-auto" style="max-width: 500px;"> <img src="<?php echo esc_url($author_image); ?>"
<div class="input-group input-group-lg shadow"> alt="<?php echo esc_attr(get_theme_mod('author_name', 'David Clemetson')); ?>"
<input type="email" placeholder="Your email address" class="form-control border-0 px-4" required> class="rounded-circle mb-4 shadow-sm"
<button type="submit" class="btn btn-secondary px-5 border-0 fw-bold text-uppercase h-100"> style="width: 150px; height: 150px; object-fit: cover; border: 4px solid white;">
Subscribe <?php else: ?>
</button> <div class="rounded-circle mb-4 shadow-sm mx-auto bg-secondary d-flex align-items-center justify-content-center text-white display-4"
</div> style="width: 150px; height: 150px; border: 4px solid white;">
</form> <?php
</div> $name = get_theme_mod('author_name', 'David Clemetson');
</section> echo esc_html(substr($name, 0, 1));
?>
</div>
<?php endif; ?>
<h2 class="display-6 fw-bold font-serif mb-3 text-dark">
<?php echo esc_html(get_theme_mod('author_name', 'David Clemetson')); ?></h2>
<p class="lead font-sans text-muted mx-auto" style="max-width: 680px;">
<?php echo wp_kses_post(get_theme_mod('author_bio', 'Exploring the intersection of faith, leadership, and modern life. Join me on a journey to uncover timeless wisdom.')); ?>
</p>
</div>
</section>
<?php endif; ?>
<?php get_template_part('template-parts/newsletter'); ?>
<?php <?php
get_footer(); get_footer();

View File

@@ -40,11 +40,17 @@ function wisdom1_scripts()
// Enqueue Bootstrap CSS // Enqueue Bootstrap CSS
wp_enqueue_style('bootstrap-style', 'https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css', array(), '5.3.3'); wp_enqueue_style('bootstrap-style', 'https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css', array(), '5.3.3');
// Enqueue AOS (Animate On Scroll) CSS
wp_enqueue_style('aos-style', 'https://unpkg.com/aos@2.3.1/dist/aos.css', array(), '2.3.1');
// Enqueue Theme CSS (depends on Bootstrap so it loads after) // Enqueue Theme CSS (depends on Bootstrap so it loads after)
wp_enqueue_style('wisdom1-style', get_stylesheet_uri(), array('bootstrap-style'), '1.1.0'); wp_enqueue_style('wisdom1-style', get_stylesheet_uri(), array('bootstrap-style'), '1.1.0');
// Enqueue Bootstrap JS Bundle (includes Popper) // Enqueue Bootstrap JS Bundle (includes Popper)
wp_enqueue_script('bootstrap-script', 'https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js', array(), '5.3.3', true); wp_enqueue_script('bootstrap-script', 'https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js', array(), '5.3.3', true);
// Enqueue AOS Script
wp_enqueue_script('aos-script', 'https://unpkg.com/aos@2.3.1/dist/aos.js', array(), '2.3.1', true);
} }
add_action('wp_enqueue_scripts', 'wisdom1_scripts'); add_action('wp_enqueue_scripts', 'wisdom1_scripts');
@@ -114,6 +120,94 @@ function wisdom1_customize_register($wp_customize)
'section' => 'wisdom1_hero_section', 'section' => 'wisdom1_hero_section',
'settings' => 'hero_background_image', 'settings' => 'hero_background_image',
))); )));
// Add Author Section (Front Page)
$wp_customize->add_section('wisdom1_author_section', array(
'title' => __('Author Section (Front Page)', 'wisdom1'),
'priority' => 32,
));
// Enable Author Section
$wp_customize->add_setting('show_author_section', array(
'default' => true,
'sanitize_callback' => 'rest_sanitize_boolean',
));
$wp_customize->add_control('show_author_section', array(
'label' => __('Show Author Section', 'wisdom1'),
'section' => 'wisdom1_author_section',
'type' => 'checkbox',
));
// Author Name
$wp_customize->add_setting('author_name', array(
'default' => 'David Clemetson',
'sanitize_callback' => 'sanitize_text_field',
));
$wp_customize->add_control('author_name', array(
'label' => __('Author Name', 'wisdom1'),
'section' => 'wisdom1_author_section',
'type' => 'text',
));
// Author Bio
$wp_customize->add_setting('author_bio', array(
'default' => 'Exploring the intersection of faith, leadership, and modern life. Join me on a journey to uncover timeless wisdom.',
'sanitize_callback' => 'wp_kses_post',
));
$wp_customize->add_control('author_bio', array(
'label' => __('Author Bio', 'wisdom1'),
'section' => 'wisdom1_author_section',
'type' => 'textarea',
));
// Author Image
$wp_customize->add_setting('author_image_url', array(
'default' => '',
'sanitize_callback' => 'esc_url_raw',
));
$wp_customize->add_control(new WP_Customize_Image_Control($wp_customize, 'author_image_url', array(
'label' => __('Author Image', 'wisdom1'),
'section' => 'wisdom1_author_section',
)));
// Add Newsletter Section
$wp_customize->add_section('wisdom1_newsletter_section', array(
'title' => __('Newsletter Section', 'wisdom1'),
'priority' => 35,
));
// Newsletter Headline
$wp_customize->add_setting('newsletter_headline', array(
'default' => 'Receive weekly insights directly in your inbox.',
'sanitize_callback' => 'sanitize_text_field',
));
$wp_customize->add_control('newsletter_headline', array(
'label' => __('Headline', 'wisdom1'),
'section' => 'wisdom1_newsletter_section',
'type' => 'text',
));
// Newsletter Subheadline
$wp_customize->add_setting('newsletter_subheadline', array(
'default' => 'Join our community and get our latest thoughts sent straight to you.',
'sanitize_callback' => 'sanitize_text_field',
));
$wp_customize->add_control('newsletter_subheadline', array(
'label' => __('Subheadline', 'wisdom1'),
'section' => 'wisdom1_newsletter_section',
'type' => 'textarea',
));
// Newsletter Button Text
$wp_customize->add_setting('newsletter_button_text', array(
'default' => 'Subscribe',
'sanitize_callback' => 'sanitize_text_field',
));
$wp_customize->add_control('newsletter_button_text', array(
'label' => __('Button Text', 'wisdom1'),
'section' => 'wisdom1_newsletter_section',
'type' => 'text',
));
} }
add_action('customize_register', 'wisdom1_customize_register'); add_action('customize_register', 'wisdom1_customize_register');

44
google-login-plan.md Normal file
View File

@@ -0,0 +1,44 @@
# Google Login & User Registration Implementation Plan
To allow users to seamlessly register, log in, and interact with the Wisdom1 site using their Google accounts, we will use a secure OAuth bridging plugin. This is the industry-standard approach for WordPress.
## Recommended Plugin
**Nextend Social Login and Register**
- Free for Google integration.
- Highly secure (uses native Google OAuth 2.0).
- Does NOT store user passwords.
- Automatically creates a native WordPress "Subscriber" account upon first login, granting them permission to comment.
## Step 1: Google Cloud Configuration (Manual Setup)
Before activating the plugin on the site, you must generate secure OAuth credentials from your Google account.
1. Log into the [Google Developer Console](https://console.cloud.google.com/).
2. Create a new Project (e.g., "Wisdom1 Auth").
3. Navigate to **APIs & Services > OAuth consent screen** and configure it for "External" users.
4. Navigate to **Credentials > Create Credentials > OAuth client ID**.
5. Select **Web application** as the application type.
6. Under **Authorized redirect URIs**, add the specific URL the Nextend plugin generates (this will be provided once the plugin is installed, typically `http://wisdom1.local/wp-login.php?loginSocial=google`).
7. Once created, you will be provided a **Client ID** and a **Client Secret**. Keep these secure.
## Step 2: WordPress Plugin Setup
1. Install and activate the `nextend-facebook-connect` plugin.
2. Navigate to **Settings > Nextend Social Login**.
3. Enable the Google provider.
4. Paste the **Client ID** and **Client Secret** generated in Step 1.
5. Verify the connection through the plugin's test panel.
## Step 3: Custom Theme Integration (Development)
Rather than relying on the plugin's default styling, we will seamlessly integrate the login flow into the `wisdom1` theme's aesthetic.
### Modifications Required:
1. **`comments.php`**:
- Intercept the logged-out state.
- Replace the standard name/email/website form fields with a prominent, beautifully styled **"Continue with Google"** button.
- When clicked, this button will direct the user through the Google OAuth flow and redirect them back to the article, fully logged in.
2. **`functions.php`**:
- Ensure the user's Google display name is correctly mapped to their WordPress display name so that comments render beautifully.
## Verification
- Test clicking "Continue with Google" as a logged-out guest.
- Authenticate with a personal Google account.
- Verify that a new WordPress user is provisioned in the database.
- Verify the user is redirected back to the article and is able to leave a personalized comment.

View File

@@ -9,20 +9,19 @@
<link <link
href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&family=Playfair+Display:ital,wght@0,700;1,700&display=swap" href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&family=Playfair+Display:ital,wght@0,700;1,700&display=swap"
rel="stylesheet"> rel="stylesheet">
<!-- Alpine.js for lightweight interactivity -->
<script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.min.js"></script>
<?php wp_head(); ?> <?php wp_head(); ?>
</head> </head>
<body <?php body_class('bg-light'); ?> x-data="{ searchOpen: false }"> <body <?php body_class('bg-light'); ?>>
<?php wp_body_open(); ?> <?php wp_body_open(); ?>
<div id="page" class="site d-flex flex-column min-vh-100"> <div id="page" class="site d-flex flex-column min-vh-100">
<header id="masthead" class="site-header sticky-top bg-white shadow-sm"> <header id="masthead" class="site-header sticky-top bg-white shadow-sm">
<nav class="navbar navbar-expand-lg navbar-light container py-3"> <nav class="navbar navbar-expand-lg navbar-light container py-3">
<a href="<?php echo esc_url(home_url('/')); ?>" <a href="<?php echo esc_url(home_url('/')); ?>"
class="navbar-brand fw-bold fs-4 d-flex align-items-center"> class="navbar-brand fw-bold fs-4 d-flex align-items-center">
<span class="text-primary me-2">W</span> <img src="<?php echo esc_url(get_template_directory_uri() . '/assets/images/logo.svg'); ?>"
<span class="d-none d-sm-inline">Wisdom for the Kingdom</span> alt="<?php bloginfo('name'); ?>" class="me-2" style="height: 40px; width: auto;">
<span class="d-none d-sm-inline">Wisdom from the Kingdom</span>
</a> </a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" <button class="navbar-toggler" type="button" data-bs-toggle="collapse"
@@ -48,7 +47,8 @@
?> ?>
<button <button
class="btn btn-outline-secondary ms-lg-3 rounded-circle p-2 d-flex align-items-center justify-content-center" class="btn btn-outline-secondary ms-lg-3 rounded-circle p-2 d-flex align-items-center justify-content-center"
@click="searchOpen = !searchOpen" aria-label="Toggle search"> data-bs-toggle="collapse" data-bs-target="#searchCollapse" aria-expanded="false"
aria-controls="searchCollapse" aria-label="Toggle search">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"></circle> <circle cx="11" cy="11" r="8"></circle>
@@ -58,13 +58,13 @@
</div> </div>
</nav> </nav>
<!-- Search Overlay (Alpine.js) --> <!-- Search Overlay (Bootstrap Collapse) -->
<div class="search-overlay position-absolute w-100 bg-white border-bottom shadow-sm" x-show="searchOpen" <div class="collapse search-overlay position-absolute w-100 bg-white border-bottom shadow-sm"
x-transition @click.away="searchOpen = false" style="display: none; top: 100%; z-index: 1050;"> id="searchCollapse" style="top: 100%; z-index: 1050;">
<div class="container py-4"> <div class="container py-4">
<form role="search" method="get" class="d-flex" action="<?php echo esc_url(home_url('/')); ?>"> <form role="search" method="get" class="d-flex" action="<?php echo esc_url(home_url('/')); ?>">
<input type="search" class="form-control form-control-lg me-2" placeholder="Search wisdom..." <input type="search" class="form-control form-control-lg me-2" placeholder="Search wisdom..."
value="<?php echo get_search_query(); ?>" name="s" x-ref="searchInput"> value="<?php echo get_search_query(); ?>" name="s">
<button type="submit" class="btn btn-primary btn-lg px-4">Search</button> <button type="submit" class="btn btn-primary btn-lg px-4">Search</button>
</form> </form>
</div> </div>

View File

@@ -8,47 +8,66 @@ get_header();
<div class="bg-light py-5 border-bottom mb-5"> <div class="bg-light py-5 border-bottom mb-5">
<div class="container text-center"> <div class="container text-center">
<h1 class="display-5 fw-bold mb-3"> <?php if (have_posts()): ?>
<?php <h1 class="display-4 fw-bold mb-3 font-serif">
/* translators: %s: search query. */ <?php printf(esc_html__('Search Results for: %s', 'wisdom1'), '<span class="text-primary">' . get_search_query() . '</span>'); ?>
printf(esc_html__('Search Results for: %s', 'wisdom1'), '<span>' . get_search_query() . '</span>'); </h1>
?> <p class="lead text-muted mx-auto w-75 font-sans">
</h1> <?php printf(esc_html__('Showing results matching your query.'), 'wisdom1'); ?>
</p>
<?php else: ?>
<h1 class="display-4 fw-bold mb-3 font-serif"><?php esc_html_e('Nothing Found', 'wisdom1'); ?></h1>
<p class="lead text-muted mx-auto w-75 font-sans">
<?php esc_html_e('Sorry, but nothing matched your search terms. Please try again with some different keywords.', 'wisdom1'); ?>
</p>
<?php endif; ?>
</div> </div>
</div> </div>
<main id="primary" class="site-main container mb-5"> <div class="container mb-5">
<div class="row g-4"> <main id="primary" class="site-main">
<?php if (have_posts()): ?> <div class="row g-4">
<?php <?php
/* Start the Loop */ if (have_posts()):
while (have_posts()): while (have_posts()):
the_post(); the_post();
get_template_part('template-parts/content', 'card'); get_template_part('template-parts/content', 'card');
endwhile; endwhile;
the_posts_navigation(array( echo '</div>'; // close row
'screen_reader_text' => 'Posts navigation',
'prev_text' => '<span class="btn btn-outline-primary">&larr; Older Results</span>', the_posts_navigation(array(
'next_text' => '<span class="btn btn-outline-primary">Newer Results &rarr;</span>', 'screen_reader_text' => 'Posts navigation',
'class' => 'd-flex justify-content-between my-5 col-12' 'prev_text' => '<span class="btn btn-outline-primary">&larr; Older Results</span>',
)); 'next_text' => '<span class="btn btn-outline-primary">Newer Results &rarr;</span>',
'class' => 'd-flex justify-content-between my-5'
else: ));
?> else:
<div class="col-12 text-center py-5"> ?>
<h2 class="h3 mb-4">Nothing Found</h2> <div class="col-12 col-md-8 mx-auto text-center py-5">
<p class="lead text-muted mb-4">Sorry, but nothing matched your search terms. Please try again with some <div class="card border-0 bg-light p-5 rounded-4 text-center">
different keywords.</p> <svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
<div class="search-container mx-auto" style="max-width: 500px;"> stroke-linecap="round" stroke-linejoin="round" class="text-muted mx-auto mb-4">
<?php get_search_form(); ?> <circle cx="11" cy="11" r="8"></circle>
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
</svg>
<h3 class="h4 font-serif fw-bold mb-3">No matching articles found.</h3>
<p class="text-muted mb-4">Try searching for different keywords or explore our latest articles
below.</p>
<form role="search" method="get" class="d-flex w-75 mx-auto"
action="<?php echo esc_url(home_url('/')); ?>">
<input type="search" class="form-control form-control-lg me-2" placeholder="Search wisdom..."
value="<?php echo get_search_query(); ?>" name="s">
<button type="submit" class="btn btn-primary btn-lg px-4">Search</button>
</form>
</div>
</div> </div>
</div> </div>
<?php <?php
endif; endif;
?> ?>
</div><!-- .row --> </main>
</main><!-- #main --> </div>
<?php <?php
get_footer(); get_footer();

View File

@@ -69,60 +69,49 @@ get_header(); ?>
?> ?>
</div> </div>
</footer><!-- .entry-footer --> </footer><!-- .entry-footer -->
</article><!-- #post-<?php the_ID(); ?> --> <div class="mx-auto px-3 mb-3" style="max-width: 680px;">
<?php
<div class="mx-auto px-3" style="max-width: 680px;"> // If comments are open or we have at least one comment, load up the comment template inside the constrained column.
<nav class="navigation post-navigation mt-5 border-top border-bottom py-4" aria-label="Posts"> if (comments_open() || get_comments_number()):
<div class="row justify-content-between g-4"> comments_template();
<div class="col-md-6 text-start"> endif;
<?php ?>
$prev_post = get_previous_post(); </div>
if (!empty($prev_post)):
?>
<a href="<?php echo esc_url(get_permalink($prev_post->ID)); ?>"
class="text-decoration-none d-flex align-items-center gap-3">
<?php if (has_post_thumbnail($prev_post->ID)): ?>
<?php echo get_the_post_thumbnail($prev_post->ID, 'thumbnail', array('class' => 'post-nav-thumbnail shadow-sm')); ?>
<?php endif; ?>
<div>
<div class="text-muted small fw-bold mb-1 text-uppercase tracking-wider">Previous</div>
<div class="fw-bold text-dark lh-sm"><?php echo esc_html($prev_post->post_title); ?>
</div>
</div>
</a>
<?php endif; ?>
</div>
<div class="col-md-6 text-end">
<?php
$next_post = get_next_post();
if (!empty($next_post)):
?>
<a href="<?php echo esc_url(get_permalink($next_post->ID)); ?>"
class="text-decoration-none d-flex align-items-center justify-content-end gap-3 text-end">
<div>
<div class="text-muted small fw-bold mb-1 text-uppercase tracking-wider">Next</div>
<div class="fw-bold text-dark lh-sm"><?php echo esc_html($next_post->post_title); ?>
</div>
</div>
<?php if (has_post_thumbnail($next_post->ID)): ?>
<?php echo get_the_post_thumbnail($next_post->ID, 'thumbnail', array('class' => 'post-nav-thumbnail shadow-sm')); ?>
<?php endif; ?>
</a>
<?php endif; ?>
</div>
</div>
</nav>
<?php <?php
// If comments are open or we have at least one comment, load up the comment template inside the constrained column. $prev_post = get_previous_post();
if (comments_open() || get_comments_number()): $next_post = get_next_post();
comments_template(); if (!empty($prev_post) || !empty($next_post)):
endif; ?>
?> <div class="mt-5 pt-5 border-top">
</div> <h3 class="h4 font-serif fw-bold mb-4 text-center">More Articles</h3>
<div class="row justify-content-center gx-4 gy-4">
<?php
global $post;
$original_post = $post;
<?php endwhile; // End of the loop. ?> if (!empty($prev_post)) {
$post = $prev_post;
setup_postdata($post);
get_template_part('template-parts/content', 'card');
}
if (!empty($next_post)) {
$post = $next_post;
setup_postdata($post);
get_template_part('template-parts/content', 'card');
}
$post = $original_post;
wp_reset_postdata();
?>
</div>
</div>
<?php endif; ?>
<?php endwhile; // End of the loop. ?>
</main><!-- #main --> </main><!-- #main -->
<?php get_template_part('template-parts/newsletter'); ?>
<?php <?php
get_footer(); get_footer();

View File

@@ -1,6 +1,6 @@
/* /*
Theme Name: Wisdom1 Theme Name: Wisdom1
Description: A modern-classic Christian blog theme for "Wisdom for the Kingdom". Description: A modern-classic Christian blog theme for "Wisdom from the Kingdom".
Version: 1.3.0 Version: 1.3.0
Text Domain: wisdom1 Text Domain: wisdom1
*/ */
@@ -181,21 +181,6 @@ a:hover {
} }
/* --- 3. Custom Brand Additions --- */ /* --- 3. Custom Brand Additions --- */
.logo-icon {
font-family: 'Playfair Display', serif;
font-size: 24px;
font-weight: bold;
border: 2px solid var(--brand-deep-midnight);
color: var(--brand-deep-midnight);
width: 40px;
height: 40px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
}
/* Comments Styling overrides for native wp_list_comments */ /* Comments Styling overrides for native wp_list_comments */
.comment-list { .comment-list {
list-style: none; list-style: none;

View File

@@ -1,4 +1,4 @@
<div class="col-md-6 col-lg-4 d-flex align-items-stretch"> <div class="col-md-6 col-lg-4 d-flex align-items-stretch" data-aos="fade-up">
<article id="post-<?php the_ID(); ?>" <?php post_class('card w-100 border-0 shadow-sm overflow-hidden h-100'); ?>> <article id="post-<?php the_ID(); ?>" <?php post_class('card w-100 border-0 shadow-sm overflow-hidden h-100'); ?>>
<?php if (has_post_thumbnail()): ?> <?php if (has_post_thumbnail()): ?>
<a href="<?php the_permalink(); ?>"> <a href="<?php the_permalink(); ?>">

View File

@@ -0,0 +1,18 @@
<section class="bg-primary text-white py-5 mt-5">
<div class="container text-center py-5">
<h3 class="display-6 fw-bold mb-4 font-serif text-white">
<?php echo esc_html(get_theme_mod('newsletter_headline', 'Receive weekly insights directly in your inbox.')); ?>
</h3>
<p class="lead mb-4 font-sans text-light">
<?php echo esc_html(get_theme_mod('newsletter_subheadline', 'Join our community and get our latest thoughts sent straight to you.')); ?>
</p>
<form class="mx-auto" style="max-width: 500px;">
<div class="input-group input-group-lg shadow">
<input type="email" placeholder="Your email address" class="form-control border-0 px-4" required>
<button type="submit" class="btn btn-secondary px-5 border-0 fw-bold text-uppercase h-100">
<?php echo esc_html(get_theme_mod('newsletter_button_text', 'Subscribe')); ?>
</button>
</div>
</form>
</div>
</section>