向第三方回调函数添加参数

时间:2021-12-16 作者:Debbie Kurth

我一直在开发WordPress插件,并使用do\\u shortcode()在表单中实现了一些功能。。。文件上载。上传处理来自第三方插件,工作非常出色。

但现在我有一个问题。我想在我的插件中为上传到数据库中记录的文件分配名称。但是,该db记录的标识符目前在第三方提供的回调挂钩中不可用。

考虑到cookie的使用,这种方法过去是可行的,但由于升级到了较新的PHP版本,到目前为止,这个过程失败了。

下面是一个subset of the code 我正在使用演示该问题

add_shortcode(\'MMD_SHOW_ENTRY_FORM\', \'mmd_vimeo_videoupload\');
function mmd_vimeo_videoupload($atts)
{
    
$OrderId             = sanitize_text_field(stripslashes($_GET[\'or\']));
$BillingEmail        = sanitize_text_field(stripslashes($_GET[\'id\']));
$FormType            = sanitize_text_field(stripslashes($_GET[\'type\']));
$RideCount           = sanitize_text_field(stripslashes($_GET[\'cnt\']));
$ListId              = sanitize_text_field(stripslashes($_GET[\'show\']));


setcookie("VHSEntryListId", $ListId, time() + ( 3600 * 3));  <<< THROWS ERROR
$_COOKIE[\'VHSEntryListId\'] = $ListId;
   
setcookie("VHSOrderId", $OrderId, time() + (3600 * 3)); <<< THROWS ERROR
$_COOKIE[\'VHSOrderId\'] = $OrderId ;
   
setcookie("VHSRideCount", $RideCount, time() + (3600 * 3)); <<< THROWS ERROR
$_COOKIE[\'VHSRideCount\'] = $RideCount;
  

?>
<form enctype="multipart/form-data" id="RiderEntryForm" name="RiderEntryForm" action="" method="post" autocomplete="off">    

<div class="inner-wrap">
do_shortcode("[google_upload]"); 
</div>

<DIV style="width:100%; "><input type="submit" style="float:left:" id="MMD_SEND_VIDEO"  name="MMD_SEND_VIDEO" value="SUBMIT YOUR RIDE"/>
      <input type="button" style="" id="MMD_CANCEL_ENTRY"  name="MMD_CANCEL_ENTRY" value="GO BACK" onclick="history.back()"/>
      </DIV>

</form>

<?php

}



add_action(\'useyourdrive_upload_post_process\', \'mmd_store_upload_information\', 10, 2); // Start watching the upload
function mmd_store_upload_information($uploaded_entries, $processor)
{

 $ListId  = $_COOKIE["VHSEntryListId"]; <<<< NO LONGER WORK IN PHP 8.SetCookie throws error
 $OrderId = $_COOKIE["VHSOrderId"];     <<<< NO LONGER WORK IN PHP 8 SetCookie throws error
 $RideCount = $_COOKIE["VHSRideCount"]; <<<< NO LONGER WORK IN PHP 8 SetCookie throws error


// retrieve file name from uploaded_entries 

$entries = (array)$uploaded_entries;    
 foreach ($entries as $cached_node) 
       {
        $Node = (array)$cached_node; 
        if(empty($Node[\'name\']))
          continue;
            
    
  $UploadedFileName = $Node[\'name\'];
  $DownloadLink     = $Node[\'direct_download_link\'];

  mmd_StoreUploadedFileName( $ListId, $OrderId, $RideCount, $UploadedFileName, $DownloadLink );
 break;
 }  

}

我所尝试的:

设置cookie,但由于它不在标头中,因此会引发警告,而不会存储cookie值。(见上图)。

全局变量不存在,因为我可以让多个用户同时输入数据。

从设置快捷码的页面读取URL参数。。。回调不知道这是什么,因此$\\u Get()失败。

因此,我想知道,是否还有什么可以;添加参数“;到第三方回调函数?传递这些变量,以便在从其他插件完成上载时接收。

想法,想法???现在我没有主意了。需要帮助!

1 个回复
SO网友:Debbie Kurth

我试过。。。但最终走向了完全不同的方向,因为似乎没有可行的解决方案。我结束了在临时数据库条目中的存储。如果两个人使用相同的帐户,则可能存在种族条件。但对于那些感兴趣的人,我的解决方案是:

我正在使用名为UserYourDrive的非常有效的插件作为文件上传界面。他们很友好地提供了回电,事实证明这对解决这个问题很有帮助。

我使用的是当前用户,因为他们必须登录才能执行此任务。当前用户是绑定元素。

从快捷码开始,输入:

mmd_InsertFileUploadCoreData($current_user->ID, $ListId, $RideCount, $OrderId);   // straight 1st time load
但您必须确保这不是一个post响应,因此,如果没有为post设置任何内容,那么您只能调用初始核心数据,以及稍后需要的元素。

上传完成后,将收到回拨。这是存储上载文件的文件名的位置。

mmd_InsertFileUploadName($current_user->ID, $UploadedFileName);   // Don\'t save it. We only have the userid to find it.
当用户单击包含其余表单数据的提交按钮时,才清除临时存储的数据。

 mmd_DeleteFileUploadData($current_user->ID);
它确实存在潜在的种族条件漏洞,但这种情况应该很少发生。代码集:

add_action(\'useyourdrive_upload_post_process\', \'mmd_store_upload_information\', 10, 2); // Start watching the upload
function mmd_store_upload_information($uploaded_entries, $processor)
{ 
 $ListId        = NULL;
 $OrderId       = NULL;
 $RideCount     = NULL;
 $current_user = wp_get_current_user();
 $Record        = mmd_FindFileUploadData($current_user->ID);
 if(!empty($Record))
     {
     $ListId        = $Record[\'ListId\'];
     $OrderId       = $Record[\'OrderId\'];
     $RideCount     = $Record[\'RideId\'];
     $DBId          = $Record[\'id\'];
     unset($Record);                           // Clear the record
     mmd_DebugLog(\'READ  UserId: \' . $current_user->ID .  \' List Id: \' . $ListId . \'  OrderId: \' . $OrderId  . \'Ride Count:\' .  $RideCount);
     }
  else
   return;   // Nothing here, so bail out.   
 
 if($ListId == NULL || $ListId == "")
    return;
 
 if($OrderId == NULL || $OrderId == "")
    return;
    
 if($RideCount == NULL || $RideCount == "")
    return; 
  
 $entries = (array)$uploaded_entries;   
 foreach ($entries as $cached_node) 
       {
        $Node = (array)$cached_node; 
        if(empty($Node[\'name\']))
          continue;
                
        $UploadedFileName = $Node[\'name\'];
        $DownloadLink     = $Node[\'direct_download_link\'];  
        mmd_InsertFileUploadName($current_user->ID, $UploadedFileName);   // Don\'t save it. We only have the userid to find it.
        mmd_StoreUploadedFileName( $ListId, $OrderId, $RideCount, $UploadedFileName, $DownloadLink );
        break;
    }   
}


function mmd_InsertFileUploadName($UserId, $FileName)
{
global $wpdb;   
$Table_Name = $wpdb->prefix.\'mmd_temp_fileupload_data\'; 
$sql_query = $wpdb->prepare( "UPDATE $Table_Name SET FileName = %s WHERE UserId = %d", $FileName, $UserId);
$wpdb->query( $sql_query );     

}


function mmd_InsertFileUploadName($UserId, $FileName)
{
global $wpdb;   
$Table_Name = $wpdb->prefix.\'mmd_temp_fileupload_data\'; 
$sql_query = $wpdb->prepare( "UPDATE $Table_Name SET FileName = %s WHERE UserId = %d", $FileName, $UserId);
$wpdb->query( $sql_query ); 


}




function mmd_FindFileUploadData($UserId)
{
global $wpdb;   
$Table_Name = $wpdb->prefix.\'mmd_temp_fileupload_data\'; 
$sql_query  = $wpdb->prepare("SELECT * FROM $Table_Name WHERE UserId=%d", $UserId);
 $Record    = $wpdb->get_row($sql_query, ARRAY_A);

return $Record;     
}


function mmd_DeleteFileUploadData($UserId)
{
global $wpdb;   
$Table_Name = $wpdb->prefix.\'mmd_temp_fileupload_data\'; 
$sql_query  = $wpdb->prepare("DELETE FROM $Table_Name WHERE UserId=%d", $UserId);
$wpdb->query( $sql_query );
}

相关推荐

Optimize shortcode callbacks

我创建了一个插件,在我的WordPress站点中添加了一些短代码。但我是一个PHP新手,所以我相信它可能有一些错误或优化它的方法。它工作正常,显然没有问题。内存使用率为00.04MB。你能看看吗?非常感谢!add_action( \'wp_enqueue_scripts\', \'prefix_add_my_stylesheet\' ); function prefix_add_my_stylesheet() { // Respects SSL, Styl