Front_End
Class Front_End
Source
File: includes/libs/front-end.class.php
class Front_End{
/**
* @var Plugin
*/
private $plugin;
/**
* The content embed filter priority
*
* @var int
*/
private $embed_filter_priority = 999;
/**
* Store a list of video post ID's to skip automatic embedding for.
* Used for video posts that have the block editor video position block
* or for posts that use the video position shortcode.
*
* @var array
*/
private $skip_autoembed = [];
/**
* Front_End constructor.
* @ignore
*
* @param Plugin $plugin
*/
public function __construct( Plugin $plugin ) {
$this->plugin = $plugin;
add_action( 'init', [ $this, 'init' ], 9999 );
}
/**
* Init action callback.
* Will set all filters and actions needed by the plugin to do embeds and perform front-end
* tasks. Used for internal purposes, should not be called manually.
*/
public function init(){
$this->embed_filter_priority = intval(
/**
* Automatic video embedding in post content filter priority.
*
* @param int $priority The "the_content" filter priority used to automatically embed the video into the post content.
*/
apply_filters(
'vimeotheque\embed_filter_priority',
$this->embed_filter_priority
)
);
// filter content to embed video
add_filter( 'the_content', [
$this,
'embed_video'
], $this->embed_filter_priority, 1 );
// add player script
add_action( 'wp_print_scripts', [
$this,
'add_player_script'
] );
add_action( 'post_thumbnail_html', [
$this,
'filter_thumbnail_html'
], 10, 2 );
/**
* Template function the_term() works by default only for post_tag taxonomy.
* This filter will add the plugin taxonomy for plugin custom post type
*/
// add this filter only in front-end
if( ! is_admin() ){
add_filter( 'get_the_terms', [
$this,
'filter_video_terms'
], 10, 3 );
}
}
/**
* Post content filter callback to embed the video into the post content.
* The method is called on the "post_content" filter and embeds the attached video above
* or below the post content, depending on the setting from the plugin Settings or the individual post options.
*
* @param string $content The post content
* @return string The post content
*/
public function embed_video( $content ){
if( ! Helper::video_is_visible() ){
return $content;
}
global $post;
$_post = get_post( $post );
if( !$_post ){
return $content;
}
// check if post is password protected
if( post_password_required( $_post ) ){
return $content;
}
// check if filters prevent auto embedding
if( !Helper::is_autoembed_allowed() ){
return $content;
}
// if video is in skipped auto embed list (has block or the video position shortcode in content), don't embed
if( $this->skipped_autoembed( $_post ) ){
return $content;
}
$video_post = Helper::get_video_post( $_post );
$settings = $video_post->get_embed_options();
if( !in_array( $settings['video_position'], [ 'above-content', 'below-content' ] ) ){
return $content;
}
$video_container = Helper::embed_video( $_post, [], false );
// put the filter back for other posts; remove in method 'prevent_autoembeds'
add_filter( 'the_content', [
$GLOBALS[ 'wp_embed' ],
'autoembed'
], 8 );
/**
* Fires before the video embed is placed into the post content.
* Action that runs when the video is set to be automatically inserted into the post content.
*
* @param Video_Post $video_post The \Vimeotheque\Video_Post object generated for the current post in loop.
*/
do_action(
'vimeotheque\automatic_embed_in_content',
$video_post
);
if( 'below-content' === $settings[ 'video_position' ] ){
return $content . $video_container;
}else{
return $video_container . $content;
}
}
/**
* Post featured image filter callback.
* Filter for the WP featured image to replace it with the video embed if option is enabled from the plugin Settings.
*
* @param $html
* @param $post_id
*
* @return mixed|void
*/
public function filter_thumbnail_html( $html, $post_id ){
if( ! Helper::video_is_visible() ){
return $html;
}
$video = Helper::get_video_post( $post_id );
if( !$video->is_video() ){
return $html;
}
$options = $video->get_embed_options();
if( 'replace-featured-image' !== $options['video_position'] ){
return $html;
}
$video_container = Helper::embed_video( $video, [], false );
/**
* Filter the embed code when option to replace featured image is on.
* Filter is triggered when the option to embed videos in place of the featured image is activated.
*
* @param string $video_container The HTML element that will contrin the video embed.
* @param Video_Post $video The \Vimeotheque\Video_Post post object.
* @param string $thumbnail_html The featured image HTML code.
*/
return apply_filters(
'vimeotheque_enhanced_embed\embed_code',
$video_container,
$video,
$html
);
}
/**
* Check if post should be skipped from autoembedding.
*
* @ignore
*
* @param \WP_Post $post
*
* @return bool
*/
private function skipped_autoembed( \WP_Post $post ){
return in_array( $post->ID, $this->skip_autoembed );
}
/**
* Embed player script on video pages.
*
* @ignore Internal functionality
*
* @return void
*/
public function add_player_script(){
if( ! Helper::video_is_visible() ){
return;
}
Helper::enqueue_player();
}
/**
* Filter the tags for the custom post type implemented by this plugin.
* Useful in template pages using function the_tags() - this function works
* only for the default post_tag taxonomy; the filter adds functionality
* for plugin post type tag taxonomy
*
* @ignore Internal functionality
*
* @param array $terms - the terms found
* @param int $post_id - the id of the post
* @param string $taxonomy - the taxonomy searched for
* @return
*
*/
public function filter_video_terms( $terms, $post_id, $taxonomy ){
// get the current post
$post = get_post( $post_id );
if( ! $post ){
return $terms;
}
// check only for the custom post type of the plugin
if( $this->plugin->get_cpt()->get_post_type() == $post->post_type ){
// the_tags() will check only for taxonomy post_tag. Check if this is what it's looking for and replace if true
if( $taxonomy != $this->plugin->get_cpt()->get_tag_tax() && 'post_tag' == $taxonomy ){
return get_the_terms( $post_id, $this->plugin->get_cpt()->get_tag_tax() );
}
}
return $terms;
}
/**
* Return the filter priority for the automaticembed in post content
*
* @return int
*/
public function get_embed_filter_priority(){
return $this->embed_filter_priority;
}
/**
* Remove filter set on post content to embed the video;
* prevents automatic video embed above or below content when called.
*
* @ignore Internal functionality
*
* @param int|false $post_id The post ID registered to skip the auto embedding for
*/
public function prevent_post_autoembed( $post_id = false ){
if( !$post_id ){
/**
* @var \WP_Post
*/
global $post;
$post_id = $post->ID;
}
$this->skip_autoembed[ $post_id ] = $post_id;
}
}
Methods
- embed_video — Post content filter callback to embed the video into the post content.
- filter_thumbnail_html — Post featured image filter callback.
- get_embed_filter_priority — Return the filter priority for the automaticembed in post content
- init — Init action callback.
