为wordpress自定义一个留言表单并可以在后台进行管理的实现方法
要为WordPress添加留言表单功能并实现后台管理,你可以按照以下步骤操作:
1. 创建留言表单
首先,你需要创建一个留言表单。可以使用插件(如Contact Form 7)或手动编写代码。
使用Contact Form 7插件
安装并激活Contact Form 7插件。
创建一个新表单,添加以下字段:
姓名(单行文本框)
邮箱(邮箱输入框)
电话(单行文本框)
地址(单行文本框)
留言内容(多行文本框)
将生成的短代码插入到页面或文章中。
手动编写代码
如果你更喜欢手动编写代码,可以在主题的functions.php文件中添加以下代码:
function custom_contact_form() {ob_start(); ?><form action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>" method="post"><p><label for="name">姓名</label><input type="text" name="name" required></p><p><label for="email">邮箱</label><input type="email" name="email" required></p><p><label for="phone">电话</label><input type="text" name="phone" required></p><p><label for="address">地址</label><input type="text" name="address" required></p><p><label for="message">留言内容</label><textarea name="message" required></textarea></p><p><input type="submit" name="submit" value="提交"></p></form><?phpreturn ob_get_clean();
}
add_shortcode('custom_contact_form', 'custom_contact_form');
然后在页面或文章中使用[custom_contact_form]短代码来显示表单。
2. 处理表单提交
在functions.php中添加代码来处理表单提交并将数据保存到数据库中:
function handle_form_submission() {if (isset($_POST['submit'])) {global $wpdb;$table_name = $wpdb->prefix . 'custom_messages';$name = sanitize_text_field($_POST['name']);$email = sanitize_email($_POST['email']);$phone = sanitize_text_field($_POST['phone']);$address = sanitize_text_field($_POST['address']);$message = sanitize_textarea_field($_POST['message']);$wpdb->insert($table_name,array('name' => $name,'email' => $email,'phone' => $phone,'address' => $address,'message' => $message,'status' => '未读','created_at' => current_time('mysql')));}
}
add_action('init', 'handle_form_submission');
3. 创建数据库表
在functions.php中添加代码来创建数据库表:
function create_custom_messages_table() {global $wpdb;$table_name = $wpdb->prefix . 'custom_messages';$charset_collate = $wpdb->get_charset_collate();$sql = "CREATE TABLE $table_name (id mediumint(9) NOT NULL AUTO_INCREMENT,name tinytext NOT NULL,email tinytext NOT NULL,phone tinytext NOT NULL,address tinytext NOT NULL,message text NOT NULL,status tinytext NOT NULL,created_at datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,PRIMARY KEY (id)) $charset_collate;";require_once(ABSPATH . 'wp-admin/includes/upgrade.php');dbDelta($sql);
}
register_activation_hook(__FILE__, 'create_custom_messages_table');
4. 创建后台管理菜单
在functions.php中添加代码来创建后台管理菜单:
function custom_messages_menu() {add_menu_page('留言管理','留言管理','manage_options','custom-messages','custom_messages_page');
}
add_action('admin_menu', 'custom_messages_menu');function custom_messages_page() {global $wpdb;$table_name = $wpdb->prefix . 'custom_messages';$messages = $wpdb->get_results("SELECT * FROM $table_name ORDER BY created_at DESC");echo '<div class="wrap">';echo '<h1>留言管理</h1>';echo '<table class="wp-list-table widefat fixed striped">';echo '<thead><tr><th>ID</th><th>姓名</th><th>邮箱</th><th>电话</th><th>地址</th><th>留言内容</th><th>状态</th><th>操作</th></tr></thead>';echo '<tbody>';foreach ($messages as $message) {echo '<tr>';echo '<td>' . esc_html($message->id) . '</td>';echo '<td>' . esc_html($message->name) . '</td>';echo '<td>' . esc_html($message->email) . '</td>';echo '<td>' . esc_html($message->phone) . '</td>';echo '<td>' . esc_html($message->address) . '</td>';echo '<td>' . esc_html($message->message) . '</td>';echo '<td>' . esc_html($message->status) . '</td>';echo '<td><a href="' . admin_url('admin.php?page=custom-messages&action=mark_as_read&id=' . $message->id) . '">标记为已读</a> |<a href="' . admin_url('admin.php?page=custom-messages&action=mark_as_replied&id=' . $message->id) . '">标记为已回</a> |<a href="' . admin_url('admin.php?page=custom-messages&action=delete&id=' . $message->id) . '">删除</a></td>';echo '</tr>';}echo '</tbody>';echo '</table>';echo '</div>';
}
5. 处理留言管理操作
在functions.php中添加代码来处理留言管理操作(标记为已读、标记为已回、删除):
function handle_custom_messages_actions() {if (isset($_GET['action']) && isset($_GET['id'])) {global $wpdb;$table_name = $wpdb->prefix . 'custom_messages';$id = intval($_GET['id']);if ($_GET['action'] == 'mark_as_read') {$wpdb->update($table_name, array('status' => '已读'), array('id' => $id));} elseif ($_GET['action'] == 'mark_as_replied') {$wpdb->update($table_name, array('status' => '已回'), array('id' => $id));} elseif ($_GET['action'] == 'delete') {$wpdb->delete($table_name, array('id' => $id));}wp_redirect(admin_url('admin.php?page=custom-messages'));exit;}
}
add_action('admin_init', 'handle_custom_messages_actions');
6. 样式和脚本
你可以根据需要添加自定义样式和脚本来美化表单和管理页面。
原文
http://www.shadahan.com/jianzhan/7806.html
相关文章:
为wordpress自定义一个留言表单并可以在后台进行管理的实现方法
要为WordPress添加留言表单功能并实现后台管理,你可以按照以下步骤操作: 1. 创建留言表单 首先,你需要创建一个留言表单。可以使用插件(如Contact Form 7)或手动编写代码。 使用Contact Form 7插件 安装并激活Contact Form 7插件。 创建…...

