是否可以取消职位状态转换?

时间:2013-07-25 作者:technillogue

问题我想取消pending_to_published 措施:符合特定标准的帖子pendingpublished 应保持挂起状态。

(或者,如果更容易的话,我需要一个按钮,在特定分类法的帖子中添加一个“批准”按钮)

WP安装有一个投资组合税,其中的帖子是使用重力表单自动创建的。这些帖子以“待定”状态保存。

这些帖子有一个与之关联的ZIP文件。当用户提交(公文包帖子)被批准(发布)时,ZIP将被解包和处理。

如果在主HTTP服务器上执行此操作,则在短时间内批准多个提交时会导致延迟或崩溃。

为了解决这个问题,ZIP处理脚本已被重写并移动到另一个EC2实例(该站点位于AWS上)。想法是有一个WP插件,将ZIP文件移动到queue 目录,并使用套接字通知其他服务器开始处理其队列。

有两种方法可以做到这一点:

钩住pending_to_published 操作并取消更改

1 个回复
SO网友:gmazzap

这并不是一个完整的解决方案,这是一个让方法继续的想法。

首先,你要pending_to_publish 操作,而不是处理zip文件,而是将其路径保存在transensient上。此瞬态是所有已批准和未处理的zip文件的数组。

代码可能比文字更能解释:

add_action( \'pending_to_publish\', \'put_zip_in_queue\' );

function put_zip_in_queue( $post ) {  
  // I put post in draft status, so until zip is processed the post is not visible
  $postarr = array(\'ID\' => $post->ID, \'status\' => \'draft\');
  wp_insert_post($postarr);
  $zip_path = get_the_zip_path( $post ); // this function is up to you ;)
  $queue = (array)get_transient(\'zip_queue\');
  $queue[] = $zip_path;
  set_transient(\'zip_queue\', $queue);
}
在那之后

设置Cron 在第二个EC2实例中,通过sokets调用第一个实例上的脚本,该脚本检查“queue\\u on\\u hold”瞬态,如果为空,则检查“zip\\u queue”瞬态,如果不为空,则获取队列中的第一条路径,并通过套接字将其传递给第二个EC2实例。套接字发送成功后,相同的脚本会保存暂时的“queue\\u on\\u hold”,因此如果再次调用第二个实例,则不会执行任何操作:

function respond_to_cron_call() {
   // allow comunication only from the second ec2 instance checkin its IP
   if ( $_SERVER[\'REMOTE_ADDR\'] != 169.254.169.253) return;
   // server must also pass a key as second security layer
   if ( ! isset($_POST[\'key\']) || hash(\'sha256\', $_POST[\'key\']) != $mystoredkey) return;
   if ( get_transient(\'queue_on_hold\') ) return;
   $queue = (array)get_transient(\'zip_queue\');
   if ( $queue[0] ) {
     // function up to you
     $send = send_socket_to_second_ec2_instance( $queue[0] ); 
     if ( $send ) {
       set_transient(\'queue_on_hold\', $queue);
     }
   }
}
第二个EC2实例接收带有路径的套接字并对其进行处理。完成后,将状态为“正在处理”的套接字发送回第一个实例:

function my_super_awesome_zip_process_on_ec2_instance() {
  // allow comunication only from the first ec2 instance checkin its IP
   if ( $_SERVER[\'REMOTE_ADDR\'] != 169.254.169.254) return;
   // server must also pass a key as second security layer
   if ( ! isset($_POST[\'key\']) || hash(\'sha256\', $_POST[\'key\']) != $mystoredkey) return;
  ..
  ...
  send_socket_to_first_ec2_instance(); // function up to you
}
第一个实例收到状态,如果确定,更新“zip\\u队列”,删除刚刚处理的文件;将相关帖子设置为已发布(因为仍在起草中);删除临时“queue\\u on\\u hold”

function respond_to_status( $status ) {
   // allow comunication only from the second ec2 instance checkin its IP
   if ( $_SERVER[\'REMOTE_ADDR\'] != 169.254.169.253) return;
   // server must also pass a key as secon security layer
   if ( ! isset($_POST[\'key\']) || hash(\'sha256\', $_POST[\'key\']) != $mystoredkey) return;
   if ( $status != \'complete\' ) return;
   delete_transient(\'queue_on_hold\')
   $queue = (array) get_transient(\'zip_queue\');
   $postid = get_post_from_zip_path(queue[0]); // up to you
   unset(queue[0]);
   set_transient(\'zip_queue\', $queue);
   $postarr = array(\'ID\' => $postid, \'status\' => \'publish\');
   wp_insert_post($postarr);
}
现在zip已处理,帖子已发布,一切正常。:)在下一次Cron运行时,该进程将再次启动。

Cron的运行频率由您决定,很大程度上取决于zip进程所需的时间,如果需要,还可以设置不同的频率:例如,每5分钟夜间,每15分钟白天。。。

希望有帮助。

结束

相关推荐

Wp-plugins(必须使用Plugins)URL是否可以在unctions.php中使用?

wp插件(必须使用插件)URL是否可以作为在函数中使用的目标。php?我有一个mu函数。mu plugins文件夹中的php文件。一个函数调用javascript文件(alerts.js) 位于example.com/wp-content/mu-plugins/js/. 如何在我的函数中定位mu插件文件夹?目前,我正在使用get_site_url() . \'/wp-content/mu-plugins/js/alerts.js\',虽然与问题不完全相关,但这是用于调用javascript文件的完整函数: