在插件中调用PHP文件以激活函数

时间:2019-01-11 作者:Kevster

因此,以下内容可能完全违背WordPress标准&;最佳实践,但我正在学习过程中。

目前,我正在通过第三方调用一个PHP文件来生成PDF。

我调用文件的方式是访问:https://example.com/wp-content/plugins/eventix-woocommerce/generate.php?order_id=1553&key=d5df1b20-15a9-11e9-ad15-c704673daa98

生成的代码。php:

require_once("../../../wp-load.php");
nocache_headers();

$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("Location: $ticketPdf");
exit;
现在,在大多数情况下,这实际上非常有效。但在一些情况下,这个脚本会弄糟,让我进入404页的示例。com,不加载PDF。另一方面,如果我匿名访问链接;没问题。

我的第一个想法是,它可能是由头缓存引起的。我尝试了多种方法来清除标头缓存,但都没有成功。

1 个回复
最合适的回答,由SO网友:butlerblog 整理而成

这里有一种更具可移植性的方法(因此您不必直接调用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”条件中。

我还添加了一些额外的标题,我认为这会使它更清晰-您可能需要根据需要进行实验和/或修改,因为正如我所提到的,我无法准确地测试它。但我个人构建了下载插件,这就是我的工作成果,所以我认为它们应该符合您的目的。

相关推荐