我是Wordpress中级开发人员和javascript / jquery新手 . 我最近被要求查看是否可以创建一个众多员工可以在一天中添加的众包网页表单( 生产环境 说明),然后每天下午5点自动提交表单,这会将结果发送到所有员工 . 如果员工没有添加任何备注,则表单不应自动提交 .
尝试将项目分解为其组件:
-
众包形式
-
函数检查空字段和自动提交表单
-
Wordpress cron作业每天下午5点运行自动提交功能
该表单由wordpress插件强大的专业表单提供支持,我用于所有客户的所有webforms,它很棒 . 在其中,我有一个 生产环境 备注表单,可以为登录用户保存“草稿” . 我的想法是,我会让所有需要访问该表单的员工同一个用户,这样他们就可以添加并保存表单的草稿 .
该表单位于包含自定义页面模板的页面上 . 我已经使用以下代码进行了javascript submit-button点击:
<script type="application/javascript">
function send_production_notes($) {
if( $('.production-date-field input').val() == '' ) {
return;
} else {
$('#production-submit').click();
}
};
</script>
脚本检查日期字段以查看它是否为空,如果没有则单击提交按钮 . 这个想法是,如果用户有共享笔记,用户将始终将日期添加到日期字段中 - 并且他们将以这种方式进行培训 .
然后,我致力于安排Cron Job:
register_activation_hook(__FILE__, 'ag_send_production_notes_scheduler');
function ag_send_production_notes_scheduler() {
if (! wp_next_scheduled ( 'ag_send_production_notes' )) {
//Schedule the event, then to repeat daily using the hook 'ag_send_production_notes'
wp_schedule_event( '1485540300', 'daily', 'ag_send_production_notes' );
}
}
//Hook our function , ag_production_notes(), into the action ag_send_production_notes
add_action( 'ag_send_production_notes', 'ag_production_notes' );
function ag_production_notes(){
if( is_page('production-notes') ) {
echo '<script type="application/javascript">send_production_notes();</script>';
}
}
忽略 wp_schedule_event
的细节,我尝试了几个不同的东西,所以UNIX时间戳是错误的 . 我知道cron工作有效,因为在测试过程中我添加了一个快速的php电子邮件到该函数,并按预期触发和发送 .
我也知道javascript函数有效,我已经在页面上通过将函数包装在 jQuery(document).ready()
处理程序中进行了测试 - 当日期字段为空时,它什么也没做 . 但是,如果我添加了日期字段,则保存了一份草稿(刷新了页面),它就像它应该提交的那样 . 但我不能这样,因为我需要在没有实际加载页面的情况下运行该函数 .
我想我的代码中有一些根本错误,或者缺少一些基本概念 . 我也不确定php is_page
条件,但我发现在研究时我需要它只在相关页面上运行javascript .
最后,我需要cron作业能够在每天下午5点触发javascript提交功能 . 我不知道它是否可能,或者是否有像我这样的javascript / jQuery newb的更好方法 . 这也是我第一次搞乱Wordpress cron的工作,但我知道他们只有在有人访问网站时才会被解雇 - 这对我们来说不是问题 .
我不知道完整的功能是需要在我的functions.php文件中,还是在 生产环境 注释页面本身 .
我还从他们的文档中检查了强大的表单操作,并没有看到任何提交表单或将草稿转换为条目的操作 . 感谢您的时间和建设性的帮助!
1 回答
这里的方法似乎很容易发生事故(想象一下,如果有人退回其他人的草案[意外与否]!),我会建议你稍微改变一下这个问题 .
如果我接受了这项任务,我的方法是让 Worker 输入他们的笔记,然后提交表格 . 在后端,我将“创建日期时间”存储在数据库的一个字段中,这将创建标记的条目 . 也许插件已经这样做了?也许它需要更新?
此时,您下午5:00的cron作业收集当天的所有提交内容,编译它们,然后将编译发送到相应的电子邮件分发列表 .
您可以确定是保留数据还是将其丢弃 . 我的个人建议是保留它 . 您将始终可以参考以后的内容,甚至可以编写一些报告工具来显示用户提交的提交数量(因为您可以允许每个员工登录到更符合Sarbanes-Oxley标准的特定用户,等等 .
你永远不会有太多的数据,所以让他们提交所有内容,尽管他们可以,把编译和转发设置到它应该的时间 .
编辑1:创建特定时间的一天 .
您将要使用一组函数进行日期计算,并使用SetInterval在给定时间执行脚本 .
以下代码执行以下操作:
设置我们正在检查的日期/时间(在您的情况下,下午5:00)小时格式)
如果我们已经过了一段时间,请提前24小时移动支票以防止执行
如果我们在写入时调用我们的函数来执行我们的任务
我们执行任务的函数,通过DOM中的ID句柄在页面上提交表单 .
var now = new Date();
var millis_until_cutoff = new Date(now.getFullYear(),now.getMonth(),now.getDate(),17,0,0,0) - now;
if(millis_until_cutoff <0){//我们过去的时间过去了,明天保持不变millis_until_cutoff = 86400000; } // END IF MILLIS_UNTIL_CUTOFF
//在指定的时间执行我们的功能setTimeout(submit_production_form(),millis_until_cutoff);
function submit_production_form(){$('#production_form_id') . submit(); } // END FUNCTION SUBMIT_PRODUCTION_FORM
这应该处理你想要完成的事情 . 您的插件需要将其插入到您正在执行表单的页面中,并确保更改函数中表单的id(#) . 此外,请记住此方法存在一些问题,在此页面上打开多个窗口将导致多个提交,打开此页面的多个用户将无法看到彼此编辑 .