更新
我已经使用javascript创建了一个弹出窗口,它运行得很好。问题是,我正在使用iframe嵌入视频代码(Facebook)在模型中。模型工作良好,按下交叉按钮弹出就会消失。但问题是,当使用时,打开弹出播放视频,然后按交叉按钮,视频继续播放。视频必须停止按交叉按钮。弹出窗口正在消失,但视频在后台播放。另一个问题是,功能视频按钮出现在所有产品上,我想应用一个条件,只有当嵌入代码是从后端添加时,才会显示按钮,请指导我如何做到这一点。
HTML代码(我在短描述后添加了这段代码-discription.php)
<a href="#jsModal" id="popup" class="jsModalTrigger">FEATURED VIDEO</a>
<div id="jsModal" class="modal">
<div class="modal__overlay jsOverlay"></div>
<div class="modal__container">
<?php
/**
* Single Product Image
*
* This template can be overridden by copying it to yourtheme/woocommerce/single-product/product-image.php.
*
* HOWEVER, on occasion WooCommerce will need to update template files and you
* (the theme developer) will need to copy the new files to your theme to
* maintain compatibility. We try to do this as little as possible, but it does
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce/Templates
* @version 3.5.1
*/
defined( 'ABSPATH' ) || exit;
// Note: `wc_get_gallery_image_html` was added in WC 3.3.2 and did not exist prior. This check protects against theme overrides being used on older versions of WC.
if ( ! function_exists( 'wc_get_gallery_image_html' ) ) {
return;
}
global $product;
$columns = apply_filters( 'woocommerce_product_thumbnails_columns', 4 );
$post_thumbnail_id = $product->get_image_id();
$wrapper_classes = apply_filters( 'woocommerce_single_product_image_gallery_classes', array(
'woocommerce-product-gallery',
'woocommerce-product-gallery--' . ( $product->get_image_id() ? 'with-images' : 'without-images' ),
'woocommerce-product-gallery--columns-' . absint( $columns ),
'images',
) );
//for video, need to modify the wrapper classes, as they disable click events
$video_wrapper_classes = apply_filters( 'woocommerce_single_product_image_gallery_classes', array(
'woocommerce-product-gallery--' . ( $product->get_image_id() ? 'with-images' : 'without-images' ),
'woocommerce-product-gallery--columns-' . absint( $columns ),
'images',
) );
$product_video = get_post_meta(get_the_ID(), 'product_video_field', true );
$product_sub_image = get_the_post_thumbnail($post, [120]);
?>
<div class="<?php echo esc_attr( implode( ' ', array_map( 'sanitize_html_class', $video_wrapper_classes ) ) ); ?>" data-columns="<?php echo esc_attr( $columns ); ?>">
<figure class="woocommerce-product-gallery__wrapper">
<?php //if the product video field is not empty, output the video on the page.
if ( !empty($product_video)) { ?>
<div id="product-video-container">
<?php echo $product_video; ?>
</div>
<!--this is optional, display the featured image below the video, IF there is a video -->
<?php } else {
//if no video, output featured image as per default template
if ( $product->get_image_id() ) {
$html = wc_get_gallery_image_html( $post_thumbnail_id, true );
} else {
$html = '<div class="woocommerce-product-gallery__image--placeholder">';
$html .= sprintf( '<img src="%s" alt="%s" class="wp-post-image" />', esc_url( wc_placeholder_img_src( 'woocommerce_single' ) ), esc_html__( 'Awaiting product image', 'woocommerce' ) );
$html .= '</div>';
}
}
?>
</figure>
</div>
<button class="modal__close jsModalClose">✕</button>
</div>
</div>JAVASCRIPT代码
/* This script supports IE9+ */
(function() {
/* Opening modal window function */
function openModal() {
/* Get trigger element */
var modalTrigger = document.getElementsByClassName('jsModalTrigger');
/* Set onclick event handler for all trigger elements */
for(var i = 0; i < modalTrigger.length; i++) {
modalTrigger[i].onclick = function() {
var target = this.getAttribute('href').substr(1);
var modalWindow = document.getElementById(target);
modalWindow.classList ? modalWindow.classList.add('open') : modalWindow.className += ' ' + 'open';
}
}
}
function closeModal(){
/* Get close button */
var closeButton = document.getElementsByClassName('jsModalClose');
var closeOverlay = document.getElementsByClassName('jsOverlay');
/* Set onclick event handler for close buttons */
for(var i = 0; i < closeButton.length; i++) {
closeButton[i].onclick = function() {
var modalWindow = this.parentNode.parentNode;
modalWindow.classList ? modalWindow.classList.remove('open') : modalWindow.className = modalWindow.className.replace(new RegExp('(^|\\b)' + 'open'.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
}
}
/* Set onclick event handler for modal overlay */
for(var i = 0; i < closeOverlay.length; i++) {
closeOverlay[i].onclick = function() {
var modalWindow = this.parentNode;
modalWindow.classList ? modalWindow.classList.remove('open') : modalWindow.className = modalWindow.className.replace(new RegExp('(^|\\b)' + 'open'.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
}
}
}
/* Handling domready event IE9+ */
function ready(fn) {
if (document.readyState != 'loading'){
fn();
} else {
document.addEventListener('DOMContentLoaded', fn);
}
}
/* Triggering modal window function after dom ready */
ready(openModal);
ready(closeModal);
}());function.php代码:
add_action( 'woocommerce_product_options_general_product_data', 'product_video_field' );
function product_video_field() {
$args = array(
'id' => 'product_video_field',
'label' => sanitize_text_field( 'Product Video' ),
'placeholder' => 'Cut and paste video embed code here',
'desc_tip' => true,
'style' => 'height:120px'
);
echo woocommerce_wp_textarea_input( $args );
}
add_action( 'woocommerce_process_product_meta', 'product_video_field_save' );
add_action( 'woocommerce_process_product_meta', 'product_video_field_save' );
function product_video_field_save($post_id) {
$product_video_field = $_POST['product_video_field'];
update_post_meta($post_id, 'product_video_field', $product_video_field);
}


发布于 2020-07-07 20:46:42
如果没有第三方提供的API (在您的例子中是Facebook ),就无法通过不同域上的iframe进行编程通信。因此,在打开和关闭调制解调器时,更容易创建和销毁iframe。
从HTML中删除iframe。将iframe的src移动到一个模态元素,并将值存储在一个数据属性中。这使您可以在创建iframe时随时使用属性的值。
<a href="#jsModal" id="popup" class="jsModalTrigger">Trigger</a>
<div id="jsModal" class="modal" data-src="https://www.facebook.com/plugins/video.php?href=https%3A%2F%2Fwww.facebook.com%2FEasternfabricsstore%2Fvideos%2F691828284946045%2F&show_text=0&width=560">
<div class="modal__overlay jsOverlay"></div>
<div class="modal__container">
<button class="modal__close jsModalClose">✕</button>
</div>
</div>在JavaScript中创建一个函数,该函数使用当前在HTML中拥有的src和属性构造iframe元素。无论何时打开模式,都必须调用此函数。因此,应该在onclick函数的openModal事件处理程序中调用它。将iframe附加到modal__container元素并打开模型。
closeModal函数也是如此,您应该从HTML中删除iframe元素,以阻止视频在后台播放,这将解决您的问题。
结合创建的iframe,您现在可以启动和停止您的iframe视频打开和关闭模式。
/* This script supports IE9+ */
(function() {
function createIframe(src) {
if (typeof src !== 'string') {
throw Error('src argument has to be a valid string');
}
var iframe = document.createElement('iframe');
iframe.src = src;
iframe.width = 560;
iframe.height = 308;
iframe.setAttribute('scrolling', 'no');
iframe.setAttribute('frameBorder', 0);
iframe.setAttribute('allowTransparency', 'true');
iframe.setAttribute('allowFullscreen', 'true');
iframe.style.border = 'none';
iframe.style.overflow = 'hidden';
return iframe;
}
/* Opening modal window function */
function openModal() {
/* Get trigger element */
var modalTrigger = document.getElementsByClassName('jsModalTrigger');
/* Set onclick event handler for all trigger elements */
for(var i = 0; i < modalTrigger.length; i++) {
modalTrigger[i].onclick = function() {
var target = this.getAttribute('href').substr(1);
var modalWindow = document.getElementById(target);
var source = modalWindow.getAttribute('data-src');
var iframe = createIframe(source);
var modalContainer = this.lastElementChild;
modalContainer.appendChild(iframe);
modalWindow.classList ? modalWindow.classList.add('open') : modalWindow.className += ' ' + 'open';
}
}
}
function closeModal(){
/* Get close button */
var closeButton = document.getElementsByClassName('jsModalClose');
var closeOverlay = document.getElementsByClassName('jsOverlay');
/* Set onclick event handler for close buttons */
for(var i = 0; i < closeButton.length; i++) {
closeButton[i].onclick = function() {
var modalContainer = this.parentNode;
var modalWindow = modalContainer.parentNode;
modalContainer.removeChild(modalContainer.firstElementChild);
modalWindow.classList ? modalWindow.classList.remove('open') : modalWindow.className = modalWindow.className.replace(new RegExp('(^|\\b)' + 'open'.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
}
}
/* Set onclick event handler for modal overlay */
for(var i = 0; i < closeOverlay.length; i++) {
closeOverlay[i].onclick = function() {
var modalWindow = this.parentNode;
modalWindow.classList ? modalWindow.classList.remove('open') : modalWindow.className = modalWindow.className.replace(new RegExp('(^|\\b)' + 'open'.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
}
}
}
/* Handling domready event IE9+ */
function ready(fn) {
if (document.readyState != 'loading'){
fn();
} else {
document.addEventListener('DOMContentLoaded', fn);
}
}
/* Triggering modal window function after dom ready */
ready(openModal);
ready(closeModal);
}());现在,您的WooCommerce视频字段已经很好了,但是最好是将iframe的src作为值,而不是一个完整的<iframe>标记。这是因为我们将在前面建造iframe。
add_action( 'woocommerce_product_options_general_product_data', 'product_video_field' );
function product_video_field() {
$args = array(
'id' => 'product_video_field',
'label' => sanitize_text_field( 'Product Video' ),
'placeholder' => 'Place embed src value of video here',
'desc_tip' => true,
'style' => 'height: 120px'
);
echo woocommerce_wp_textarea_input( $args );
}
add_action( 'woocommerce_process_product_meta', 'product_video_field_save' );
function product_video_field_save( $post_id ) {
$product_video_field = $_POST[ 'product_video_field' ];
update_post_meta( $post_id, 'product_video_field', $product_video_field );
}您的单个Product模板也非常接近。这里唯一需要修改的是模态的结构和来自WooCommerce的视频输出。下面的代码将将视频的src输出到data-src属性上,在创建iframe时,JavaScript将读取该属性。
/**
* Single Product Image
*
* This template can be overridden by copying it to yourtheme/woocommerce/single-product/product-image.php.
*
* HOWEVER, on occasion WooCommerce will need to update template files and you
* (the theme developer) will need to copy the new files to your theme to
* maintain compatibility. We try to do this as little as possible, but it does
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce/Templates
* @version 3.5.1
*/
defined( 'ABSPATH' ) || exit;
// Note: `wc_get_gallery_image_html` was added in WC 3.3.2 and did not exist prior. This check protects against theme overrides being used on older versions of WC.
if ( ! function_exists( 'wc_get_gallery_image_html' ) ) {
return;
}
global $product;
$columns = apply_filters( 'woocommerce_product_thumbnails_columns', 4 );
$post_thumbnail_id = $product->get_image_id();
$wrapper_classes = apply_filters( 'woocommerce_single_product_image_gallery_classes', array(
'woocommerce-product-gallery',
'woocommerce-product-gallery--' . ( $product->get_image_id() ? 'with-images' : 'without-images' ),
'woocommerce-product-gallery--columns-' . absint( $columns ),
'images',
) );
//for video, need to modify the wrapper classes, as they disable click events
$video_wrapper_classes = apply_filters( 'woocommerce_single_product_image_gallery_classes', array(
'woocommerce-product-gallery--' . ( $product->get_image_id() ? 'with-images' : 'without-images' ),
'woocommerce-product-gallery--columns-' . absint( $columns ),
'images',
) );
$product_video = get_post_meta(get_the_ID(), 'product_video_field', true );
$product_sub_image = get_the_post_thumbnail($post, [120]);
?>
<div class="<?php echo esc_attr( implode( ' ', array_map( 'sanitize_html_class', $video_wrapper_classes ) ) ); ?>" data-columns="<?php echo esc_attr( $columns ); ?>">
<figure class="woocommerce-product-gallery__wrapper">
<?php //if the product video field is not empty, output the video on the page.
if ( !empty($product_video)) { ?>
<a href="#jsModal" id="popup" class="jsModalTrigger">FEATURED VIDEO</a>
<div id="jsModal" class="modal" data-src="<?php echo $product_video; ?>">
<div class="modal__overlay jsOverlay"></div>
<div class="modal__container">
<button class="modal__close jsModalClose">✕</button>
</div>
</div>
<!--this is optional, display the featured image below the video, IF there is a video -->
<?php } else {
//if no video, output featured image as per default template
if ( $product->get_image_id() ) {
$html = wc_get_gallery_image_html( $post_thumbnail_id, true );
} else {
$html = '<div class="woocommerce-product-gallery__image--placeholder">';
$html .= sprintf( '<img src="%s" alt="%s" class="wp-post-image" />', esc_url( wc_placeholder_img_src( 'woocommerce_single' ) ), esc_html__( 'Awaiting product image', 'woocommerce' ) );
$html .= '</div>';
}
}
?>
</figure>
</div>我希望它能成功。如果是的话请告诉我。
https://stackoverflow.com/questions/62778904
复制相似问题