PDF does not load when Caching is set to TRUE
-
@anttiviljami
Dude, I really need some help here.
I’m launching my site live tomorrow evening (Sunday).
It’s limping along currently, using the temporary fix I outlined on this GitHub thread, but I just ran into another MAJOR issue.
Since I’m launching to the public very soon, I removed the
define('DISABLE_PDF_CACHE', true);
line my fromwp-config.php
. Now the pdf templates will not load at all. It gets hung up during the pdf generation, and the chrome pdf loading icon just gets stuck. The page loads, but there is no pdf generated!Please help!!!!!!
-
Here is the problem:
The caching function just uses
the_title()
for naming the cached file. My custom post types are programmatically generated based on a date function, resulting in titles of the form: 10/17/2015, so when pdf templates tries to write that to the cacheing folder, PHP thinks it’s trying to write it to a certain directory (I think), which doesn’t exist, so it fails.I added the below fix, sanitizing the title before it gets cached, and now it works.
Please add this as a fix to the plugin ?? And let me know what you think.
/** * Handles the PDF Conversion */ function _print_pdf($html) { global $wp_query; if (isset($wp_query->query_vars['pdf'])) { // convert to PDF // Get the Title $the_title = get_the_title(); $filename = $the_title . '.pdf'; // Sanitize the Title before using it in the cached file name: $cached = PDF_CACHE_DIRECTORY . sanitize_title( $the_title ) . '-' . substr(md5(get_the_modified_time()), -6) . '.pdf'; // check if we need to generate PDF against cache if(( defined('DISABLE_PDF_CACHE') && DISABLE_PDF_CACHE ) || ( isset($_SERVER['HTTP_PRAGMA']) && $_SERVER['HTTP_PRAGMA'] == 'no-cache' ) || !file_exists($cached) ) { // we may need more than 30 seconds execution time set_time_limit(60); // include the library require_once plugin_dir_path(__FILE__) . 'dompdf/dompdf_config.inc.php'; // html to pdf conversion $dompdf = new DOMPDF(); $dompdf->set_paper( defined('DOMPDF_PAPER_SIZE') ? DOMPDF_PAPER_SIZE : DOMPDF_DEFAULT_PAPER_SIZE, defined('DOMPDF_PAPER_ORIENTATION') ? DOMPDF_PAPER_ORIENTATION : 'portrait'); $dompdf->load_html($html); $dompdf->set_base_path(get_stylesheet_directory_uri()); $dompdf->render(); if(defined('DISABLE_PDF_CACHE') && DISABLE_PDF_CACHE) { //just stream the PDF to user if caches are disabled return $dompdf->stream($filename, array("Attachment" => false)); } // create PDF cache if one doesn't yet exist if(!is_dir(PDF_CACHE_DIRECTORY)) { @mkdir(PDF_CACHE_DIRECTORY); } //save the pdf file to cache file_put_contents($cached, $dompdf->output()); } //read and display the cached file header('Content-type: application/pdf'); header('Content-Disposition: inline; filename="' . $filename . '"'); header('Content-Transfer-Encoding: binary'); header('Content-Length: ' . filesize($cached)); header('Accept-Ranges: bytes'); readfile($cached); } else { // print the HTML raw echo $html; } // kill php after output is complete die(); }
Could you post any fixes to the plugin to Github for review?
https://github.com/anttiviljami/wp-pdf-templates
Any fixes and enhancements would be appreciated!
@anttiviljami
Sorry man, I’m not experienced with GitHub. I’m not sure how to “add my fixes”.
But please do look into my above fixes and add them to the plugin if you think they are improvements.
Also, can you look into adding the following fix:
The WP PDF plugin’s use of sessions conflicts with other plugins, such as WP Awesome Support, and Easy Digital Downloads.
In order to solve this issue, I have added the following fix to the plugin’s core
wp-pdf-templates.php
. It is regarding the function_use_pdf_template()
, beginning on line 177 ofwp-pdf-templates.php
.Below is that function including my fix (look for where it says “WUWO FIX”):
/** * Applies print templates */ add_action('template_redirect', '_use_pdf_template'); function _use_pdf_template() { global $wp_query, $pdf_post_types; if(in_array(get_post_type(), $pdf_post_types)) { if (isset($wp_query->query_vars['pdf-template'])) { // Substitute the PDF printing template // disable scripts and stylesheets // NOTE: We do this because in most cases the stylesheets used on the site // won't automatically work with the DOMPDF Library. This way you have to // define your own PDF styles using <style> tags in the template. add_action('wp_print_styles', '_remove_dep_arrays', ~PHP_INT_MAX); add_action('wp_print_scripts', '_remove_dep_arrays', ~PHP_INT_MAX); add_action('wp_print_footer_scripts', '_remove_dep_arrays', ~PHP_INT_MAX); // disable the wp admin bar add_filter('show_admin_bar', '__return_false'); remove_action('wp_head', '_admin_bar_bump_cb'); // use the print template add_filter('template_include', '_locate_pdf_template'); } // our post permalink $url = parse_url(get_the_permalink()); // we use localhost to make sure we're requesting the page from this wordpress instance $link = $url['scheme'] . '://localhost' . $url['path']; $link = $link . (strpos($link, '?') === false ? '?' : '&') . 'pdf-template'; if(isset($wp_query->query_vars['pdf']) || isset($wp_query->query_vars['pdf-preview'])) { // we want a html template $header = 'Accept:text/html' . "\n"; // since we're always requesting this from localhost, we need to set the Host // header for WordPress to route our request correctly $header = 'Host:' . $url['host'] . "\n"; if( defined('FETCH_COOKIES_ENABLED') && FETCH_COOKIES_ENABLED ) { // pass cookies from current request if( isset( $_SERVER['HTTP_COOKIE'] ) ) { $header .= 'Cookie: ' . $_SERVER['HTTP_COOKIE'] . "\n"; } } // create a request context for file_get_contents $context = stream_context_create(array( 'http' => array( 'method' => 'GET', 'header' => $header, ), 'ssl' => array( 'verify_peer' => false, // since we're using localhost, HTTPS doesn't need peer verification 'verify_peer_name' => false, ), )); // WUWO FIX: This is a TEMPORARY fix until the WP-PDF devs can figure something out... session_write_close(); // load the generated html from the template endpoint $html = file_get_contents( $link, false, $context ); // WUWO FIX: This is a TEMPORARY fix until the WP-PDF devs can figure something out... session_start(); if( empty( $html ) ) { // sometimes the ssl module just fails, fall back to http insted $html = file_get_contents( str_ireplace( 'https://', 'https://', $link ), false, $context ); } // process the html output $html = apply_filters('pdf_template_html', $html); // pass for printing _print_pdf($html); } } }
Basically I am closing the session before the PDF template is fetched, and then restarting the session after it has. I found that this fixes the session conflicts with many other plugins. I am not sure how it effects the performance of the PDF generation, but it’s better than not working at all. I use the plugin WP Awesome Support, and in order for both plugins to work alongside one another, the above fix is absolutely necessary.
Please consider adding this fix, or a better version, into the core plugin so that I don’t have to keep adding it back manually every time your plugin is updated, and pdf generation breaks. Keep in mind that last time I checked this also causes a conflict with the very popular plugin Easy Digital Downloads, which is probably used by hundreds of thousands of people.
Keep me posted. Thanks!
- The topic ‘PDF does not load when Caching is set to TRUE’ is closed to new replies.