1226 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			1226 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Template Functions
 | |
|  *
 | |
|  * @package     EDD
 | |
|  * @subpackage  Functions/Templates
 | |
|  * @copyright   Copyright (c) 2018, Easy Digital Downloads, LLC
 | |
|  * @license     http://opensource.org/licenses/gpl-2.0.php GNU Public License
 | |
|  * @since       1.0
 | |
|  */
 | |
| 
 | |
| // Exit if accessed directly
 | |
| defined( 'ABSPATH' ) || exit;
 | |
| 
 | |
| /**
 | |
|  * Append Purchase Link
 | |
|  *
 | |
|  * Automatically appends the purchase link to download content, if enabled.
 | |
|  *
 | |
|  * @since 1.0
 | |
|  * @param int $download_id Download ID
 | |
|  * @return void
 | |
|  */
 | |
| 
 | |
| function edd_append_purchase_link( $download_id ) {
 | |
| 	if ( ! get_post_meta( $download_id, '_edd_hide_purchase_link', true ) ) {
 | |
| 		echo edd_get_purchase_link( array( 'download_id' => $download_id ) );
 | |
| 	}
 | |
| }
 | |
| add_action( 'edd_after_download_content', 'edd_append_purchase_link' );
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Get Purchase Link
 | |
|  *
 | |
|  * Builds a Purchase link for a specified download based on arguments passed.
 | |
|  * This function is used all over EDD to generate the Purchase or Add to Cart
 | |
|  * buttons. If no arguments are passed, the function uses the defaults that have
 | |
|  * been set by the plugin. The Purchase link is built for simple and variable
 | |
|  * pricing and filters are available throughout the function to override
 | |
|  * certain elements of the function.
 | |
|  *
 | |
|  * $download_id = null, $link_text = null, $style = null, $color = null, $class = null
 | |
|  *
 | |
|  * @since 1.0
 | |
|  * @param array $args Arguments for display
 | |
|  * @return string $purchase_form
 | |
|  */
 | |
