Wordpress Cron Job调用javascript函数提交webform

时间:2017-01-27 19:49:43

标签: javascript php jquery wordpress cron

我是Wordpress中级开发人员和javascript / jquery新手。我最近被要求查看是否可以创建一个众多员工可以在一天中添加的众包网页表单(生产说明),然后每天下午5点自动提交表单,这会将结果发送到所有员工。如果员工没有添加任何备注,则表单不应自动提交。

试图将项目分解为其组件:

  1. 众包形式
  2. 检查空字段和自动提交表单的功能
  3. Wordpress cron作业每天下午5点运行自动提交功能
  4. 该表单由wordpress插件强大的专业表单提供支持,我将其用于所有客户的所有webforms并且它非常棒。在其中,我有一个生产笔记表格,能够保存"草稿"对于已登录的用户。我的想法是,我会让所有需要访问相同用户表单的员工,以便他们可以添加并保存表单的草稿。

    表单位于包含自定义页面模板的页面上。我已经使用以下代码进行了javascript提交按钮点击:

    <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 个答案:

答案 0 :(得分:0)

这里的方法似乎很容易发生事故(想象一下,如果有人退出其他人的草案[意外与否]!),我会建议你稍微改变一下这个问题。

如果我接受了这项任务,我的方法是让工人输入他们的笔记,并提交表格。在后端,我将“创建日期时间”存储在数据库的一个字段中,这将创建标记的条目。也许插件已经这样做了?也许它需要更新?

此时,您下午5:00的cron作业收集当天的所有提交内容,编译它们,然后将编译发送到相应的电子邮件分发列表。

您可以确定是保留数据还是将其丢弃。我的个人建议是保留它。您将始终可以参考以后的内容,甚至可以编写一些报告工具来显示用户提交的提交数量(因为您可以允许每个员工登录更符合Sarbanes-Oxley标准的特定用户,等等< / p>

你永远不会有太多的数据,所以让他们提交所有内容,尽管他们可以,把编译和转发设置到它应该的时间。

编辑1:创建特定时间的一天。

您需要使用一组函数进行日期计算,并使用SetInterval在给定时间执行脚本。

以下代码执行以下操作:

  1. 设置我们正在检查的日期/时间(在您的情况下,下午5:00,24小时格式)
  2. 如果我们已超过时间,请提前24小时移动检查以防止执行
  3. 如果我们在写时间调用我们的函数来执行我们的任务
  4. 我们执行任务的功能,通过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&lt; 0) {     //这是我们过去的一天,明天保持不变     millis_until_cutoff + = 86400000; } // END IF MILLIS_UNTIL_CUTOFF

    //在指定的时间执行我们的功能 setTimeout(submit_production_form(),millis_until_cutoff);

    function submit_production_form() {     $( '#production_form_id')提交()。 } // END FUNCTION SUBMIT_PRODUCTION_FORM

  5. 这应该处理你想要完成的事情。您的插件需要将其插入到您正在执行表单的页面中,并确保更改函数中表单的id(#)。此外,请记住此方法存在一些问题,在此网页上打开多个窗口会导致多次提交,打开此页面的多个用户将无法看到彼此编辑的内容。