- Windows 本地安装 Kibana 查询 Elasticsearch
- Windows 本地安装和使用 Elasticsearch
- WooCommerce 请登录 链接不工作
- 使 WooCommerce 订单搜索支持自定义字段
- 如何使用 WooCommerce Session
- 获取 WooCommerce 页面地址的方法
- WooCommerce后台通过自定义字段检索产品
- WooCommerce 自定义订单号
- WooCommerce Login / Register Redirect
- WooCommerce自带的shortcodes
- WooCommerce 打印订单
- WooCommerce 新用户注册管理员通知
- WooCommerce 移除产品页商品图片的url
- WooCommerce Email 模版增加全局内容的一个方法
- 错误:Call to a member function is_visible() on a non-object
- WooCommerce实用代码集合
- WooCommerce根据支付方式收取额外费用(2021)
- WooCommerce 订单管理
- WooCommerce移除登出账户的确认提示
- WooCommerce列出所有产品分类(2021)
- WooCommerce收据功能的实现
- WooCommerce Dynamic Pricing动态价格表(2021)
- 如何免费试用WordPress付费插件
- 写代码定制WooCommerce产品页模板(2021)
- 自定义WooCommerce Order Details模板明细部分(2021)
- WooCommerce Class WC_Order
- WooCommerce 产品搜索支持 SKU
- WooCommerce定制产品的Additional Information选项卡(2021)
- WooCommerce 定制产品页选项卡(2021)
- WooCommerce admin bar快捷菜单
- WooCommerce库存管理插件Stock Manager for WooCommerce(2021)
- WordPress备份插件UpdraftPlus(2021)
- 隐藏WooCommerce的购物功能
- WooCommerce目录模式Catalog Mode(2021)
- 构建基于WooCommerce和WPML的多语言电商网站 - 概述篇
- 构建基于WooCommerce和WPML的多语言电商网站 - 安装WooCommerce和测试数据
- 配置WordPress运行环境 - Wampserver安装图解
- 构建基于WooCommerce和WPML的多语言电商网站 - 安装和配置 WPML 插件
- 构建基于 WooCommerce 和 WPML 的多语言电商网站 - 使 WooCommerce 和 WPML 协同工作
- WooCommerce Paypal & RMB
- WooCommerce 2.0 来袭
- 如何修改 WooCommerce 插件的模版
- WooCommerce 显示每个产品的总销量
- WooCommerce 中的 Custom JavaScript Event
- WooCommerce Authorize.net CIM Gateway
- 用WooCommerce Fees API 添加手续费
- WooCommerce 产品加入购物车后直接结账
- 设置 Paypal Sandbox 测试 WooCommerce Subscription 产品
- WooCommerce Conditional Tags 详解
- WooCommerce Single Category Selector
- WooCommerce 自定义结账字段(2021)
- WooCommerce 将产品属性加入网站菜单(2021)
- WooCommerce Product API(2021)
- WooCommerce 添加附加费 surcharge(2021)
- WooCommerce 安装中文语言包(2021)
- WooCommerce 营销:订阅促销弹窗和潜在客户发掘(2021)
- WooCommerce 邮件定制、预览和测试(2021)
- WooCommerce 在线站点付款测试(2021)
- WooCommerce Product Archive Image Slider(2021)
- woocommerce_form_field() examples
- WooCommerce 商店页插入 shortcode 问题
- WooCommerce 在 Email Header 中获取用户信息
- WooCommerce 自定义结账字段图文详解
- WooCommerce 2.1.12 - 如何修改相关产品列表
- 修改 WooCommerce My Account 页面的地址格式
- Woocommerce:如何根据国家设置支付方式
- Woocommerce 支付宝插件初探
- 支付宝集成 如何在回调地址中使用自定义参数
- Woocommerce Settings API 如何使用
- Woocommerce 中文货币符号错误如何解决
- WooCommerce 如何扩展支付方式
- Woo commerce 搭建 WordPress 电子商务网站
- WooCommerce 查看所有用户购物车(2021)
- WooCommerce 最近一个月销量排行(2021)
- WooCommerce 后台自定义产品选项(2021)
- WooCommerce 自定义产品列表带分页(2021)
- WooCommerce 设置 - 自定义选项卡和字段(2021)
- WooCommerce My Account Menu Links 定制方法(2021)
- WooCommerce 产品列表增加数量字段
- WooCommerce 可变产品变种的数量限制
WooCommerce Product Archive Image Slider(2021)
WooCommerce Product Archive Image Slider是一种在产品分类页面直接展示所有产品图片的方法,特别适合销售服装、玩具等产品的实体商店使用。今天sola为要介绍一种简单的创建产品图片幻灯片的方法,性能友好。
先来看最终效果。主题是storefront,woocommerce版本为5.7.1
WooCommerce Product Archive Image Slider的原理
将产品的gallery图片信息以JSON字符串的格式放进HTML,并用Javascript获取该信息,就可以动态替换img标签来实现幻灯片效果。这种方式支持WordPress Responsive Images,但会产生较多的html数据,sola的选择是关闭archive页面 WordPress Responsive Images 功能。
代码文件的结构
storefont-child-theme-master是storefront的child theme,位于wp-content/themes目录下。
WooCommerce Product Archive Image Slider代码
分成两部分,php代码用来获取图集数据,js代码控制图片地址切换。当然,你可以添加一些css来美化效果。
PHP部分 – class-product-archive-gallery.php
<?php
// Exit if accessed directly.
defined('WPINC') or exit;
class Sola_Product_Archive_Gallery{
public function __construct(){
add_action( 'woocommerce_before_shop_loop_item', [$this,'sola_insert_gallery_data'] );
add_action( 'wp_footer', [$this,'sola_init_script'] );
}
function sola_insert_gallery_data(){
if( ! $this->is_gallery_enabled() ){
return;
}
global $product;
if( ! $product instanceof WC_Product ){
return;
}
$gallery_ids = $product->get_gallery_image_ids();
if( !is_array($gallery_ids) || ! sizeof($gallery_ids) ){
return;
}
$gallery_images = array();
$gallery_images[] = woocommerce_get_product_thumbnail();
foreach( $gallery_ids as $attachment_id ){
$gallery_images[] = wp_get_attachment_image( $attachment_id, 'woocommerce_thumbnail', false );
}
$gallery_images =array_filter($gallery_images);
if( sizeof($gallery_images) > 1 ){
echo '<div data-loop-gallery="'.$this->json_encode($gallery_images).'"></div>';
}
}
function sola_init_script(){
if( ! $this->is_gallery_enabled() ){
return;
}
?>
<script id="product-archive-gallery">
jQuery(function($){
$.ajax({
url: '<?php echo get_stylesheet_directory_uri();?>/plugins/sola-product-archive-gallery/product-archive-gallery.js',
dataType: "script",
cache:true
});
});
</script>
<?php
}
function is_gallery_enabled(){
return is_shop() || is_product_category() || is_product_tag();
}
function json_encode( $php_array ){
return _wp_specialchars( wp_json_encode($php_array), ENT_QUOTES, 'UTF-8', true );
}
}
new Sola_Product_Archive_Gallery();
Javascript部分 – product-archive-gallery.js
;(function ( $ ) {
var SolaProductArchiveGallery = {
settings:{
'productSelector' : '.products > .product',
'prevBtn': `<button type="button" aria-label="Previous">
<svg viewBox="0 0 100 100" width="16" height="16">
<path d="M 10,50 L 60,100 L 70,90 L 30,50 L 70,10 L 60,0 Z">
</path></svg></button>`,
'nextBtn': `<button type="button" aria-label="Next">
<svg viewBox="0 0 100 100" width="16" height="16">
<path d="M 10,50 L 60,100 L 70,90 L 30,50 L 70,10 L 60,0 Z" transform="translate(100, 100) rotate(180) ">
</path></svg></button>`,
},
setupGalleries: function(){
const gallery = $(this.settings.productSelector);
const self = this;
if( gallery === null || ! gallery.length ){
return;
}
gallery.each(function(){
let product = $(this);
let galleryData = product.find('.sola-loop-gallery').data('loop-gallery');
if( ! galleryData || galleryData.length < 1 ){
return;
}
product.addClass('sola-product');
self.setupGallery(product, galleryData);
});
},
setupGallery: function( product, galleryData ){
// Create navigation buttons
let prevBtn = this.settings.prevBtn;
let nextBtn = this.settings.nextBtn;
let navBar = $('<div>' + prevBtn + nextBtn + '</div>');
let imgContainer = product.find('img').parent();
imgContainer.append(navBar);
// Bind data
navBar.data('galleryImage', galleryData);
navBar.data('nextImageIndex', 0 );
// Add Number Indicator
let indicator = $('<div>1/'+ galleryData.length +'</div>');
imgContainer.append(indicator);
},
onSlideGallery: function onSlideGallery( event ){
event.preventDefault();
let navBtn = $(this);
let navBar = navBtn.parent();
let product = navBtn.closest('.sola-product');
let galleryImages = navBar.data('galleryImage');
let lastImageIndex = galleryImages.length - 1;
let nextImageIndex = navBar.data('nextImageIndex');
let isNextBtnClicked = navBtn.hasClass('next');
let indicator = product.find('.sola-archive-gallery-indicator');
if( isNextBtnClicked ){
nextImageIndex += 1;
} else {
nextImageIndex -= 1;
}
// Infinite Loop
if( nextImageIndex > lastImageIndex ){
nextImageIndex = 0;
}
if( nextImageIndex < 0 ){
nextImageIndex = lastImageIndex;
}
navBar.parent().find('img').replaceWith(galleryImages[nextImageIndex]);
indicator.html( (nextImageIndex+1) + '/' + (lastImageIndex+1));
navBar.data('nextImageIndex', nextImageIndex);
},
init:function( userSettings ){
$.extend( this.settings, userSettings );
this.setupGalleries();
$(document).on('click', '.sola-archive-gallery-nav > *', this.onSlideGallery);
}
};
SolaProductArchiveGallery.init();
})( jQuery );
CSS部分,根据你的主题决定是否需要
ul.products li.product{
position:relative;
}
.sola-archive-gallery-btn{
position:absolute;
top:30%;
z-index:100;
background:rgba(255,255,255,.8);
}
.sola-archive-gallery-btn.previous{
left:0;
}
.sola-archive-gallery-btn.next{
right:0;
}
.sola-archive-gallery-indicator{
position:absolute;
top:0;
left:0;
color:#fff;
background:rgba(0,0,0,.9);
padding:.2rem 1rem;
letter-spacing:3px;
font-size:14px;
}
WooCommerce Product Archive Image Slider使用方法
按照sola提供的文件结构,将文件夹放到主题的根目录下,并在主题的functions.php中引入php文件。
require get_stylesheet_directory() . '/plugins/sola-product-archive-gallery/class-product-archive-gallery.php';
初始化js时,要根据自己主题的html结构确定productSelector,可以在初始化时更改这个selector。
SolaProductArchiveGallery.init({
'productSelector' : '.products > .product',
'prevBtn': `<button type="button" aria-label="Previous">
<svg viewBox="0 0 100 100" width="16" height="16">
<path d="M 10,50 L 60,100 L 70,90 L 30,50 L 70,10 L 60,0 Z">
</path></svg></button>`,
'nextBtn': `<button type="button" aria-label="Next">
<svg viewBox="0 0 100 100" width="16" height="16">
<path d="M 10,50 L 60,100 L 70,90 L 30,50 L 70,10 L 60,0 Z" transform="translate(100, 100) rotate(180) ">
</path></svg></button>`,
});
考虑到性能,sola创建的 WooCommerce Product Archive Image Slider是在document ready事件发生之后加载,不会触发render-blocking resources提醒。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论