Solution:
The wc_cart_pdf_process_download()
function isn’t really relevant. The comment states that it “Generates the PDF for download”. What it’s doing is responding when the user visits the PDF link by generating the requested PDF file. The important function is the one beneath that, wc_cart_pdf_button()
.
Now that we know the function we’re interested in, what’s next? In your question, you suggested editing the plugin files however it’s important to avoid doing that. Editing your plugin files is a sure-fire way to guarantee the changes you make get overwritten the next time you update.
You have a couple of options:
- Create a mini feature plugin.
- Add the code to the bottom of your (hopefully child) theme’s functions.php file.
The first option would be the recommended approach but that’s going to take us well beyond the scope of the question. Placing the code in a child theme’s functions.php file will be adequate for getting you up and running.
Okay, so now we know what the code we want to modify is and where we’re going to store those modifications. Let’s break down the actual code:
if( ! is_cart() || WC()->cart->is_empty() ) {
return;
}
This checks two things, are we on the cart page and does the cart contain items? If either is false, we’re going to bail out early. You’re on the checkout page, not the cart page, so even if this function were to be called, it wouldn’t make it past this conditional.
<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>
If those two previous checks passed, generate the button output.
add_action( 'woocommerce_proceed_to_checkout', 'wc_cart_pdf_button', 21 );
This executes the code on the woocommerce_proceed_to_checkout
hook which fires after the cart totals on the cart page. The same action is used by the checkout button itself.
We need to write our own function that displays that same output on the checkout page. Without knowing where you’d like the button to appear, I can’t suggest which action to use. I’m using woocommerce_checkout_order_review
with a priority that’ll put it between the order table and the payment options. If you need to reposition it, you’ll have to go through those hooks and find somewhere that feels appropriate.
You did mention in your question that this is necessary because you have your cart and checkout pages combined. You may require a completely different hook, again there’s no way for me to know based on your question alone.
Here’s the final code:
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 );