<?php
use WprAddons\Plugin;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Featured Video metabox for WooCommerce products.
* Used by the WPR Woo Grid widget to display a hover video over the featured image.
*
* Meta keys:
* wpr_featured_video_source : 'upload' | 'url'
* wpr_featured_video_id : attachment id (when source = upload)
* wpr_featured_video_url : external/youtube/vimeo url (when source = url)
*/
add_action( 'add_meta_boxes', 'wpr_featured_video_add_metabox' );
function wpr_featured_video_add_metabox() {
if ( ! class_exists( 'WooCommerce' ) ) {
return;
}
$meta_option = get_option( 'wpr_meta_featured_video_product', 'on' );
if ( 'on' !== $meta_option ) {
return;
}
add_meta_box(
'wpr-featured-video',
__( 'Featured Video', 'wpr-addons' ),
'wpr_featured_video_metabox',
'product',
'side',
'low'
);
}
function wpr_featured_video_metabox( $post ) {
$source = get_post_meta( $post->ID, 'wpr_featured_video_source', true );
$video_id = get_post_meta( $post->ID, 'wpr_featured_video_id', true );
$video_url = get_post_meta( $post->ID, 'wpr_featured_video_url', true );
if ( empty( $source ) ) {
$source = 'upload';
}
wp_nonce_field( 'wpr_featured_video_save', 'wpr_featured_video_nonce' );
$attachment_url = $video_id ? wp_get_attachment_url( $video_id ) : '';
$has_upload = ! empty( $video_id ) && ! empty( $attachment_url );
$src_show = ['upload' => '', 'url' => ''];
$src_show[ $source ] = 'block';
$src_hide = 'upload' === $source ? 'url' : 'upload';
$src_show[ $src_hide ] = 'none';
?>
<p style="margin-top: 6px;">
<label for="wpr_featured_video_source" style="display:block;font-weight:600;margin-bottom:4px;">
<?php esc_html_e( 'Video Source', 'wpr-addons' ); ?>
</label>
<select id="wpr_featured_video_source" name="wpr_featured_video_source" style="width:100%;">
<option value="upload" <?php selected( $source, 'upload' ); ?>><?php esc_html_e( 'Self Hosted (Upload)', 'wpr-addons' ); ?></option>
<option value="url" <?php selected( $source, 'url' ); ?>><?php esc_html_e( 'External URL (YouTube / Vimeo / MP4)', 'wpr-addons' ); ?></option>
</select>
</p>
<div class="wpr-featured-video-upload-wrap" style="display:<?php echo esc_attr( $src_show['upload'] ); ?>;">
<div class="wpr-featured-video-preview" style="margin-bottom:6px;">
<?php if ( $has_upload ) : ?>
<video src="<?php echo esc_url( $attachment_url ); ?>" controls muted preload="metadata" style="width:100%;max-height:180px;background:#000;"></video>
<?php else : ?>
<div class="wpr-featured-video-placeholder" style="width:100%;height:120px;background:#f1f1f1;border:1px dashed #c3c4c7;display:flex;align-items:center;justify-content:center;color:#646970;font-size:12px;">
<?php esc_html_e( 'No video selected', 'wpr-addons' ); ?>
</div>
<?php endif; ?>
</div>
<p class="hide-if-no-js" style="margin:0;">
<a href="javascript:;"
id="wpr_featured_video_upload_button"
class="button"
data-uploader_title="<?php esc_attr_e( 'Choose a video', 'wpr-addons' ); ?>"
data-uploader_button_text="<?php esc_attr_e( 'Set featured video', 'wpr-addons' ); ?>"
style="<?php echo $has_upload ? 'display:none;' : ''; ?>">
<?php esc_html_e( 'Set featured video', 'wpr-addons' ); ?>
</a>
<a href="javascript:;"
id="wpr_featured_video_remove_button"
class="button"
style="<?php echo $has_upload ? '' : 'display:none;'; ?>">
<?php esc_html_e( 'Remove featured video', 'wpr-addons' ); ?>
</a>
</p>
<input type="hidden" id="wpr_featured_video_id" name="wpr_featured_video_id" value="<?php echo esc_attr( $video_id ); ?>" />
</div>
<div class="wpr-featured-video-url-wrap" style="display:<?php echo esc_attr( $src_show['url'] ); ?>;">
<p style="margin-top:6px;">
<label for="wpr_featured_video_url" style="display:block;font-weight:600;margin-bottom:4px;">
<?php esc_html_e( 'Video URL', 'wpr-addons' ); ?>
</label>
<input type="url"
id="wpr_featured_video_url"
name="wpr_featured_video_url"
value="<?php echo esc_attr( $video_url ); ?>"
placeholder="https://www.youtube.com/watch?v=..."
style="width:100%;" />
</p>
<p style="color:#646970;font-size:11px;margin:4px 0 0;">
<?php esc_html_e( 'Supports YouTube, Vimeo and direct MP4/WebM URLs.', 'wpr-addons' ); ?>
</p>
</div>
<?php
}
add_action( 'save_post_product', 'wpr_featured_video_save', 10, 1 );
function wpr_featured_video_save( $post_id ) {
if ( ! isset( $_POST['wpr_featured_video_nonce'] ) ) {
return;
}
if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['wpr_featured_video_nonce'] ) ), 'wpr_featured_video_save' ) ) {
return;
}
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
$source = isset( $_POST['wpr_featured_video_source'] ) ? sanitize_key( $_POST['wpr_featured_video_source'] ) : 'upload';
if ( ! in_array( $source, ['upload', 'url'], true ) ) {
$source = 'upload';
}
update_post_meta( $post_id, 'wpr_featured_video_source', $source );
$video_id = isset( $_POST['wpr_featured_video_id'] ) ? absint( $_POST['wpr_featured_video_id'] ) : 0;
update_post_meta( $post_id, 'wpr_featured_video_id', $video_id );
$video_url = isset( $_POST['wpr_featured_video_url'] ) ? esc_url_raw( wp_unslash( $_POST['wpr_featured_video_url'] ) ) : '';
update_post_meta( $post_id, 'wpr_featured_video_url', $video_url );
}
add_action( 'admin_enqueue_scripts', 'wpr_featured_video_enqueue_admin' );
function wpr_featured_video_enqueue_admin( $hook ) {
if ( ! in_array( $hook, ['post.php', 'post-new.php'], true ) ) {
return;
}
$screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
if ( $screen && 'product' !== $screen->post_type ) {
return;
}
wp_enqueue_media();
wp_enqueue_script(
'wpr-featured-video-js',
WPR_ADDONS_URL . 'assets/js/admin/metabox/featured-video.js',
['jquery'],
Plugin::instance()->get_version(),
true
);
}