tauri-plugin-shell插件将_blank的a标签用浏览器打开了,,,解决办法
不要使用这个插件,这个插件默认会将网页中a标签为_blank的使用默认浏览器打开,但是这种做法在我的程序里不是很友好,我需要自定义这种行为,当我点击我自己的链接的时候,使用默认浏览器打开,当点击别的链接的…...

【大模型基础_毛玉仁】1.1 基于统计方法的语言模型
【大模型基础_毛玉仁】1.1 基于统计方法的语言模型 1.语言模型基础1.1 基于统计方法的语言模型1.1.1 n-grams 语言模型1.1.2 n-grams 的统计学原理 1.语言模型基础 语言是概率的。语言模型(LanguageModels, LMs)旨在准确预测语言符号的概率。 将按照语…...
使用 Docker 部署 RabbitMQ 并实现数据持久化
非常好!以下是一份完整的 Docker 部署 RabbitMQ 的博客文档,包含从安装到问题排查的详细步骤。你可以直接将其发布到博客中。 使用 Docker 部署 RabbitMQ 并实现数据持久化 RabbitMQ 是一个开源的消息队列系统,广泛应用于分布式系统中。使用…...
Pandas的数据转换函数
Pandas的数据转换函数:map, apply, applymap 参数描述map只用于Series,实现每个值->值的映射apply用于Series实现每个值的处理,用于DataFrame实现某个轴的Series的处理applymap只能用于DataFrame, 用于处理该DataFrame的每个元素 1. map用于Series值…...

影刀 RPA 实战开发阶段总结
目录 1. 影刀 RPA 官方教程的重要性 1.1系统全面的知识体系 1.2 权威准确的技术指导 1.3 贴合实际的案例教学 1.4高效的学习方法引导 2. 官方视频教程与实战 2.1 官方视频教程:奠定坚实基础 2.2 实战:拓展应用视野 3. 往期实战博文导航 3.1 初级…...
Linux系统上安装kafka
目录 1. 安装Java环境 2. 下载和解压Kafka 3. 配置Kafka 4. 启动ZooKeeper和Kafka 5. 测试Kafka 6. 停止服务 7.常见问题 1. 安装Java环境 Kafka依赖Java运行环境(JDK 8或更高版本): # 安装OpenJDK(推荐) yum…...

