本文将介绍如何在WordPress网站上实现暗模式,而无需使用插件或第三方库或解决方案。

对于这个具体的用例,我有一些要求。首先,我希望当用户切换到暗模式时,它能够立即显示在网站上,而无需重新加载页面。我还希望它能够记住用户的偏好,无论他们是否登录。为了实现这一功能,我决定使用Cookie来记住未登录用户的偏好,但如果用户已登录,则使用更持久化的WordPress数据库。

暗模式的实际切换比较简单。我们只需在 body 元素中添加一个 class,然后可以使用 CSS 创建一个暗模式样式表。

/* 标准卡样式 */
.custom_card {
background: white;
}

/* 暗模式卡样式 */
body.cwp_dark .custom_card {
background: black;
}

主要代码段

为了测试 CodeWP 的功能,我想一次性创建代码段。这样做的好处是代码将保持一致性和相关性,这意味着我不需要进行切换占位符类和其他通用元素。

以下是我提供的提示。在进入生成器时,我排除了项目符号,只使用换行符。

名为'darkmode'的复选框的简码。 如果用户已登录且复选框已选中,则使用 AJAX 将用户的“cwp_dark”元字段设置为 1,如果未选中则设置为 0。如果该字段等于 1,则将 body 类设置为“cwp_dark”。 包含 AJAX 函数代码。 如果用户未登录且复选框已选中,则设置 cookie“cwp_dark”,如果未选中则删除 cookie。如果存在 cookie,则将 body 类设置为“cwp_dark”。 如果 usermeta 为 1,或存在 cookie,则将类“cwp_dark”添加到 body,并使复选框选中。 在页脚添加 JS,根据复选框状态切换类“cwp_dark”(无需重新加载页面)。

这个提示的思路比较简单。首先,我们将创建一个简码,将切换元素添加到前端。

然后,如果切换了,并且用户已登录,我们将使用 AJAX 更新数据库中的用户偏好。如果用户未登录,我们将设置一个 cookie,它将保存用户的偏好在浏览器中。

如果选中,或如果通过 cookie 或 user meta-value 切换了暗模式,我们将向 body 添加一个类。

最后,我还想确保包括 JavaScript,它将在不重新加载页面的情况下向 body 添加类。因此,当用户选中复选框时,它会立即在暗模式和亮模式之间切换,同时记住用户在将来访问网站或导航到新页面时的偏好。

以下是我们得到的代码。

function cwpai_darkmode_shortcode() {
    if (is_user_logged_in()) {
        $user_id = get_current_user_id();
        $darkmode = get_user_meta($user_id, 'cwp_dark', true);
        if ($darkmode == 1) {
            $checked = 'checked';
        } else {
            $checked = '';
        }
        $output = '<input type="checkbox" id="cwp_darkmode" name="cwp_darkmode" value="1" '.$checked.'>';
        $output .= '<label for="cwp_darkmode">Dark Mode</label>';
        $output .= '<script>
            jQuery(document).ready(function($) {
                $("#cwp_darkmode").change(function() {
                    var darkmode = $(this).prop("checked");
                    if (darkmode == true) {
                        var darkmode = 1;
                    } else {
                        var darkmode = 0;
                    }
                    $.ajax({
                        type: "POST",
                        url: "'.admin_url('admin-ajax.php').'",
                        data: {
                            action: "cwpai_darkmode",
                            darkmode: darkmode
                        },
                        success: function(data) {
                            if (darkmode == 1) {
                                $("body").addClass("cwp_dark");
                            } else {
                                $("body").removeClass("cwp_dark");
                            }
                        }
                    });
                });
            });
        </script>';
    } else {
        if (isset($_COOKIE['cwp_dark'])) {
            $checked = 'checked';
        } else {
            $checked = '';
        }
        $output = '<input type="checkbox" id="cwp_darkmode" name="cwp_darkmode" value="1" '.$checked.'>';
        $output .= '<label for="cwp_darkmode">Dark Mode</label>';
        $output .= '<script>
            jQuery(document).ready(function($) {
                $("#cwp_darkmode").change(function() {
                    var darkmode = $(this).prop("checked");
                    if (darkmode == true) {
                        document.cookie = "cwp_dark=1; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/";
                        $("body").addClass("cwp_dark");
                    } else {
                        document.cookie = "cwp_dark=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
                        $("body").removeClass("cwp_dark");
                    }
                });
            });
        </script>';
    }
    return $output;
}
add_shortcode('darkmode', 'cwpai_darkmode_shortcode');
function cwpai_darkmode_ajax() {
    $user_id = get_current_user_id();
    $darkmode = $_POST['darkmode'];
    update_user_meta($user_id, 'cwp_dark', $darkmode);
    die();
}
add_action('wp_ajax_cwpai_darkmode', 'cwpai_darkmode_ajax');
add_action('wp_ajax_nopriv_cwpai_darkmode', 'cwpai_darkmode_ajax');
function cwpai_darkmode_body_class($classes) {
    if (is_user_logged_in()) {
        $user_id = get_current_user_id();
        $darkmode = get_user_meta($user_id, 'cwp_dark', true);
        if ($darkmode == 1) {
            $classes[] = 'cwp_dark';
        }
    } else {
        if (isset($_COOKIE['cwp_dark'])) {
            $classes[] = 'cwp_dark';
        }
    }
    return $classes;
}
add_filter('body_class', 'cwpai_darkmode_body_class');

COPY GENERATION ID: 7851

它在第一次运行时就能完美地工作(只要您已经创建了自定义暗模式样式表)。为了提高生产网站的性能,我会将 jQuery 从简码中移出,并在前端页脚中对其进行排队。

function cwpai_enqueue_custom_js() {
    global $post;
    if (is_a($post, 'WP_Post') && has_shortcode($post->post_content, 'need_to_be_here')) {
        wp_enqueue_script('custom', get_stylesheet_directory_uri() . '/custom.js', array(), '1.0', true);
    }
}
add_action('wp_enqueue_scripts', 'cwpai_enqueue_custom_js');

COPY GENERATION ID: 7858

提示:// 在页脚中排队文件“custom.js”,仅当页面上存在简码“need_to_be_here”时。

^^ 这是一个优雅的做法。

我现在唯一想做的事情就是将该复选框样式化,使其更具视觉吸引力。为此,我将跳转到 CodePen,找到一些 CSS 来设置暗模式切换的样式,然后将其添加到我的项目中。

就这样,您无需插件即可在 WordPress 网站上添加一个非常健壮的暗模式功能。

WordPress网站无需插件实现暗模式 - 代码示例

原文地址: https://www.cveoy.top/t/topic/n6rb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录