Compare commits
10 Commits
b60b8b0295
...
e265f2c2cb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e265f2c2cb | ||
|
|
e9c6786450 | ||
|
|
0eb83a8515 | ||
|
|
4752eec5d0 | ||
|
|
7ffd5532f9 | ||
|
|
bd5222443f | ||
|
|
cd0a626c33 | ||
|
|
3597ef9008 | ||
|
|
e1f4370341 | ||
|
|
c05a2980bb |
BIN
assets/.DS_Store
vendored
Normal file
BIN
assets/.DS_Store
vendored
Normal file
Binary file not shown.
47
assets/images/logo.svg
Normal file
47
assets/images/logo.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 42 KiB |
14
comments.php
14
comments.php
@@ -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) {
|
||||||
|
|||||||
27
footer.php
27
footer.php
@@ -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">© <?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>
|
||||||
@@ -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"
|
||||||
|
style="width: 150px; height: 150px; border: 4px solid white;">
|
||||||
|
<?php
|
||||||
|
$name = get_theme_mod('author_name', 'David Clemetson');
|
||||||
|
echo esc_html(substr($name, 0, 1));
|
||||||
|
?>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
<?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>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php get_template_part('template-parts/newsletter'); ?>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
get_footer();
|
get_footer();
|
||||||
|
|||||||
@@ -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
44
google-login-plan.md
Normal 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.
|
||||||
20
header.php
20
header.php
@@ -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>
|
||||||
|
|||||||
55
search.php
55
search.php
@@ -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>
|
</h1>
|
||||||
|
<p class="lead text-muted mx-auto w-75 font-sans">
|
||||||
|
<?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">
|
||||||
|
<main id="primary" class="site-main">
|
||||||
<div class="row g-4">
|
<div class="row g-4">
|
||||||
<?php if (have_posts()): ?>
|
|
||||||
<?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;
|
||||||
|
|
||||||
|
echo '</div>'; // close row
|
||||||
|
|
||||||
the_posts_navigation(array(
|
the_posts_navigation(array(
|
||||||
'screen_reader_text' => 'Posts navigation',
|
'screen_reader_text' => 'Posts navigation',
|
||||||
'prev_text' => '<span class="btn btn-outline-primary">← Older Results</span>',
|
'prev_text' => '<span class="btn btn-outline-primary">← Older Results</span>',
|
||||||
'next_text' => '<span class="btn btn-outline-primary">Newer Results →</span>',
|
'next_text' => '<span class="btn btn-outline-primary">Newer Results →</span>',
|
||||||
'class' => 'd-flex justify-content-between my-5 col-12'
|
'class' => 'd-flex justify-content-between my-5'
|
||||||
));
|
));
|
||||||
|
|
||||||
else:
|
else:
|
||||||
?>
|
?>
|
||||||
<div class="col-12 text-center py-5">
|
<div class="col-12 col-md-8 mx-auto text-center py-5">
|
||||||
<h2 class="h3 mb-4">Nothing Found</h2>
|
<div class="card border-0 bg-light p-5 rounded-4 text-center">
|
||||||
<p class="lead text-muted mb-4">Sorry, but nothing matched your search terms. Please try again with some
|
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
|
||||||
different keywords.</p>
|
stroke-linecap="round" stroke-linejoin="round" class="text-muted mx-auto mb-4">
|
||||||
<div class="search-container mx-auto" style="max-width: 500px;">
|
<circle cx="11" cy="11" r="8"></circle>
|
||||||
<?php get_search_form(); ?>
|
<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();
|
||||||
|
|||||||
77
single.php
77
single.php
@@ -69,50 +69,7 @@ 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;">
|
||||||
|
|
||||||
<div class="mx-auto px-3" style="max-width: 680px;">
|
|
||||||
<nav class="navigation post-navigation mt-5 border-top border-bottom py-4" aria-label="Posts">
|
|
||||||
<div class="row justify-content-between g-4">
|
|
||||||
<div class="col-md-6 text-start">
|
|
||||||
<?php
|
|
||||||
$prev_post = get_previous_post();
|
|
||||||
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.
|
// If comments are open or we have at least one comment, load up the comment template inside the constrained column.
|
||||||
if (comments_open() || get_comments_number()):
|
if (comments_open() || get_comments_number()):
|
||||||
@@ -121,8 +78,40 @@ get_header(); ?>
|
|||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
$prev_post = get_previous_post();
|
||||||
|
$next_post = get_next_post();
|
||||||
|
if (!empty($prev_post) || !empty($next_post)):
|
||||||
|
?>
|
||||||
|
<div class="mt-5 pt-5 border-top">
|
||||||
|
<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;
|
||||||
|
|
||||||
|
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. ?>
|
<?php endwhile; // End of the loop. ?>
|
||||||
</main><!-- #main -->
|
</main><!-- #main -->
|
||||||
|
|
||||||
|
<?php get_template_part('template-parts/newsletter'); ?>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
get_footer();
|
get_footer();
|
||||||
|
|||||||
17
style.css
17
style.css
@@ -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;
|
||||||
|
|||||||
@@ -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(); ?>">
|
||||||
|
|||||||
18
template-parts/newsletter.php
Normal file
18
template-parts/newsletter.php
Normal 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>
|
||||||
Reference in New Issue
Block a user