| function edd_get_purchase_link( $args = array() ) {
 | |
| 	global $post, $edd_displayed_form_ids;
 | |
| 
 | |
| 	$purchase_page = edd_get_option( 'purchase_page', false );
 | |
| 	if ( ! $purchase_page || $purchase_page == 0 ) {
 | |
| 
 | |
| 		global $no_checkout_error_displayed;
 | |
| 		if ( ! is_null( $no_checkout_error_displayed ) ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		edd_set_error(
 | |
| 			'set_checkout',
 | |
| 			sprintf(
 | |
| 				__( 'No checkout page has been configured. Visit <a href="%s">Settings</a> to set one.', 'easy-digital-downloads' ),
 | |
| 				esc_url( edd_get_admin_url( array(
 | |
| 					'page'    => 'edd-settings',
 | |
| 					'tab'     => 'general',
 | |
| 					'section' => 'pages',
 | |
| 				) ) )
 | |
| 			)
 | |
| 		);
 | |
| 		edd_print_errors();
 | |
| 
 | |
| 		$no_checkout_error_displayed = true;
 | |
| 
 | |
| 		return false;
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	$post_id = is_object( $post ) ? $post->ID : 0;
 | |
| 	$button_behavior = edd_get_download_button_behavior( $post_id );
 | |
| 
 | |
| 	$defaults = apply_filters( 'edd_purchase_link_defaults', array(
 | |
| 		'download_id' => $post_id,
 | |
| 		'price'       => (bool) true,
 | |
| 		'price_id'    => isset( $args['price_id'] ) ? $args['price_id'] : false,
 | |
| 		'direct'      => $button_behavior == 'direct' ? true : false,
 | |
| 		'text'        => $button_behavior == 'direct' ? edd_get_option( 'buy_now_text', __( 'Buy Now', 'easy-digital-downloads' ) ) : edd_get_option( 'add_to_cart_text', __( 'Purchase', 'easy-digital-downloads' ) ),
 | |
| 		'checkout'    => edd_get_option( 'checkout_button_text', _x( 'Checkout', 'text shown on the Add to Cart Button when the product is already in the cart', 'easy-digital-downloads' ) ),
 | |
| 		'style'       => edd_get_option( 'button_style', 'button' ),
 | |
| 		'color'       => edd_get_button_color_class(),
 | |
| 		'class'       => 'edd-submit',
 | |
| 	) );
 | |
| 
 | |
| 	$args = wp_parse_args( $args, $defaults );
 | |
| 
 | |
| 	// Override the straight_to_gateway if the shop doesn't support it
 | |
| 	if ( ! edd_shop_supports_buy_now() ) {
 | |
| 		$args['direct'] = false;
 | |
| 	}
 | |
| 
 | |
| 	$download = new EDD_Download( $args['download_id'] );
 | |
| 
 | |
| 	if( empty( $download->ID ) ) {
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	if( 'publish' !== $download->post_status && ! current_user_can( 'edit_product', $download->ID ) ) {
 | |
| 		return false; // Product not published or user doesn't have permission to view drafts
 | |
| 	}
 | |
| 
 | |
| 	$options          = array();
 | |
| 	$variable_pricing = $download->has_variable_prices();
 | |
| 	$data_variable    = $variable_pricing ? ' data-variable-price="yes"' : 'data-variable-price="no"';
 | |
| 	$type             = $download->is_single_price_mode() ? 'data-price-mode=multi' : 'data-price-mode=single';
 | |
| 
 | |
| 	$show_price       = $args['price'] && $args['price'] !== 'no';
 | |
| 	$data_price_value = 0;
 | |
| 	$price            = false;
 | |
| 
 | |
| 	if ( $variable_pricing && false !== $args['price_id'] ) {
 | |
| 
 | |
| 		$price_id            = $args['price_id'];
 | |
| 		$prices              = $download->prices;
 | |
| 		$options['price_id'] = $args['price_id'];
 | |
| 		$found_price         = isset( $prices[$price_id] ) ? $prices[$price_id]['amount'] : false;
 | |
| 
 | |
| 		$data_price_value    = $found_price;
 | |
| 
 | |
| 		if ( $show_price ) {
 | |
| 			$price = $found_price;
 | |
| 		}
 | |
| 
 | |
| 	} elseif ( ! $variable_pricing ) {
 | |
| 
 | |
| 		$data_price_value = $download->price;
 | |
| 
 | |
| 		if ( $show_price ) {
 | |
| 			$price = $download->price;
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	$data_price  = 'data-price="' . $data_price_value . '"';
 | |
| 
 | |
| 	$button_text = ! empty( $args['text'] ) ? ' – ' . $args['text'] : '';
 | |
| 
 | |
| 	if ( false !== $price ) {
 | |
| 
 | |
| 		if ( 0 == $price ) {
 | |
| 			$args['text'] = __( 'Free', 'easy-digital-downloads' ) . $button_text;
 | |
| 		} else {
 | |
| 			$args['text'] = edd_currency_filter( edd_format_amount( $price ) ) . $button_text;
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	$button_display   = '';
 | |
| 	$checkout_display = 'style="display:none;"';
 | |
| 	if ( edd_item_in_cart( $download->ID, $options ) && ( ! $variable_pricing || ! $download->is_single_price_mode() ) ) {
 | |
| 		$button_display   = 'style="display:none;"';
 | |
| 		$checkout_display = '';
 | |
| 	}
 | |
| 
 | |
| 	// Collect any form IDs we've displayed already so we can avoid duplicate IDs
 | |
| 	if ( isset( $edd_displayed_form_ids[ $download->ID ] ) ) {
 | |
| 		$edd_displayed_form_ids[ $download->ID ]++;
 | |
| 	} else {
 | |
| 		$edd_displayed_form_ids[ $download->ID ] = 1;
 | |
| 	}
 | |
| 
 | |
| 	$form_id = ! empty( $args['form_id'] ) ? $args['form_id'] : 'edd_purchase_' . $download->ID;
 | |
| 
 | |
| 	// If we've already generated a form ID for this download ID, append -#
 | |
| 	if ( $edd_displayed_form_ids[ $download->ID ] > 1 ) {
 | |
| 		$form_id .= '-' . $edd_displayed_form_ids[ $download->ID ];
 | |
| 	}
 | |
| 
 | |
| 	$args = apply_filters( 'edd_purchase_link_args', $args );
 | |
| 
 | |
| 	ob_start();
 | |
| ?>
 | |
| 	<form id="<?php echo esc_attr( $form_id ); ?>" class="edd_download_purchase_form edd_purchase_<?php echo absint( $download->ID ); ?>" method="post">
 | |
| 
 | |
| 		<?php do_action( 'edd_purchase_link_top', $download->ID, $args ); ?>
 | |
| 
 | |
| 		<div class="edd_purchase_submit_wrapper">
 | |
| 			<?php
 | |
| 			$class = implode( ' ', array_filter( array( $args['style'], $args['color'], trim( $args['class'] ) ) ) );
 | |
| 
 | |
| 			if ( ! edd_is_ajax_disabled() ) {
 | |
| 				$timestamp = time();
 | |
| 				echo '<button class="edd-add-to-cart ' . esc_attr( $class ) . '" data-nonce="' . esc_attr( wp_create_nonce( 'edd-add-to-cart-' . $download->ID ) ) . '" data-timestamp="' . esc_attr( $timestamp ) . '" data-token="' . esc_attr( EDD\Utils\Tokenizer::tokenize( $timestamp ) ) . '" data-action="edd_add_to_cart" data-download-id="' . esc_attr( $download->ID ) . '" ' . $data_variable . ' ' . $type . ' ' . $data_price . ' ' . $button_display . '><span class="edd-add-to-cart-label">' . $args['text'] . '</span> <span class="edd-loading" aria-label="' . esc_attr__( 'Loading', 'easy-digital-downloads' ) . '"></span></button>';
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 			echo '<input type="submit" class="edd-add-to-cart edd-no-js ' . esc_attr( $class ) . '" name="edd_purchase_download" value="' . esc_attr( $args['text'] ) . '" data-action="edd_add_to_cart" data-download-id="' . esc_attr( $download->ID ) . '" ' . $data_variable . ' ' . $type . ' ' . $button_display . '/>';
 | |
| 			echo '<a href="' . esc_url( edd_get_checkout_uri() ) . '" class="edd_go_to_checkout ' . esc_attr( $class ) . '" ' . $checkout_display . '>' . $args['checkout'] . '</a>';
 | |
| 			?>
 | |
| 
 | |
| 			<?php if ( ! edd_is_ajax_disabled() ) : ?>
 | |
| 				<span class="edd-cart-ajax-alert" aria-live="assertive">
 | |
| 					<span class="edd-cart-added-alert" style="display: none;">
 | |
| 						<svg class="edd-icon edd-icon-check" xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 28 28" aria-hidden="true">
 | |
| 							<path d="M26.11 8.844c0 .39-.157.78-.44 1.062L12.234 23.344c-.28.28-.672.438-1.062.438s-.78-.156-1.06-.438l-7.782-7.78c-.28-.282-.438-.673-.438-1.063s.156-.78.438-1.06l2.125-2.126c.28-.28.672-.438 1.062-.438s.78.156 1.062.438l4.594 4.61L21.42 5.656c.282-.28.673-.438 1.063-.438s.78.155 1.062.437l2.125 2.125c.28.28.438.672.438 1.062z"/>
 | |
| 						</svg>
 | |
| 						<?php echo __( 'Added to cart', 'easy-digital-downloads' ); ?>
 | |
| 					</span>
 | |
| 				</span>
 | |
| 			<?php endif; ?>
 | |
| 			<?php if( ! $download->is_free( $args['price_id'] ) && ! edd_download_is_tax_exclusive( $download->ID ) ): ?>
 | |
| 				<?php if ( edd_display_tax_rate() && edd_prices_include_tax() ) {
 | |
| 					/* translators: the formatted tax rate */
 | |
| 					echo '<span class="edd_purchase_tax_rate">' . sprintf( esc_html__( 'Includes %1$s tax', 'easy-digital-downloads' ), esc_html( edd_get_formatted_tax_rate() ) ) . '</span>';
 | |
| 				} elseif ( edd_display_tax_rate() && ! edd_prices_include_tax() ) {
 | |
| 					/* translators: the formatted tax rate */
 | |
| 					echo '<span class="edd_purchase_tax_rate">' . sprintf( esc_html__( 'Excluding %1$s tax', 'easy-digital-downloads' ), esc_html( edd_get_formatted_tax_rate() ) ) . '</span>';
 | |
| 				} ?>
 | |
| 			<?php endif; ?>
 | |
| 		</div><!--end .edd_purchase_submit_wrapper-->
 | |
| 
 | |
| 		<input type="hidden" name="download_id" value="<?php echo esc_attr( $download->ID ); ?>">
 | |
| 		<?php if ( $variable_pricing && isset( $price_id ) && isset( $prices[$price_id] ) ): ?>
 | |
| 			<input type="hidden" name="edd_options[price_id][]" id="edd_price_option_<?php echo esc_attr( $download->ID ); ?>_<?php echo esc_attr( $price_id ); ?>" class="edd_price_option_<?php echo esc_attr( $download->ID ); ?>" value="<?php echo esc_attr( $price_id ); ?>">
 | |
| 		<?php endif; ?>
 | |
| 		<?php if( ! empty( $args['direct'] ) && ! $download->is_free( $args['price_id'] ) ) { ?>
 | |
| 			<input type="hidden" name="edd_action" class="edd_action_input" value="straight_to_gateway">
 | |
| 		<?php } else { ?>
 | |
| 			<input type="hidden" name="edd_action" class="edd_action_input" value="add_to_cart">
 | |
| 		<?php } ?>
 | |
| 
 | |
| 		<?php if( apply_filters( 'edd_download_redirect_to_checkout', edd_straight_to_checkout(), $download->ID, $args ) ) : ?>
 | |
| 			<input type="hidden" name="edd_redirect_to_checkout" id="edd_redirect_to_checkout" value="1">
 | |
| 		<?php endif; ?>
 | |
| 
 | |
| 		<?php do_action( 'edd_purchase_link_end', $download->ID, $args ); ?>
 | |
| 
 | |
| 	</form><!--end #<?php echo esc_attr( $form_id ); ?>-->
 | |
| <?php
 | |
| 	$purchase_form = ob_get_clean();
 | |
| 
 | |
| 
 | |
| 	return apply_filters( 'edd_purchase_download_form', $purchase_form, $args );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Variable price output
 | |
|  *
 | |
|  * Outputs variable pricing options for each download or a specified downloads in a list.
 | |
|  * The output generated can be overridden by the filters provided or by removing
 | |
|  * the action and adding your own custom action.
 | |
|  *
 | |
|  * @since 1.2.3
 | |
|  * @param int $download_id Download ID
 | |
|  * @return void
 | |
|  */
 | |
| function edd_purchase_variable_pricing( $download_id = 0, $args = array() ) {
 | |
| 	global $edd_displayed_form_ids;
 | |
| 
 | |
| 	// If we've already generated a form ID for this download ID, append -#
 | |
| 	$form_id = '';
 | |
| 	if ( $edd_displayed_form_ids[ $download_id ] > 1 ) {
 | |
| 		$form_id .= '-' . $edd_displayed_form_ids[ $download_id ];
 | |
| 	}
 | |
| 
 | |
| 	$variable_pricing = edd_has_variable_prices( $download_id );
 | |
| 
 | |
| 	if ( ! $variable_pricing ) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	$prices = apply_filters( 'edd_purchase_variable_prices', edd_get_variable_prices( $download_id ), $download_id );
 | |
| 
 | |
| 	// If the price_id passed is found in the variable prices, do not display all variable prices.
 | |
| 	if ( false !== $args['price_id'] && isset( $prices[ $args['price_id'] ] ) ) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	$type   = edd_single_price_option_mode( $download_id ) ? 'checkbox' : 'radio';
 | |
| 	$mode   = edd_single_price_option_mode( $download_id ) ? 'multi' : 'single';
 | |
| 
 | |
| 	// Filter the class names for the edd_price_options div
 | |
| 	$css_classes_array = apply_filters( 'edd_price_options_classes', array(
 | |
| 		'edd_price_options',
 | |
| 		'edd_' . esc_attr( $mode ) . '_mode'
 | |
| 	), $download_id );
 | |
| 
 | |
| 	// Sanitize those class names and form them into a string
 | |
| 	$css_classes_string = implode( ' ', array_map( 'sanitize_html_class', $css_classes_array ) );
 | |
| 
 | |
| 	if ( edd_item_in_cart( $download_id ) && ! edd_single_price_option_mode( $download_id ) ) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	do_action( 'edd_before_price_options', $download_id ); ?>
 | |
| 	<div class="<?php echo esc_attr( rtrim( $css_classes_string ) ); ?>">
 | |
| 		<ul>
 | |
| 			<?php
 | |
| 			if ( $prices ) :
 | |
| 				$checked_key = isset( $_GET['price_option'] ) ? absint( $_GET['price_option'] ) : edd_get_default_variable_price( $download_id );
 | |
| 				foreach ( $prices as $key => $price ) :
 | |
| 					echo '<li id="edd_price_option_' . $download_id . '_' . sanitize_key( $price['name'] ) . $form_id . '">';
 | |
| 						echo '<label for="' . esc_attr( 'edd_price_option_' . $download_id . '_' . $key . $form_id ) . '">';
 | |
| 							echo '<input type="' . $type . '" ' . checked( apply_filters( 'edd_price_option_checked', $checked_key, $download_id, $key ), $key, false ) . ' name="edd_options[price_id][]" id="' . esc_attr( 'edd_price_option_' . $download_id . '_' . $key . $form_id ) . '" class="' . esc_attr( 'edd_price_option_' . $download_id ) . '" value="' . esc_attr( $key ) . '" data-price="' . edd_get_price_option_amount( $download_id, $key ) .'"/> ';
 | |
| 
 | |
| 							// Construct the default price output.
 | |
| 							$price_output = '<span class="edd_price_option_name">' . esc_html( $price['name'] ) . '</span><span class="edd_price_option_sep"> – </span><span class="edd_price_option_price">' . edd_currency_filter( edd_format_amount( $price['amount'] ) ) . '</span>';
 | |
| 
 | |
| 							$item_prop = ''; // Changed to an empty string due to migration from microdata to JSON-LD in EDD 3.0
 | |
| 
 | |
| 							// Filter the default price output
 | |
| 							$price_output = apply_filters( 'edd_price_option_output', $price_output, $download_id, $key, $price, $form_id, $item_prop );
 | |
| 
 | |
| 							// Output the filtered price output
 | |
| 							echo $price_output;
 | |
| 
 | |
| 						echo '</label>';
 | |
| 						do_action( 'edd_after_price_option', $key, $price, $download_id );
 | |
| 					echo '</li>';
 | |
| 				endforeach;
 | |
| 			endif;
 | |
| 			do_action( 'edd_after_price_options_list', $download_id, $prices, $type );
 | |
| 			?>
 | |
| 		</ul>
 | |
| 	</div><!--end .edd_price_options-->
 | |
| <?php
 | |
| 	do_action( 'edd_after_price_options', $download_id );
 | |
| }
 | |
| add_action( 'edd_purchase_link_top', 'edd_purchase_variable_pricing', 10, 2 );
 | |
| 
 | |
| /**
 | |
|  * Display the quantity field for a variable price when multi-purchase mode is enabled
 | |
|  *
 | |
|  * @since 2.2
 | |
|  * @param int $download_id Download ID
 | |
|  * @param array $args Argument array
 | |
|  * @return void
 | |
|  */
 | |
| function edd_download_purchase_form_quantity_field( $download_id = 0, $args = array() ) {
 | |
| 
 | |
| 	$options = array();
 | |
| 	if( false !== $args['price_id'] ) {
 | |
| 		$options['price_id'] = $args['price_id'];
 | |
| 	}
 | |
| 
 | |
| 	if ( ! edd_item_quantities_enabled() || edd_download_quantities_disabled( $download_id ) ) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if ( edd_item_in_cart( $download_id ) && ! edd_has_variable_prices( $download_id ) ) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if ( edd_single_price_option_mode( $download_id ) && edd_has_variable_prices( $download_id ) && ! edd_item_in_cart( $download_id, $options ) ) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if ( edd_single_price_option_mode( $download_id ) && edd_has_variable_prices( $download_id ) && edd_item_in_cart( $download_id, $options ) ) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if ( ! edd_single_price_option_mode( $download_id ) && edd_has_variable_prices( $download_id ) && edd_item_in_cart( $download_id, $options ) ) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	ob_start();
 | |
| ?>
 | |
| 	<div class="edd_download_quantity_wrapper">
 | |
| 		<input type="number" min="1" step="1" name="edd_download_quantity" class="edd-input edd-item-quantity" value="1" />
 | |
| 	</div>
 | |
| <?php
 | |
| 	$quantity_input = ob_get_clean();
 | |
| 
 | |
| 	echo apply_filters( 'edd_purchase_form_quantity_input', $quantity_input, $download_id, $args );
 | |
| }
 | |
| add_action( 'edd_purchase_link_top', 'edd_download_purchase_form_quantity_field', 10, 2 );
 | |
| 
 | |
| /**
 | |
|  * Display the quantity field for a variable price when multi-purchase mode is enabled
 | |
|  *
 | |
|  * @since 2.2
 | |
|  * @param int $key Price ID
 | |
|  * @param array $price price option array
 | |
|  * @param int $download_id Download ID
 | |
|  * @return void
 | |
|  */
 | |
| function edd_variable_price_quantity_field( $key, $price, $download_id ) {
 | |
| 
 | |
| 	if( ! edd_item_quantities_enabled() || edd_download_quantities_disabled( $download_id ) ) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if( ! edd_single_price_option_mode( $download_id ) ) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	ob_start();
 | |
| ?>
 | |
| 	<div class="edd_download_quantity_wrapper edd_download_quantity_price_option_<?php echo sanitize_key( $price['name'] ) ?>">
 | |
| 		<span class="edd_price_option_sep"> x </span>
 | |
| 		<input type="number" min="1" step="1" name="edd_download_quantity_<?php echo esc_attr( $key ) ?>" class="edd-input edd-item-quantity" value="1" />
 | |
| 	</div>
 | |
| <?php
 | |
| 	$quantity_input = ob_get_clean();
 | |
| 
 | |
| 	echo apply_filters( 'edd_purchase_form_variation_quantity_input', $quantity_input, $download_id, $key, $price );
 | |
| }
 | |
| add_action( 'edd_after_price_option', 'edd_variable_price_quantity_field', 10, 3 );
 | |
| 
 | |
| /**
 | |
|  * Before Download Content
 | |
|  *
 | |
|  * Adds an action to the beginning of download post content that can be hooked to
 | |
|  * by other functions.
 | |
|  *
 | |
|  * @since 1.0.8
 | |
|  * @global $post
 | |
|  *
 | |
|  * @param $content The the_content field of the download object
 | |
|  * @return string the content with any additional data attached
 | |
|  */
 | |
| function edd_before_download_content( $content ) {
 | |
| 	global $post;
 | |
| 
 | |
| 	if ( $post && $post instanceof WP_Post && 'download' === $post->post_type && is_singular( 'download' ) && is_main_query() && ! post_password_required() ) {
 | |
| 		ob_start();
 | |
| 		do_action( 'edd_before_download_content', $post->ID );
 | |
| 		$content = ob_get_clean() . $content;
 | |
| 	}
 | |
| 
 | |
| 	return $content;
 | |
| }
 | |
| add_filter( 'the_content', 'edd_before_download_content' );
 | |
| 
 | |
| /**
 | |
|  * After Download Content
 | |
|  *
 | |
|  * Adds an action to the end of download post content that can be hooked to by
 | |
|  * other functions.
 | |
|  *
 | |
|  * @since 1.0.8
 | |
|  * @global $post
 | |
|  *
 | |
|  * @param $content The the_content field of the download object
 | |
|  * @return string the content with any additional data attached
 | |
|  */
 | |
| function edd_after_download_content( $content ) {
 | |
| 	global $post;
 | |
| 
 | |
| 	if ( $post && $post->post_type == 'download' && is_singular( 'download' ) && is_main_query() && !post_password_required() ) {
 | |
| 		ob_start();
 | |
| 		do_action( 'edd_after_download_content', $post->ID );
 | |
| 		$content .= ob_get_clean();
 | |
| 	}
 | |
| 
 | |
| 	return $content;
 | |
| }
 | |
| add_filter( 'the_content', 'edd_after_download_content' );
 | |
| 
 | |
| /**
 | |
|  * Get Button Colors
 | |
|  *
 | |
|  * Returns an array of button colors.
 | |
|  *
 | |
|  * @since 1.0
 | |
|  * @return array $colors Button colors
 | |
|  */
 | |
| function edd_get_button_colors() {
 | |
| 	$colors = array(
 | |
| 		'white'     => array(
 | |
| 			'label' => __( 'White', 'easy-digital-downloads' ),
 | |
| 			'hex'   => '#ffffff'
 | |
| 		),
 | |
| 		'gray'      => array(
 | |
| 			'label' => __( 'Gray', 'easy-digital-downloads' ),
 | |
| 			'hex'   => '#f0f0f0'
 | |
| 		),
 | |
| 		'blue'      => array(
 | |
| 			'label' => __( 'Blue', 'easy-digital-downloads' ),
 | |
| 			'hex'   => '#428bca'
 | |
| 		),
 | |
| 		'red'       => array(
 | |
| 			'label' => __( 'Red', 'easy-digital-downloads' ),
 | |
| 			'hex'   => '#d9534f'
 | |
| 		),
 | |
| 		'green'     => array(
 | |
| 			'label' => __( 'Green', 'easy-digital-downloads' ),
 | |
| 			'hex'   => '#5cb85c'
 | |
| 		),
 | |
| 		'yellow'    => array(
 | |
| 			'label' => __( 'Yellow', 'easy-digital-downloads' ),
 | |
| 			'hex'   => '#f0ad4e'
 | |
| 		),
 | |
| 		'orange'    => array(
 | |
| 			'label' => __( 'Orange', 'easy-digital-downloads' ),
 | |
| 			'hex'   => '#ed9c28'
 | |
| 		),
 | |
| 		'dark-gray' => array(
 | |
| 			'label' => __( 'Dark Gray', 'easy-digital-downloads' ),
 | |
| 			'hex'   => '#363636'
 | |
| 		),
 | |
| 		'inherit'	=> array(
 | |
| 			'label' => __( 'Inherit', 'easy-digital-downloads' ),
 | |
| 			'hex'   => ''
 | |
| 		)
 | |
| 	);
 | |
| 
 | |
| 	return apply_filters( 'edd_button_colors', $colors );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Get Button Styles
 | |
|  *
 | |
|  * Returns an array of button styles.
 | |
|  *
 | |
|  * @since 1.2.2
 | |
|  * @return array $styles Button styles
 | |
|  */
 | |
| function edd_get_button_styles() {
 | |
| 	$styles = array(
 | |
| 		'button'	=> __( 'Button', 'easy-digital-downloads' ),
 | |
| 		'plain'     => __( 'Plain Text', 'easy-digital-downloads' )
 | |
| 	);
 | |
| 
 | |
| 	return apply_filters( 'edd_button_styles', $styles );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Default formatting for download excerpts
 | |
|  *
 | |
|  * This excerpt is primarily used in the [downloads] shortcode
 | |
|  *
 | |
|  * @since 1.0.8.4
 | |
|  * @param string $excerpt Content before filtering
 | |
|  * @return string $excerpt Content after filtering
 | |
|  * @return string
 | |
|  */
 | |
| function edd_downloads_default_excerpt( $excerpt ) {
 | |
| 	return do_shortcode( wpautop( $excerpt ) );
 | |
| }
 | |
| add_filter( 'edd_downloads_excerpt', 'edd_downloads_default_excerpt' );
 | |
| 
 | |
| /**
 | |
|  * Default formatting for full download content
 | |
|  *
 | |
|  * This is primarily used in the [downloads] shortcode
 | |
|  *
 | |
|  * @since 1.0.8.4
 | |
|  * @param string $content Content before filtering
 | |
|  * @return string $content Content after filtering
 | |
|  */
 | |
| function edd_downloads_default_content( $content ) {
 | |
| 	return do_shortcode( wpautop( $content ) );
 | |
| }
 | |
| add_filter( 'edd_downloads_content', 'edd_downloads_default_content' );
 | |
| 
 | |
| /**
 | |
|  * Gets the download links for each item purchased
 | |
|  *
 | |
|  * @since 1.1.5
 | |
|  * @param int $payment_id The ID of the payment to retrieve download links for
 | |
|  * @return string
 | |
|  */
 | |
| function edd_get_purchase_download_links( $payment_id = 0 ) {
 | |
| 
 | |
| 	$downloads   = edd_get_payment_meta_cart_details( $payment_id, true );
 | |
| 	$payment_key = edd_get_payment_key( $payment_id );
 | |
| 	$email       = edd_get_payment_user_email( $payment_id );
 | |
| 	$links       = '<ul class="edd_download_links">';
 | |
| 
 | |
| 	foreach ( $downloads as $download ) {
 | |
| 		$links .= '<li>';
 | |
| 			$links .= '<h3 class="edd_download_link_title">' . esc_html( get_the_title( $download['id'] ) ) . '</h3>';
 | |
| 			$price_id = isset( $download['options'] ) && isset( $download['options']['price_id'] ) ? $download['options']['price_id'] : null;
 | |
| 			$files    = edd_get_download_files( $download['id'], $price_id );
 | |
| 			if ( is_array( $files ) ) {
 | |
| 				foreach ( $files as $filekey => $file ) {
 | |
| 					$links .= '<div class="edd_download_link_file">';
 | |
| 						$links .= '<a href="' . esc_url( edd_get_download_file_url( $payment_key, $email, $filekey, $download['id'], $price_id ) ) . '">';
 | |
| 						$links .= edd_get_file_name( $file );
 | |
| 						$links .= '</a>';
 | |
| 					$links .= '</div>';
 | |
| 				}
 | |
| 			}
 | |
| 		$links .= '</li>';
 | |
| 	}
 | |
| 
 | |
| 	$links .= '</ul>';
 | |
| 
 | |
| 	return $links;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Returns the path to the EDD templates directory
 | |
|  *
 | |
|  * @since 1.2
 | |
|  * @return string
 | |
|  */
 | |
| function edd_get_templates_dir() {
 | |
| 	return EDD_PLUGIN_DIR . 'templates';
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Returns the URL to the EDD templates directory
 | |
|  *
 | |
|  * @since 1.3.2.1
 | |
|  * @return string
 | |
|  */
 | |
| function edd_get_templates_url() {
 | |
| 	return EDD_PLUGIN_URL . 'templates';
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Retrieves a template part
 | |
|  *
 | |
|  * @since v1.2
 | |
|  *
 | |
|  * Taken from bbPress
 | |
|  *
 | |
|  * @param string $slug
 | |
|  * @param string $name Optional. Default null
 | |
|  * @param bool   $load
 | |
|  *
 | |
|  * @return string
 | |
|  *
 | |
|  * @uses edd_locate_template()
 | |
|  * @uses load_template()
 | |
|  * @uses get_template_part()
 | |
|  */
 | |
| function edd_get_template_part( $slug, $name = null, $load = true ) {
 | |
| 	// Execute code for this part
 | |
| 	do_action( 'get_template_part_' . $slug, $slug, $name );
 | |
| 
 | |
| 	$load_template = apply_filters( 'edd_allow_template_part_' . $slug . '_' . $name, true );
 | |
| 	if ( false === $load_template ) {
 | |
| 		return '';
 | |
| 	}
 | |
| 
 | |
| 	// Setup possible parts
 | |
| 	$templates = array();
 | |
| 	if ( isset( $name ) )
 | |
| 		$templates[] = $slug . '-' . $name . '.php';
 | |
| 	$templates[] = $slug . '.php';
 | |
| 
 | |
| 	// Allow template parts to be filtered
 | |
| 	$templates = apply_filters( 'edd_get_template_part', $templates, $slug, $name );
 | |
| 
 | |
| 	// Return the part that is found
 | |
| 	return edd_locate_template( $templates, $load, false );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Only allow the pending verification message to display once
 | |
|  * @since 2.7.8
 | |
|  * @param $load_template
 | |
|  *
 | |
|  * @return bool
 | |
|  */
 | |
| function edd_load_verification_template_once( $load_template ) {
 | |
| 	static $account_pending_loaded;
 | |
| 	if ( ! is_null( $account_pending_loaded ) ) {
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	$account_pending_loaded = true;
 | |
| 	return $load_template;
 | |
| }
 | |
| add_filter( 'edd_allow_template_part_account_pending', 'edd_load_verification_template_once', 10, 1 );
 | |
| 
 | |
| /**
 | |
|  * Retrieve the name of the highest priority template file that exists.
 | |
|  *
 | |
|  * Searches in the STYLESHEETPATH before TEMPLATEPATH so that themes which
 | |
|  * inherit from a parent theme can just overload one file. If the template is
 | |
|  * not found in either of those, it looks in the theme-compat folder last.
 | |
|  *
 | |
|  * Taken from bbPress
 | |
|  *
 | |
|  * @since 1.2
 | |
|  *
 | |
|  * @param string|array $template_names Template file(s) to search for, in order.
 | |
|  * @param bool $load If true the template file will be loaded if it is found.
 | |
|  * @param bool $require_once Whether to require_once or require. Default true.
 | |
|  *   Has no effect if $load is false.
 | |
|  * @return string The template filename if one is located.
 | |
|  */
 | |
| function edd_locate_template( $template_names, $load = false, $require_once = true ) {
 | |
| 	// No file found yet
 | |
| 	$located = false;
 | |
| 
 | |
| 	// Try to find a template file
 | |
| 	foreach ( (array) $template_names as $template_name ) {
 | |
| 
 | |
| 		// Continue if template is empty
 | |
| 		if ( empty( $template_name ) )
 | |
| 			continue;
 | |
| 
 | |
| 		// Trim off any slashes from the template name
 | |
| 		$template_name = ltrim( $template_name, '/' );
 | |
| 
 | |
| 		// try locating this template file by looping through the template paths
 | |
| 		foreach( edd_get_theme_template_paths() as $template_path ) {
 | |
| 
 | |
| 			if( file_exists( $template_path . $template_name ) ) {
 | |
| 				$located = $template_path . $template_name;
 | |
| 				break;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if( $located ) {
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if ( ( true == $load ) && ! empty( $located ) )
 | |
| 		load_template( $located, $require_once );
 | |
| 
 | |
| 	return $located;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Returns a list of paths to check for template locations
 | |
|  *
 | |
|  * @since 1.8.5
 | |
|  * @return mixed|void
 | |
|  */
 | |
| function edd_get_theme_template_paths() {
 | |
| 
 | |
| 	$template_dir = edd_get_theme_template_dir_name();
 | |
| 
 | |
| 	$file_paths = array(
 | |
| 		1 => trailingslashit( get_stylesheet_directory() ) . $template_dir,
 | |
| 		10 => trailingslashit( get_template_directory() ) . $template_dir,
 | |
| 		100 => edd_get_templates_dir()
 | |
| 	);
 | |
| 
 | |
| 	$file_paths = apply_filters( 'edd_template_paths', $file_paths );
 | |
| 
 | |
| 	// sort the file paths based on priority
 | |
| 	ksort( $file_paths, SORT_NUMERIC );
 | |
| 
 | |
| 	return array_map( 'trailingslashit', $file_paths );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Returns the template directory name.
 | |
|  *
 | |
|  * Themes can filter this by using the edd_templates_dir filter.
 | |
|  *
 | |
|  * @since 1.6.2
 | |
|  * @return string
 | |
| */
 | |
| function edd_get_theme_template_dir_name() {
 | |
| 	return trailingslashit( apply_filters( 'edd_templates_dir', 'edd_templates' ) );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Add no-index and no-follow to EDD checkout and purchase confirmation pages
 | |
|  *
 | |
|  * @since 2.0
 | |
|  *
 | |
|  * @return void
 | |
|  */
 | |
| function edd_checkout_meta_tags() {
 | |
| 
 | |
| 	$pages   = array();
 | |
| 	$pages[] = edd_get_option( 'success_page' );
 | |
| 	$pages[] = edd_get_option( 'failure_page' );
 | |
| 	$pages[] = edd_get_option( 'purchase_history_page' );
 | |
| 
 | |
| 	if( ! edd_is_checkout() && ! is_page( $pages ) ) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	echo '<meta name="edd-chosen-gateway" content="' . edd_get_chosen_gateway() . '"/>' . "\n";
 | |
| 	echo '<meta name="robots" content="noindex,nofollow" />' . "\n";
 | |
| }
 | |
| add_action( 'wp_head', 'edd_checkout_meta_tags' );
 | |
| 
 | |
| /**
 | |
|  * Adds EDD Version to the <head> tag
 | |
|  *
 | |
|  * @since 1.4.2
 | |
|  * @return void
 | |
| */
 | |
| function edd_version_in_header(){
 | |
| 	echo '<meta name="generator" content="Easy Digital Downloads v' . EDD_VERSION . '" />' . "\n";
 | |
| }
 | |
| add_action( 'wp_head', 'edd_version_in_header' );
 | |
| 
 | |
| /**
 | |
|  * Determines if we're currently on the Purchase History page.
 | |
|  *
 | |
|  * @since 2.1
 | |
|  * @return bool True if on the Purchase History page, false otherwise.
 | |
|  */
 | |
| function edd_is_purchase_history_page() {
 | |
| 	$ret = edd_get_option( 'purchase_history_page', false );
 | |
| 	$ret = $ret ? is_page( $ret ) : false;
 | |
| 	return apply_filters( 'edd_is_purchase_history_page', $ret );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Adds body classes for EDD pages
 | |
|  *
 | |
|  * @since 2.1
 | |
|  * @param array $class current classes
 | |
|  * @return array Modified array of classes
 | |
|  */
 | |
| function edd_add_body_classes( $class ) {
 | |
| 	$classes = (array) $class;
 | |
| 
 | |
| 	if( edd_is_checkout() ) {
 | |
| 		$classes[] = 'edd-checkout';
 | |
| 		$classes[] = 'edd-page';
 | |
| 	}
 | |
| 
 | |
| 	if( edd_is_success_page() ) {
 | |
| 		$classes[] = 'edd-success';
 | |
| 		$classes[] = 'edd-page';
 | |
| 	}
 | |
| 
 | |
| 	if( edd_is_failed_transaction_page() ) {
 | |
| 		$classes[] = 'edd-failed-transaction';
 | |
| 		$classes[] = 'edd-page';
 | |
| 	}
 | |
| 
 | |
| 	if( edd_is_purchase_history_page() ) {
 | |
| 		$classes[] = 'edd-purchase-history';
 | |
| 		$classes[] = 'edd-page';
 | |
| 	}
 | |
| 
 | |
| 	if( edd_is_test_mode() ) {
 | |
| 		$classes[] = 'edd-test-mode';
 | |
| 	}
 | |
| 
 | |
| 	$classes[] = 'edd-js-none';
 | |
| 
 | |
| 	return array_unique( $classes );
 | |
| }
 | |
| add_filter( 'body_class', 'edd_add_body_classes' );
 | |
| 
 | |
| /**
 | |
|  * Adds post classes for downloads
 | |
|  *
 | |
|  * @since 2.1
 | |
|  * @param array $classes Current classes
 | |
|  * @param string|array $class
 | |
|  * @param int $post_id The ID of the current post
 | |
|  * @return array Modified array of classes
 | |
|  */
 | |
| function edd_add_download_post_classes( $classes, $class = '', $post_id = false ) {
 | |
| 	if( ! $post_id || get_post_type( $post_id ) !== 'download' || is_admin() ) {
 | |
| 		return $classes;
 | |
| 	}
 | |
| 
 | |
| 	$download = edd_get_download( $post_id );
 | |
| 
 | |
| 	if( $download ) {
 | |
| 		$classes[] = 'edd-download';
 | |
| 
 | |
| 		// Add category slugs
 | |
| 		$categories = get_the_terms( $post_id, 'download_category' );
 | |
| 		if( ! empty( $categories ) ) {
 | |
| 			foreach( $categories as $key => $value ) {
 | |
| 				$classes[] = 'edd-download-cat-' . $value->slug;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Add tag slugs
 | |
| 		$tags = get_the_terms( $post_id, 'download_tag' );
 | |
| 		if( ! empty( $tags ) ) {
 | |
| 			foreach( $tags as $key => $value ) {
 | |
| 				$classes[] = 'edd-download-tag-' . $value->slug;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Add edd-download
 | |
| 		if( is_singular( 'download' ) ) {
 | |
| 			$classes[] = 'edd-download';
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return $classes;
 | |
| }
 | |
| add_filter( 'post_class', 'edd_add_download_post_classes', 20, 3 );
 | |
| 
 | |
| /**
 | |
|  * Adds Download product price to oembed display
 | |
|  *
 | |
|  * @since 2.6
 | |
|  * @return void
 | |
|  */
 | |
| function edd_add_oembed_price() {
 | |
| 
 | |
| 	if( 'download' !== get_post_type( get_the_ID() ) ) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	$show = ! get_post_meta( get_the_ID(), '_edd_hide_purchase_link', true );
 | |
| 
 | |
| 	if ( apply_filters( 'edd_show_oembed_purchase_links', $show ) ) {
 | |
| 		echo '<style>.wp-embed-edd-price { margin: 20px 0 0 0; }</style>';
 | |
| 		echo '<div class="wp-embed-edd-price">';
 | |
| 			if ( edd_has_variable_prices( get_the_ID() ) ) {
 | |
| 				echo edd_price_range( get_the_ID() );
 | |
| 			} else {
 | |
| 				edd_price( get_the_ID(), true );
 | |
| 			}
 | |
| 
 | |
| 		echo '</div>';
 | |
| 	}
 | |
| }
 | |
| add_action( 'embed_content', 'edd_add_oembed_price' );
 | |
| 
 | |
| /**
 | |
|  * Remove comments button for download embeds
 | |
|  *
 | |
|  * @since 2.6
 | |
|  * @return  void
 | |
|  */
 | |
| function edd_remove_embed_comments_button() {
 | |
| 	global $post;
 | |
| 
 | |
| 	$hide_comments = apply_filters( 'edd_embed_hide_comments', true, $post );
 | |
| 
 | |
| 	if ( ! empty( $post ) && $post->post_type == 'download' && true === $hide_comments ) {
 | |
| 		remove_action( 'embed_content_meta', 'print_embed_comments_button' );
 | |
| 	}
 | |
| }
 | |
| add_action( 'embed_content_meta', 'edd_remove_embed_comments_button', 5 );
 | |
| 
 | |
| /**
 | |
|  * Get a fully formatted title of a bundle item
 | |
|  *
 | |
|  * @since 2.7
 | |
|  *
 | |
|  * @param array $bundle_item Bundle item.
 | |
|  * @return string Bundle item title.
 | |
|  */
 | |
| function edd_get_bundle_item_title( $bundle_item ) {
 | |
| 	$bundle_item_pieces = explode( '_', $bundle_item );
 | |
| 	$bundle_item_id = $bundle_item_pieces[0];
 | |
| 	$bundle_price_id = isset( $bundle_item_pieces[1] ) ? $bundle_item_pieces[1] : null;
 | |
| 
 | |
| 	$prices = edd_get_variable_prices( $bundle_item_id );
 | |
| 	$bundle_title = get_the_title( $bundle_item_id );
 | |
| 
 | |
| 	if ( null !== $bundle_price_id ) {
 | |
| 		$bundle_title .= ' - ' . $prices[ $bundle_price_id ]['name'];
 | |
| 	}
 | |
| 
 | |
| 	return $bundle_title;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Retrieve the ID of an item in a bundle.
 | |
|  *
 | |
|  * @since 2.7
 | |
|  *
 | |
|  * @param array $bundle_item Bundle item.
 | |
|  * @return string Bundle item ID.
 | |
|  */
 | |
| function edd_get_bundle_item_id( $bundle_item ) {
 | |
| 	$bundle_item_pieces = explode( '_', $bundle_item );
 | |
| 	$bundle_item_id = $bundle_item_pieces[0];
 | |
| 	return $bundle_item_id;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Retrieve the price ID of a bundle item.
 | |
|  *
 | |
|  * @since 2.7
 | |
|  *
 | |
|  * @param array $bundle_item Bundle item.
 | |
|  * @return string Bundle item ID.
 | |
|  */
 | |
| function edd_get_bundle_item_price_id( $bundle_item ) {
 | |
| 	$bundle_item_pieces = explode( '_', $bundle_item );
 | |
| 	$bundle_item_id = $bundle_item_pieces[0];
 | |
| 	$bundle_price_id = isset( $bundle_item_pieces[1] ) ? $bundle_item_pieces[1] : null;
 | |
| 
 | |
| 	return $bundle_price_id;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Load a template file for a single download item.
 | |
|  *
 | |
|  * This is a wrapper function for backwards compatibility so the
 | |
|  * shortcode's attributes can be passed to the template file via
 | |
|  * a global variable.
 | |
|  *
 | |
|  * @since 2.8.0
 | |
|  *
 | |
|  * @param array $atts The [downloads] shortcode attributes.
 | |
|  * @param int   $i The current item count.
 | |
|  */
 | |
| function edd_download_shortcode_item( $atts, $i ) {
 | |
| 	global $edd_download_shortcode_item_atts, $edd_download_shortcode_item_i;
 | |
| 
 | |
| 	/**
 | |
| 	 * The variables are registered as part of the global scope so the template can access them.
 | |
| 	 */
 | |
| 	$edd_download_shortcode_item_atts = $atts;
 | |
| 	$edd_download_shortcode_item_i = $i;
 | |
| 
 | |
| 	edd_get_template_part( 'shortcode', 'download' );
 | |
| }
 | |
| add_action( 'edd_download_shortcode_item', 'edd_download_shortcode_item', 10, 2 );
 | |
| 
 | |
| /**
 | |
|  * Output full content for a download item in the [downloads] shortcode.
 | |
|  *
 | |
|  * Strips the [downloads] shortcode to avoid recursion.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @return string
 | |
|  */
 | |
| function edd_download_shortcode_full_content() {
 | |
| 	$pattern = get_shortcode_regex( array( 'downloads' ) );
 | |
| 	$content = preg_replace( "/$pattern/", '', get_the_content( '' ) );
 | |
| 
 | |
| 	/**
 | |
| 	 * Filters the full content output for an individual download in [downloads] shortcode.
 | |
| 	 *
 | |
| 	 * @since 1.2
 | |
| 	 *
 | |
| 	 * @param string $content Download content.
 | |
| 	 */
 | |
| 	return apply_filters( 'edd_downloads_content', $content );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Output an excerpt for a download item in the [downloads] shortcode.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @return string
 | |
|  */
 | |
| function edd_download_shortcode_excerpt() {
 | |
| 	// Adjust excerpt lengths.
 | |
| 	add_filter( 'excerpt_length', 'edd_download_shortcode_excerpt_length' );
 | |
| 
 | |
| 	// Ensure we use `the_excerpt` filter (for length).
 | |
| 	ob_start();
 | |
| 	the_excerpt();
 | |
| 	$excerpt = ob_get_clean();
 | |
| 
 | |
| 	/**
 | |
| 	 * Filters the excerpt output for an individual download in [downloads] shortcode.
 | |
| 	 *
 | |
| 	 * @since 1.2
 | |
| 	 *
 | |
| 	 * @param string $excerpt Download excerpt.
 | |
| 	 */
 | |
| 	$excerpt = apply_filters( 'edd_downloads_excerpt', $excerpt );
 | |
| 
 | |
| 	// Let other excerpt lengths act independently again.
 | |
| 	remove_filter( 'excerpt_length', 'edd_download_shortcode_excerpt_length' );
 | |
| 
 | |
| 	return $excerpt;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Callback for the [downloads] shortcode excerpt length.
 | |
|  *
 | |
|  * Added as a callable function so it can be removed after the downloads are output.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @return int
 | |
|  */
 | |
| function edd_download_shortcode_excerpt_length() {
 | |
| 	$length = 30;
 | |
| 
 | |
| 	/**
 | |
| 	 * Filters the length of the generated excerpts in the [downloads] shortcode.
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @param int $length Length of the excerpt (in words).
 | |
| 	 */
 | |
| 	return apply_filters( 'edd_download_shortcode_excerpt_length', $length );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Load the pagination for the [downloads] shortcode.
 | |
|  *
 | |
|  * @since 2.9.8
 | |
|  *
 | |
|  * @param array  $atts The [downloads] shortcode attributes.
 | |
|  * @param object $downloads The WP_Query.
 | |
|  * @param array  $query EDD's array of attributes used to construct the main WP_Query.
 | |
|  */
 | |
| function edd_downloads_pagination( $atts, $downloads, $query ) {
 | |
| 	if ( filter_var( $atts['pagination'], FILTER_VALIDATE_BOOLEAN ) ) {
 | |
| 		$args = array(
 | |
| 			'type'    => 'download',
 | |
| 			'format'  => '?paged=%#%',
 | |
| 			'current' => max( 1, $query['paged'] ),
 | |
| 			'total'   => $downloads->max_num_pages
 | |
| 		);
 | |
| 
 | |
| 		if ( is_single() ) {
 | |
| 			$args['base'] = get_permalink() . '%#%';
 | |
| 		} else {
 | |
| 			$big          = 999999;
 | |
| 			$search_for   = array( $big, '#038;' );
 | |
| 			$replace_with = array( '%#%', '&' );
 | |
| 			$args['base'] = str_replace( $search_for, $replace_with, get_pagenum_link( $big ) );
 | |
| 		}
 | |
| 
 | |
| 		$args = apply_filters( 'edd_download_pagination_args', $args, $atts, $downloads, $query );
 | |
| 
 | |
| 		echo edd_pagination( $args );
 | |
| 	}
 | |
| }
 | |
| add_action( 'edd_downloads_list_after', 'edd_downloads_pagination', 10, 3 );
 | |
| 
 | |
| /**
 | |
|  * Build pagination
 | |
|  *
 | |
|  * @since 2.9.8
 | |
|  *
 | |
|  * @param array $args The arguments used to build the pagination.
 | |
|  */
 | |
| function edd_pagination( $args = array() ) {
 | |
| 
 | |
| 	$big = 999999;
 | |
| 
 | |
| 	$defaults = array(
 | |
| 		'base'    => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
 | |
| 		'format'  => '?paged=%#%',
 | |
| 		'current' => max( 1, get_query_var( 'paged' ) ),
 | |
| 		'type'    => '',
 | |
| 		'total'   => '',
 | |
| 	);
 | |
| 
 | |
| 	$args = wp_parse_args( $args, $defaults );
 | |
| 
 | |
| 	/**
 | |
| 	 * Filter pagination args.
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @param array $args Pagination arguments.
 | |
| 	 */
 | |
| 	$args = apply_filters( 'edd_pagination_args', $args );
 | |
| 
 | |
| 	$type  = $args['type'];
 | |
| 	$total = $args['total'];
 | |
| 
 | |
| 	// Type and total must be specified.
 | |
| 	if ( empty( $type ) || empty( $total ) ) {
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	$pagination = paginate_links(
 | |
| 		array(
 | |
| 			'base'    => $args['base'],
 | |
| 			'format'  => $args['format'],
 | |
| 			'current' => $args['current'],
 | |
| 			'total'   => $total
 | |
| 		)
 | |
| 	);
 | |
| 
 | |
| 	if ( ! empty( $pagination ) ) : ?>
 | |
| 		<div id="edd_<?php echo $type; ?>_pagination" class="edd_pagination navigation">
 | |
| 			<?php echo $pagination; ?>
 | |
| 		</div>
 | |
| 	<?php endif;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Gets the CSS class for the button color.
 | |
|  *
 | |
|  * @since 3.1
 | |
|  * @param string $default The default color option to use as a fallback.
 | |
|  * @return string
 | |
|  */
 | |
| function edd_get_button_color_class( $default = 'blue' ) {
 | |
| 	$color = edd_get_option( 'checkout_color', $default );
 | |
| 	$class = 'inherit' !== $color ? $color : '';
 | |
| 
 | |
| 	return apply_filters( 'edd_button_color_class', $class );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Return a list of theme files found in both parent and child themes.
 | |
|  *
 | |
|  * This allows us to detect when a core template is being overridden by a theme.
 | |
|  *
 | |
|  * @since 3.1
 | |
|  *
 | |
|  * @return array List of files that the parent and child themes are overriding, relative.
 | |
|  */
 | |
| function edd_get_theme_edd_templates() {
 | |
| 	$parent_theme_dir = trailingslashit( get_template_directory() ) . 'edd_templates/';
 | |
| 	$child_theme_dir  = trailingslashit( get_stylesheet_directory() ) . 'edd_templates/';
 | |
| 
 | |
| 	$theme_edd_templates = array();
 | |
| 
 | |
| 	if ( $parent_theme_dir === $child_theme_dir ) {
 | |
| 		$child_theme_dir = false;
 | |
| 	}
 | |
| 
 | |
| 	$found_templates = array();
 | |
| 	if ( is_dir( $parent_theme_dir ) ) {
 | |
| 		$found_templates = list_files( $parent_theme_dir );
 | |
| 	}
 | |
| 
 | |
| 	$found_child_templates = array();
 | |
| 	if ( false !== $child_theme_dir && is_dir( $child_theme_dir ) ) {
 | |
| 		$found_child_templates = list_files( $child_theme_dir );
 | |
| 	}
 | |
| 
 | |
| 	$theme_edd_templates = array_map(
 | |
| 		function( $file ) {
 | |
| 			return str_replace( get_theme_root() . '/', '', $file );
 | |
| 		},
 | |
| 		array_merge( $found_templates, $found_child_templates )
 | |
| 	);
 | |
| 
 | |
| 	return $theme_edd_templates;
 | |
| }
 |