DeepSeek如何快速开发PDF转Word软件
一、引言 如今,在线工具的普及让PDF转Word成为了一个常见需求,常见的PDF转Word工具有收费的WPS,免费的有PDFGear,以及在线工具SmallPDF、iLovePDF、24PDF等。然而,大多数免费在线转换工具存在严重隐私风险——文件需上…...

虚拟机 | Ubuntu图形化系统: open-vm-tools安装失败以及实现文件拖放
系列文章目录 虚拟机 | Ubuntu 安装流程以及界面太小问题解决 文章目录 系列文章目录虚拟机 | Ubuntu 安装流程以及界面太小问题解决 前言一、VMware Tools 和 open-vm-tools 是什么1、VMware Tools2、open-vm-tools 二、推荐使用open-vm-tools(简单)1、…...
Mysql-经典故障案例(1)-主从同步由于主键问题引发的故障
故障报错 Could not execute Write_rows event on table test.users; Duplicate entry 3 for key PRIMARY, Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the events master log mysql-bin.000031, end_log_pos 3297这是由于从库存在与主库相同主键值,…...

Linux下学【MySQL】中如何实现:多表查询(配sql+实操图+案例巩固 通俗易懂版~)
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本章是MySQL篇中,非常实用性的篇章,相信在实际工作中对于表的查询,很多时候会涉及多表的查询,在多表查询…...

ubuntu局域网部署stable-diffusion-webui记录
需要局域网访问,如下设置: 过程记录查看源码: 查看源码,原来修改参数:--server-name 故启动: ./webui.sh --server-name0.0.0.0 安装下载记录: 快速下载可设置: export HF_ENDPOI…...
最基于底层的运算符——位运算符
位运算符是直接对二进制位(bit)进行操作的运算符,它们在底层开发、算法优化和特定场景(如位掩码、数据压缩)中非常高效。以下是常见位运算符的详解、使用技巧及注意事项: 一、六大核心位运算符 1. 按位与&…...

代码随想录算法训练营第三十二天 | 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
509. 斐波那契数 力扣题目链接(opens new window) 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n -…...
3-9 WPS JS宏单元格复制、重定位应用(拆分单表到多表)
************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...
C++ 中前置 `++` 与后置 `++` 运算符重载
C 中前置 与后置 运算符重载的设计原理与使用规范 1. 为什么后置 返回对象而不是引用? 原因: 后置 需要返回自增前的旧值,但旧值在运算后已被修改。为了保存旧值,必须在函数内部创建一个临时对象(拷贝原对象的状态…...
Scala:case class(通俗易懂版)
1. case class 是什么? 想象你要做一个表格,比如学生信息表,每一行需要填:姓名、年龄、成绩。 在代码里,这种“表格的一行”就是一个数据对象,case class 就是帮你快速创建这种“表格行”的工具。 普通方…...
Vue、React、原生小程序的写法对比差异
以下是从 变量、方法、路由、状态管理、父子传值 等多个维度对 Vue、React、原生小程序 的对比表格: 技术对比表格 功能/技术Vue (Options/Composition API)React (Hooks)原生微信小程序变量定义data() { return { count: 0 } }(Options API)const count = ref(0)(Composition…...

【AIGC系列】6:HunyuanVideo视频生成模型部署和代码分析
AIGC系列博文: 【AIGC系列】1:自编码器(AutoEncoder, AE) 【AIGC系列】2:DALLE 2模型介绍(内含扩散模型介绍) 【AIGC系列】3:Stable Diffusion模型原理介绍 【AIGC系列】4࿱…...
java 初学知识点总结
自己总结着玩 1.基本框架 public class HelloWorld{ public static void main(String[] args){ }//类名用大写字母开头 } 2.输入: (1)Scanner:可读取各种类型,字符串相当于cin>>; Scanner anew Scanner(System.in); Scan…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...