我正在为wordpress-woocommerce使用一个名为Woocommerce Cart PDF(https://wordpress.org/plugins/wc-cart-pdf/)的插件。它会生成当前购物车的pdf链接,但位于购物车页面上。
我将购物车和结帐页面合并在一起,因此该链接未出现在我的网站上。我不了解如何自己编辑插件文件,以使其出现在购物车页面上。
我已经为该特定插件尝试了wordpress插件支持论坛,但没有答案。
/**
* Generates the PDF for download
*
* @return void
*/
function wc_cart_pdf_process_download() {
if( ! function_exists( 'WC' ) ) {
return;
}
if( ! isset( $_GET['cart-pdf'] ) ) {
return;
}
if( ! is_cart() || WC()->cart->is_empty() ) {
return;
}
if( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], 'cart-pdf' ) ) {
wc_add_notice( __( 'Invalid nonce. Unable to process PDF for download.', 'wc_cart_pdf' ), 'error' );
return;
}
$dompdf = new \Dompdf\Dompdf();
$content = $css = '';
$cart_table = wc_locate_template( 'cart-table.php', '/woocommerce/wc-cart-pdf/', __DIR__ . '/templates/' );
$css = wc_locate_template( 'pdf-styles.php', '/woocommerce/wc-cart-pdf/', __DIR__ . '/templates/' );
do_action( 'wc_cart_pdf_before_process' );
if( file_exists( $cart_table ) ) {
ob_start();
include $cart_table;
$content = ob_get_clean();
}
if( file_exists( $css ) ) {
ob_start();
include $css;
$css = apply_filters( 'woocommerce_email_styles', ob_get_clean() );
}
$dompdf->loadHtml( '<style>' . $css . '</style>' . $content );
$dompdf->setPaper( 'A4', 'portrait' );
$dompdf->render();
$dompdf->stream(
apply_filters( 'wc_cart_pdf_filename', 'WC_Cart-' . date( 'Ymd' ) . bin2hex( openssl_random_pseudo_bytes( 5 ) ) ) . '.pdf',
/**
* 'compress' => 1 or 0 - apply content stream compression, this is on (1) by default
* 'Attachment' => 1 or 0 - if 1, force the browser to open a download dialog, on (1) by default
*/
apply_filters( 'wc_cart_pdf_stream_options', array( 'compress' => 1, 'Attachment' => 1 ) )
);
exit;
}
add_action( 'template_redirect', 'wc_cart_pdf_process_download' );
if( ! function_exists( 'wc_cart_pdf_button' ) ) {
/**
* Renders the download cart as PDF button
*
* @return void
*/
function wc_cart_pdf_button() {
if( ! is_cart() || WC()->cart->is_empty() ) {
return;
}
?>
<a href="<?php echo esc_url( wp_nonce_url( add_query_arg( array( 'cart-pdf' => '1' ), wc_get_cart_url() ), 'cart-pdf' ) );?>" class="cart-pdf-button button" target="_blank">
<?php esc_html_e( 'Download Cart as PDF', 'wc-cart-pdf' ); ?>
</a>
<?php
}
}
add_action( 'woocommerce_proceed_to_checkout', 'wc_cart_pdf_button', 21 );
这可能是插件中功能的不正确部分,但我希望我做对了。
答案 0 :(得分:1)
wc_cart_pdf_process_download()
函数实际上并不相关。该评论指出它“生成要下载的PDF”。当用户访问PDF链接时,它正在通过生成请求的PDF文件来响应。重要的功能是wc_cart_pdf_button()
下面的那个功能。
现在我们知道我们感兴趣的功能了,下一步是什么?在您的问题中,您建议编辑插件文件,但是避免这样做很重要。编辑插件文件是确保下一次更新时所做的更改被覆盖的可靠方法。
您有两种选择:
第一种选择是推荐的方法,但这将使我们远远超出问题的范围。将代码放在子主题的functions.php文件中足以使您启动并运行。
好的,现在我们知道要修改的代码是什么,以及这些修改的存储位置。让我们分解一下实际代码:
if( ! is_cart() || WC()->cart->is_empty() ) {
return;
}
这会检查两件事,我们是否在购物车页面上,并且购物车中是否包含物品?如果任何一个都不成立,我们将尽早纾困。您在结帐页面上,而不是购物车页面上,因此即使调用此函数,也不会超出此条件。
<a href="<?php echo esc_url( wp_nonce_url( add_query_arg( array( 'cart-pdf' => '1' ), wc_get_cart_url() ), 'cart-pdf' ) );?>" class="cart-pdf-button button" target="_blank">
<?php esc_html_e( 'Download Cart as PDF', 'wc-cart-pdf' ); ?>
</a>
如果通过了前两项检查,则生成按钮输出。
add_action( 'woocommerce_proceed_to_checkout', 'wc_cart_pdf_button', 21 );
这将执行woocommerce_proceed_to_checkout
钩子上的代码,该钩子将在购物车页面上的购物车总数之后触发。结帐按钮本身会使用相同的操作。
我们需要编写自己的函数,以在结帐页面上显示相同的输出。在不知道您希望按钮出现在何处的情况下,我无法建议使用哪种操作。我使用woocommerce_checkout_order_review
的优先级,将其置于订单表和付款选项之间。如果需要重新定位,则必须经过这些钩子,然后找到合适的位置。
您确实在问题中提到这是必要的,因为您将购物车页面和结帐页面结合在一起。您可能需要一个完全不同的钩子,同样,仅凭您的问题我就无法知道。
这是最终代码:
function stackoverflow_wc_checkout_pdf_button() {
// We're on the checkout page based on the action.
// Highly unlikely we need the is_empty() check but it can't hurt if you may find yourself reusing elsewhere.
if ( WC()->cart->is_empty() ) {
return;
} ?>
<a href="<?php echo esc_url( wp_nonce_url( add_query_arg( array( 'cart-pdf' => '1' ), wc_get_cart_url() ), 'cart-pdf' ) );?>" class="cart-pdf-button button" target="_blank">
<?php esc_html_e( 'Download Cart as PDF', 'wc-cart-pdf' ); ?>
</a>
<?php
}
add_action( 'woocommerce_checkout_order_review', 'stackoverflow_wc_checkout_pdf_button', 15 );