Note: This post assumes a basic understanding of WordPress templates and that a child-theme is being used.
To create a custom print template we first need to define a query var to trigger the template.
Add the following to the child-theme’s function.php file:
function printpromatic_query_var( $vars ) {
$vars[] = 'print_view';
return $vars;
}
add_filter( 'query_vars', 'printpromatic_query_var' );
Now WordPress will look for something like /?print_view=true
at the end of any url.
Next step is to a) define a unique ID for the print trigger and b) tell print-pro-matic to use the current page with the print_view query variable tacked on the url. Do this by setting the url attribute using the %print_view% placeholder as its value:
[print-me id="some_id" url="%print_view%"/]
Finally we need to check for this print_view query var and either a) use a custom print-only template file or b) modify the current page template to switch to a print-only view.
Redirect to Print-Only Template
If a print-only template exists simply redirect to this template file by adding the following code to the child-theme’s function.php file:
function printpro_print_template($original_template) {
if ( get_query_var( 'print_view' ) ) {
$new_template = locate_template( array( 'print-template.php' ) );
return $new_template;
}
return $original_template;
}
add_filter( 'template_include', 'printpro_print_template' );
This could be expanded further to support multiple print-only templates based on a value passed to print_view:
[print-me id="monkey_id" url="%print_view=monkey%" title="print monkey"/]
[print-me id="donkey_id" url="%print_view=donkey%" title="print donkey"/]
This would require that our function be modified to use the correct print template based on the print_view query var:
function printpro_print_template($original_template) {
$print_view = get_query_var( 'print_view' );
if ( !empty( $print_view ) ) {
if($print_view == 'monkey'){
$new_template = locate_template( array( 'print-template-monkey.php' ) );
}
else if ( get_query_var( 'print_view' ) == 'donkey' ){
$new_template = locate_template( array( 'print-template-donkey.php' ) );
}
if(!empty($new_template)){
return $new_template;
}
}
return $original_template;
}
add_filter( 'template_include', 'printpro_print_template' );
Modify the Existing Template
This method involves modifying the current page template to change what it displays based on the presence of the print_view query var.
In the page template being used, we need to check if the query_var is present:
$print_view = get_query_var( 'print_view' );
Now we need to simply wrap the existing template elements in an if statement:
//normal
if( empty($print_view) ){
...
}
//print only
else{
...
}