这里有一种更具可移植性的方法(因此您不必直接调用wp-load.php,这是您想要避免的),并且允许您修改URL,使其不指向/wp-content/plugins/directory(也是您想要避免的):
add_action( \'init\', \'my_pdf_generator\' );
function my_pdf_generator() {
// sniff out query args to see if this is a pdf request.
// Note that you should probably add a unique query arg to make sure this is a ticket request.
// Mabye something like "?eventix_order=true" or something just in case order_id and key exist in
// some other kind of instance.
if ( isset( $_GET[\'order_id\'] ) && isset( $_GET[\'key\'] ) ) {
nocache_headers();
// Don\'t forget to sanitize
$orderId = $_GET[\'order_id\'];
$key = $_GET[\'key\'];
$eventixOrderId = get_post_meta( $orderId, \'eventix_order_id\', true );
if($eventixOrderId != $key){
echo "These are not the tickets you\'re looking for.";
exit;
}
$accessToken = get_option(\'eventix_access_token\');
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_URL => \'https://api.eventix.io/3.0.0/order/\'.$eventixOrderId.\'/downloadlink\',
CURLOPT_USERAGENT => \'example.com\',
CURLOPT_HTTPHEADER => array(
\'Content-Type: application/json\',
\'Authorization: \' . $accessToken)
));
$ticketPdf = curl_exec($curl);
curl_close($curl);
update_post_meta( $orderId, \'eventix_pdf_ticket\', $ticketPdf );
header( \'Content-Description: File Transfer\' );
header( \'Content-Type: application/pdf\' );
header( \'Content-Disposition: inline\' );
header( \'Content-Transfer-Encoding: binary\' );
header( \'Cache-Control: must-revalidate\' );
header( \'Pragma: public\' );
header( "Location: $ticketPdf" );
exit();
}
}
这样做将使您的链接如下所示:
https://example.com/?order_id=1553&key=d5df1b20-15a9-11e9-ad15-c704673daa98
它所做的是挂接“init”操作,以检查这是否是一个关键请求,如果是,它将运行您的进程并在该端退出(因此不会发送额外的WP输出)。
这比将其放在自定义文件中、直接调用该自定义文件以及需要包含wp load更干净。php。
要以这种方式使用它,您可以将其放入主题的函数中。php文件或添加plugin file header 并将其作为插件加载。我建议将其作为插件加载,以便它是可移植的,而不是依赖于主题的,以防您在将来更改主题。
这也将是a starting point 用于其他学习。此示例只使用了一个原始查询参数,但通过进一步的研究和工作,您可能会学会将其构建到一个功能性WooCommerce端点中,如:
https://example.com/eventix_order/1553/d5df1b20-15a9-11e9-ad15-c704673daa98/
显然,我无法按原样测试它,因此您可能需要对其进行调整,使其完全发挥功能。我还注意到,在代码注释中,我可能会使用另一个唯一的查询参数,以防“order\\u id”和“key”可能作为查询参数一起存在于其他地方(如“eventix\\u order=true”或其他什么)。您可以将其添加到“if”条件中。
我还添加了一些额外的标题,我认为这会使它更清晰-您可能需要根据需要进行实验和/或修改,因为正如我所提到的,我无法准确地测试它。但我个人构建了下载插件,这就是我的工作成果,所以我认为它们应该符合您的目的。