221 lines
6.7 KiB
PHP
221 lines
6.7 KiB
PHP
<?php
|
|
/**
|
|
* Template Loader for AA Events.
|
|
*
|
|
* @package AA_Events
|
|
*/
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit; // Exit if accessed directly.
|
|
}
|
|
|
|
/**
|
|
* Build safe contact-email markup for event templates.
|
|
*
|
|
* @param mixed $value Raw contact email value.
|
|
* @return string Escaped mailto anchor, or an empty string for invalid input.
|
|
*/
|
|
function aa_events_contact_email_markup( $value ) {
|
|
$raw = trim( (string) $value );
|
|
$email = sanitize_email( $raw );
|
|
if ( '' === $email || $email !== $raw ) {
|
|
return '';
|
|
}
|
|
|
|
$protected = antispambot( $email );
|
|
return '<a href="' . esc_attr( 'mailto:' . $protected ) . '">' . wp_kses_post( $protected ) . '</a>';
|
|
}
|
|
|
|
/**
|
|
* Build safe registration-link markup for event templates.
|
|
*
|
|
* @param mixed $value Raw registration link value.
|
|
* @return string Escaped registration link, or an empty string for invalid input.
|
|
*/
|
|
function aa_events_registration_link_markup( $value ) {
|
|
if ( is_array( $value ) ) {
|
|
if ( ! isset( $value['url'] ) || ! is_string( $value['url'] ) ) {
|
|
return '';
|
|
}
|
|
|
|
$url = trim( $value['url'] );
|
|
$target = isset( $value['target'] ) && is_string( $value['target'] ) ? $value['target'] : '';
|
|
} elseif ( is_string( $value ) ) {
|
|
$url = trim( $value );
|
|
$target = '';
|
|
} else {
|
|
return '';
|
|
}
|
|
|
|
if ( '' === $url || false === filter_var( $url, FILTER_VALIDATE_URL ) ) {
|
|
return '';
|
|
}
|
|
|
|
$url_parts = wp_parse_url( $url );
|
|
if (
|
|
! is_array( $url_parts ) ||
|
|
empty( $url_parts['host'] ) ||
|
|
empty( $url_parts['scheme'] ) ||
|
|
! in_array( strtolower( $url_parts['scheme'] ), array( 'http', 'https' ), true )
|
|
) {
|
|
return '';
|
|
}
|
|
|
|
$target_attributes = '_blank' === $target ? ' target="_blank" rel="noopener noreferrer"' : '';
|
|
|
|
return '<a class="aa-event-registration-link button" href="' . esc_url( $url ) . '"' . $target_attributes . '>' . esc_html( __( 'Register', 'aa-events' ) ) . '</a>';
|
|
}
|
|
|
|
/**
|
|
* Load a template.
|
|
*
|
|
* Handles template usage so that users can override the plugin's templates by using the theme.
|
|
*
|
|
* @param string $template_name Template name.
|
|
* @param array $args Arguments. (default: array).
|
|
* @param string $template_path Template path. (default: '').
|
|
* @param string $default_path Default path. (default: '').
|
|
*/
|
|
function events_get_template( $template_name, $args = array(), $template_path = '', $default_path = '' ) {
|
|
if ( ! empty( $args ) && is_array( $args ) ) {
|
|
extract( $args ); // phpcs:ignore WordPress.PHP.DontExtract.extract_extract
|
|
}
|
|
|
|
$located = events_locate_template( $template_name, $template_path, $default_path );
|
|
|
|
if ( ! file_exists( $located ) ) {
|
|
_doing_it_wrong( __FUNCTION__, sprintf( '<code>%s</code> does not exist.', esc_html( $located ) ), '1.0' );
|
|
return;
|
|
}
|
|
|
|
// Allow 3rd party plugin filter template file from theme.
|
|
$located = apply_filters( 'events_get_template', $located, $template_name, $args, $template_path, $default_path );
|
|
|
|
do_action( 'events_before_template_part', $template_name, $template_path, $located, $args );
|
|
|
|
include $located;
|
|
|
|
do_action( 'events_after_template_part', $template_name, $template_path, $located, $args );
|
|
}
|
|
|
|
/**
|
|
* Locate a template and return the path for inclusion.
|
|
*
|
|
* This is the load order:
|
|
*
|
|
* yourtheme/$template_path/$template_name
|
|
* yourtheme/$template_name
|
|
* $default_path/$template_name
|
|
*
|
|
* @param string $template_name Template name.
|
|
* @param string $template_path Template path. (default: '').
|
|
* @param string $default_path Default path. (default: '').
|
|
* @return string
|
|
*/
|
|
function events_locate_template( $template_name, $template_path = '', $default_path = '' ) {
|
|
if ( ! $template_path ) {
|
|
$template_path = 'aa-events/';
|
|
}
|
|
|
|
if ( ! $default_path ) {
|
|
$default_path = AA_EVENTS_PLUGIN_DIR . 'templates/';
|
|
}
|
|
|
|
// Look within passed path within the theme - this is priority.
|
|
$template = locate_template(
|
|
array(
|
|
trailingslashit( $template_path ) . $template_name,
|
|
$template_name,
|
|
)
|
|
);
|
|
|
|
// Get default template/
|
|
if ( ! $template ) {
|
|
$template = $default_path . $template_name;
|
|
}
|
|
|
|
// Return what we found.
|
|
return apply_filters( 'events_locate_template', $template, $template_name, $template_path );
|
|
}
|
|
|
|
/**
|
|
* Filter the single template.
|
|
*
|
|
* @param string $template Template.
|
|
* @return string
|
|
*/
|
|
function events_single_template( $template ) {
|
|
if ( get_post_type() === 'event' ) {
|
|
$template = events_locate_template( 'single-event.php' );
|
|
}
|
|
return $template;
|
|
}
|
|
add_filter( 'single_template', 'events_single_template' );
|
|
|
|
/**
|
|
* Filter the archive template.
|
|
*
|
|
* @param string $template Template.
|
|
* @return string
|
|
*/
|
|
function events_archive_template( $template ) {
|
|
if ( is_post_type_archive( 'event' ) ) {
|
|
$template = events_locate_template( 'archive-event.php' );
|
|
}
|
|
return $template;
|
|
}
|
|
add_filter( 'archive_template', 'events_archive_template' );
|
|
|
|
/**
|
|
* Register plugin-provided page templates so they appear in the editor.
|
|
*
|
|
* WordPress only scans themes for page templates by default. This filter
|
|
* injects our plugin template into the list shown in the Page Attributes
|
|
* (or Template) dropdown, without requiring the file to live in the theme.
|
|
*
|
|
* @param array $page_templates Array of page templates.
|
|
* @param WP_Theme $theme WP_Theme object.
|
|
* @param WP_Post|null $post The post being edited (or null).
|
|
* @param string $post_type Post type slug.
|
|
* @return array
|
|
*/
|
|
function events_register_page_templates( $page_templates, $theme, $post, $post_type ) {
|
|
if ( 'page' !== $post_type ) {
|
|
return $page_templates;
|
|
}
|
|
|
|
// Key can be any unique string. We'll look for this exact value when loading.
|
|
$page_templates['aa-events-template-calendar.php'] = __( 'Events Calendar', 'aa-events' );
|
|
|
|
return $page_templates;
|
|
}
|
|
add_filter( 'theme_page_templates', 'events_register_page_templates', 10, 4 );
|
|
|
|
/**
|
|
* Load the selected plugin template on the front end.
|
|
*
|
|
* When a page uses our registered template slug, point WordPress to the
|
|
* template file bundled inside the plugin.
|
|
*
|
|
* @param string $template Resolved template path.
|
|
* @return string
|
|
*/
|
|
function events_load_plugin_page_template( $template ) {
|
|
if ( is_singular( 'page' ) ) {
|
|
$post_id = get_queried_object_id();
|
|
if ( $post_id ) {
|
|
$selected = get_post_meta( $post_id, '_wp_page_template', true );
|
|
if ( 'aa-events-template-calendar.php' === $selected ) {
|
|
// Allow theme override via aa-events/template-calendar.php, then fall back to plugin file.
|
|
$resolved = events_locate_template( 'template-calendar.php' );
|
|
if ( $resolved && file_exists( $resolved ) ) {
|
|
return $resolved;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $template;
|
|
}
|
|
add_filter( 'template_include', 'events_load_plugin_page_template', 20 );
|