Plugin Directory

Changeset 3413656


Ignore:
Timestamp:
12/07/2025 06:20:07 PM (4 months ago)
Author:
ivole
Message:

5.92.0

Location:
customer-reviews-woocommerce
Files:
875 added
1 deleted
18 edited

Legend:

Unmodified
Added
Removed
  • customer-reviews-woocommerce/trunk/blocks/build/reviews-grid/block.json

    r3382233 r3413656  
    5858            "default": false
    5959        },
     60        "schema_markup": {
     61            "type": "boolean",
     62            "default": false
     63        },
    6064        "sort_by": {
    6165            "type": "string",
  • customer-reviews-woocommerce/trunk/blocks/build/reviews-grid/index.asset.php

    r3382233 r3413656  
    1 <?php return array('dependencies' => array('lodash', 'react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-element', 'wp-escape-html', 'wp-html-entities', 'wp-i18n', 'wp-primitives', 'wp-server-side-render', 'wp-url'), 'version' => '2dbdc0cd0e1b29bda378');
     1<?php return array('dependencies' => array('lodash', 'react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-element', 'wp-escape-html', 'wp-html-entities', 'wp-i18n', 'wp-primitives', 'wp-server-side-render', 'wp-url'), 'version' => '498567e1f8023a032e96');
  • customer-reviews-woocommerce/trunk/blocks/build/reviews-grid/index.js

    r3382233 r3413656  
    1 (()=>{var e,t={836:(e,t,r)=>{"use strict";const o=window.wp.element,n=window.wp.i18n,s=window.wp.blocks,a=JSON.parse('{"name":"cusrev/reviews-grid","description":"Display a grid with product and store reviews using a masonry layout."}'),c=window.wp.components,l=window.wp.serverSideRender;var i=r.n(l);const u=window.wp.compose;function m(){return m=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},m.apply(this,arguments)}var d=r(556),p=r.n(d);const g=window.wp.url,h=window.wp.apiFetch;var _=r.n(h);const w=window.lodash,b=({selected:e=[],search:t="",queryArgs:r={}})=>{const o=(({selected:e=[],search:t="",queryArgs:r={}})=>{const o={per_page:0,catalog_visibility:"any",search:t,orderby:"title",order:"asc"};return[(0,g.addQueryArgs)("/wc/store/v1/products",{...o,...r})]})({selected:e,search:t,queryArgs:r});return Promise.all(o.map((e=>_()({path:e})))).then((e=>(0,w.uniqBy)((0,w.flatten)(e),"id").map((e=>({...e,parent:0}))))).catch((e=>{throw e}))},v=({selected:e=[],search:t})=>{const r=(({selected:e=[],search:t})=>[(0,g.addQueryArgs)("wc/store/v1/products/tags",{per_page:0,orderby:"name",order:"asc",search:t})])({selected:e,search:t});return Promise.all(r.map((e=>_()({path:e})))).then((e=>(0,w.uniqBy)((0,w.flatten)(e),"id")))},f=({selected:e=[],search:t})=>{const r=(({selected:e=[],search:t})=>[(0,g.addQueryArgs)("wp/v2/cr_tag",{orderby:"name",order:"asc",search:t})])({selected:e,search:t});return Promise.all(r.map((e=>_()({path:e})))).then((e=>(0,w.uniqBy)((0,w.flatten)(e),"id")))},C=async e=>{if("function"==typeof e.json)try{const t=await e.json();return{message:t.message,type:t.type||"api"}}catch(e){return{message:e.message,type:"general"}}return{message:e.message,type:e.type||"general"}},y=(0,u.createHigherOrderComponent)((e=>class extends o.Component{constructor(){super(...arguments),this.state={error:null,loading:!1,categories:[]},this.loadCategories=this.loadCategories.bind(this)}componentDidMount(){this.loadCategories()}loadCategories(){this.setState({loading:!0}),_()({path:(0,g.addQueryArgs)("wc/store/v1/products/categories",{per_page:0})}).then((e=>{this.setState({categories:e,loading:!1,error:null})})).catch((async e=>{const t=await C(e);this.setState({categories:[],loading:!1,error:t})}))}render(){const{error:t,loading:r,categories:n}=this.state;return(0,o.createElement)(e,m({},this.props,{error:t,isLoading:r,categories:n}))}}),"withCategories");var E=r(485),S=r.n(E),k=r(31);function x(e,t=e){const r=(0,w.groupBy)(e,"parent"),o=(0,w.keyBy)(t,"id"),n=(e={})=>e.parent?[...n(o[e.parent]),e.name]:e.name?[e.name]:[],s=e=>e.map((e=>{const t=r[e.id];return delete r[e.id],{...e,breadcrumbs:n(o[e.parent]),children:t&&t.length?s(t):[]}})),a=s(r[0]||[]);return delete r[0],(0,w.forEach)(r,(e=>{a.push(...s(e||[]))})),a}const N=({countLabel:e,className:t,depth:r=0,controlId:n="",item:s,isSelected:a,isSingle:c,onSelect:l,search:i="",...u})=>{const d=!(0,w.isNil)(e)||!(0,w.isNil)(s.count),p=[t,"cr-search-list__item"];p.push(`depth-${r}`),c&&p.push("is-radio-button"),d&&p.push("has-count");const g=s.breadcrumbs&&s.breadcrumbs.length,h=u.name||`search-list-item-${n}`,_=`${h}-${s.id}`;return(0,o.createElement)("label",{htmlFor:_,className:p.join(" ")},c?(0,o.createElement)("input",m({type:"radio",id:_,name:h,value:s.value,onChange:l(s),checked:a,className:"cr-search-list__item-input"},u)):(0,o.createElement)("input",m({type:"checkbox",id:_,name:h,value:s.value,onChange:l(s),checked:a,className:"cr-search-list__item-input"},u)),(0,o.createElement)("span",{className:"cr-search-list__item-label"},g?(0,o.createElement)("span",{className:"cr-search-list__item-prefix"},1===(b=s.breadcrumbs).length?(0,w.first)(b):2===b.length?(0,w.first)(b)+" › "+(0,w.last)(b):(0,w.first)(b)+" … "+(0,w.last)(b)):null,(0,o.createElement)("span",{className:"cr-search-list__item-name"},function(e,t){if(!t)return e;const r=new RegExp((0,w.escapeRegExp)(t),"ig");return e.split(r).map(((e,r)=>0===r?e:(0,o.createElement)(o.Fragment,{key:r},(0,o.createElement)("strong",null,t),e)))}(s.name,i))),!!d&&(0,o.createElement)("span",{className:"cr-search-list__item-count"},e||s.count));var b};N.propTypes={className:p().string,countLabel:p().node,controlId:p().node,depth:p().number,item:p().object,name:p().string,isSelected:p().bool,isSingle:p().bool,onSelect:p().func,search:p().string};const O=N,R=function(e){let{icon:t,size:r=24,...n}=e;return(0,o.cloneElement)(t,{width:r,height:r,...n})},B=window.wp.primitives,I=(0,o.createElement)(B.SVG,{viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg"},(0,o.createElement)(B.Path,{d:"M12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21ZM15.5303 8.46967C15.8232 8.76256 15.8232 9.23744 15.5303 9.53033L13.0607 12L15.5303 14.4697C15.8232 14.7626 15.8232 15.2374 15.5303 15.5303C15.2374 15.8232 14.7626 15.8232 14.4697 15.5303L12 13.0607L9.53033 15.5303C9.23744 15.8232 8.76256 15.8232 8.46967 15.5303C8.17678 15.2374 8.17678 14.7626 8.46967 14.4697L10.9393 12L8.46967 9.53033C8.17678 9.23744 8.17678 8.76256 8.46967 8.46967C8.76256 8.17678 9.23744 8.17678 9.53033 8.46967L12 10.9393L14.4697 8.46967C14.7626 8.17678 15.2374 8.17678 15.5303 8.46967Z"})),P=window.wp.htmlEntities,A=({id:e,instanceId:t,label:r,popoverContents:s,remove:a,screenReaderLabel:l,className:i})=>{const[u,m]=(0,o.useState)(!1);if(l=l||r,!r)return null;r=(0,P.decodeEntities)(r);const d=S()("cr-tag-a",i,{"has-remove":!!a}),p=`cr-tag__label-${t}`,g=(0,o.createElement)(o.Fragment,null,(0,o.createElement)("span",{className:"screen-reader-text"},l),(0,o.createElement)("span",{"aria-hidden":"true"},r));return(0,o.createElement)("span",{className:d},s?(0,o.createElement)(c.Button,{className:"cr-tag__text",id:p,onClick:()=>m(!0)},g):(0,o.createElement)("span",{className:"cr-tag__text",id:p},g),s&&u&&(0,o.createElement)(c.Popover,{onClose:()=>m(!1)},s),a&&(0,o.createElement)(c.Button,{className:"cr-tag__remove",onClick:a(e),label:(0,n.sprintf)((0,n.__)("Remove %s","customer-reviews-woocommerce"),r),"aria-describedby":p},(0,o.createElement)(R,{icon:I,size:20,className:"clear-icon"})))};A.propTypes={id:p().oneOfType([p().number,p().string]),label:p().string.isRequired,popoverContents:p().node,remove:p().func,screenReaderLabel:p().string};const T=(0,u.withInstanceId)(A),M={clear:(0,n.__)("Clear all selected items","customer-reviews-woocommerce"),noItems:(0,n.__)("No items found.","customer-reviews-woocommerce"),noResults:(0,n.__)("No results for %s","customer-reviews-woocommerce"),search:(0,n.__)("Search for items","customer-reviews-woocommerce"),selected:e=>(0,n.sprintf)(/* translators: Number of items selected from list. */ /* translators: Number of items selected from list. */
    2 (0,n._n)("%d item selected","%d items selected",e,"customer-reviews-woocommerce"),e),updated:(0,n.__)("Search results updated.","customer-reviews-woocommerce")},L=e=>{const[t,r]=(0,o.useState)(e.search||""),{isSingle:s,isLoading:a,onChange:l,selected:i,instanceId:u,messages:m,isCompact:d,debouncedSpeak:p,onSearch:g,className:h=""}=e,_={...M,...m};(0,o.useEffect)((()=>{"function"==typeof g&&g(t)}),[g,t]);const b=e=>()=>{s&&l([]);const t=(0,w.findIndex)(i,{id:e});l([...i.slice(0,t),...i.slice(t+1)])},v=e=>()=>{f(e)?b(e.id)():l(s?[e]:[...i,e])},f=e=>-1!==(0,w.findIndex)(i,{id:e.id}),C=e=>(0,o.createElement)(O,e),y=(r,n=0)=>{const a=e.renderItem||C;return r?r.map((e=>(0,o.createElement)(o.Fragment,{key:e.id},(0,o.createElement)("li",null,a({item:e,isSelected:f(e),onSelect:v,isSingle:s,search:t,depth:n,controlId:u})),y(e.children,n+1)))):null};return(0,o.createElement)("div",{className:S()("cr-search-list",h,{"is-compact":d})},(()=>{if(a||s||!i)return null;const e=i.length;return(0,o.createElement)("div",{className:"cr-search-list__selected"},(0,o.createElement)("div",{className:"cr-search-list__selected-header"},(0,o.createElement)("strong",null,_.selected(e)),e>0?(0,o.createElement)(c.Button,{isLink:!0,isDestructive:!0,onClick:()=>{l([])},"aria-label":_.clear},(0,n.__)("Clear all","customer-reviews-woocommerce")):null),e>0?(0,o.createElement)("ul",null,i.map(((e,t)=>(0,o.createElement)("li",{key:t},(0,o.createElement)(T,{label:e.name,id:e.id,remove:b}))))):null)})(),(0,o.createElement)("div",{className:"cr-search-list__search"},(0,o.createElement)(c.TextControl,{label:_.search,type:"search",value:t,onChange:e=>r(e)})),(()=>{if(a)return(0,o.createElement)("div",{className:"cr-search-list__list is-loading"},(0,o.createElement)(c.Spinner,null));const r=((t,r)=>{const{isHierarchical:o}=e;if(!r)return o?x(t):t;const n=new RegExp((0,w.escapeRegExp)(r),"i");p(_.updated);const s=t.map((e=>!!n.test(e.name)&&e)).filter(Boolean);return o?x(s,t):s})(e.list,t);return r.length?(0,o.createElement)("ul",{className:"cr-search-list__list"},y(r)):(0,o.createElement)("div",{className:"cr-search-list__list is-not-found"},(0,o.createElement)("span",{className:"cr-search-list__not-found-icon"},(0,o.createElement)(k.A,{role:"img","aria-hidden":"true",focusable:"false"})),(0,o.createElement)("span",{className:"cr-search-list__not-found-text"},t?(0,n.sprintf)(_.noResults,t):_.noItems))})())};L.propTypes={className:p().string,isCompact:p().bool,isHierarchical:p().bool,isLoading:p().bool,isSingle:p().bool,list:p().arrayOf(p().shape({id:p().number,name:p().string})),messages:p().shape({clear:p().string,noItems:p().string,noResults:p().string,search:p().string,selected:p().func,updated:p().string}),onChange:p().func.isRequired,onSearch:p().func,renderItem:p().func,selected:p().array.isRequired,debouncedSpeak:p().func,instanceId:p().number};const $=(0,u.compose)([c.withSpokenMessages,u.withInstanceId])(L),D=({categories:e,error:t,isLoading:r,onChange:s,onOperatorChange:a,operator:l,selected:i,isCompact:u,isSingle:d,showReviewCount:p})=>{const g={clear:(0,n.__)("Clear all product categories","woo-gutenberg-products-block"),list:(0,n.__)("Product Categories","woo-gutenberg-products-block"),noItems:(0,n.__)("Your store doesn't have any product categories.","woo-gutenberg-products-block"),search:(0,n.__)("Search for product categories","woo-gutenberg-products-block"),selected:e=>(0,n.sprintf)(/* translators: %d is the count of selected categories. */ /* translators: %d is the count of selected categories. */
     1(()=>{var e,t={836:(e,t,r)=>{"use strict";const o=window.wp.element,n=window.wp.i18n,s=window.wp.blocks,a=JSON.parse('{"name":"cusrev/reviews-grid","description":"Display a grid with product and store reviews using a masonry layout."}'),c=window.wp.components,l=window.wp.serverSideRender;var i=r.n(l);const u=window.wp.compose;function m(){return m=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},m.apply(this,arguments)}var d=r(556),p=r.n(d);const g=window.wp.url,h=window.wp.apiFetch;var _=r.n(h);const w=window.lodash,b=({selected:e=[],search:t="",queryArgs:r={}})=>{const o=(({selected:e=[],search:t="",queryArgs:r={}})=>{const o={per_page:0,catalog_visibility:"any",search:t,orderby:"title",order:"asc"};return[(0,g.addQueryArgs)("/wc/store/v1/products",{...o,...r})]})({selected:e,search:t,queryArgs:r});return Promise.all(o.map((e=>_()({path:e})))).then((e=>(0,w.uniqBy)((0,w.flatten)(e),"id").map((e=>({...e,parent:0}))))).catch((e=>{throw e}))},v=({selected:e=[],search:t})=>{const r=(({selected:e=[],search:t})=>[(0,g.addQueryArgs)("wc/store/v1/products/tags",{per_page:0,orderby:"name",order:"asc",search:t})])({selected:e,search:t});return Promise.all(r.map((e=>_()({path:e})))).then((e=>(0,w.uniqBy)((0,w.flatten)(e),"id")))},f=({selected:e=[],search:t})=>{const r=(({selected:e=[],search:t})=>[(0,g.addQueryArgs)("wp/v2/cr_tag",{orderby:"name",order:"asc",search:t})])({selected:e,search:t});return Promise.all(r.map((e=>_()({path:e})))).then((e=>(0,w.uniqBy)((0,w.flatten)(e),"id")))},C=async e=>{if("function"==typeof e.json)try{const t=await e.json();return{message:t.message,type:t.type||"api"}}catch(e){return{message:e.message,type:"general"}}return{message:e.message,type:e.type||"general"}},y=(0,u.createHigherOrderComponent)((e=>class extends o.Component{constructor(){super(...arguments),this.state={error:null,loading:!1,categories:[]},this.loadCategories=this.loadCategories.bind(this)}componentDidMount(){this.loadCategories()}loadCategories(){this.setState({loading:!0}),_()({path:(0,g.addQueryArgs)("wc/store/v1/products/categories",{per_page:0})}).then((e=>{this.setState({categories:e,loading:!1,error:null})})).catch((async e=>{const t=await C(e);this.setState({categories:[],loading:!1,error:t})}))}render(){const{error:t,loading:r,categories:n}=this.state;return(0,o.createElement)(e,m({},this.props,{error:t,isLoading:r,categories:n}))}}),"withCategories");var E=r(485),S=r.n(E),k=r(31);function x(e,t=e){const r=(0,w.groupBy)(e,"parent"),o=(0,w.keyBy)(t,"id"),n=(e={})=>e.parent?[...n(o[e.parent]),e.name]:e.name?[e.name]:[],s=e=>e.map((e=>{const t=r[e.id];return delete r[e.id],{...e,breadcrumbs:n(o[e.parent]),children:t&&t.length?s(t):[]}})),a=s(r[0]||[]);return delete r[0],(0,w.forEach)(r,(e=>{a.push(...s(e||[]))})),a}const N=({countLabel:e,className:t,depth:r=0,controlId:n="",item:s,isSelected:a,isSingle:c,onSelect:l,search:i="",...u})=>{const d=!(0,w.isNil)(e)||!(0,w.isNil)(s.count),p=[t,"cr-search-list__item"];p.push(`depth-${r}`),c&&p.push("is-radio-button"),d&&p.push("has-count");const g=s.breadcrumbs&&s.breadcrumbs.length,h=u.name||`search-list-item-${n}`,_=`${h}-${s.id}`;return(0,o.createElement)("label",{htmlFor:_,className:p.join(" ")},c?(0,o.createElement)("input",m({type:"radio",id:_,name:h,value:s.value,onChange:l(s),checked:a,className:"cr-search-list__item-input"},u)):(0,o.createElement)("input",m({type:"checkbox",id:_,name:h,value:s.value,onChange:l(s),checked:a,className:"cr-search-list__item-input"},u)),(0,o.createElement)("span",{className:"cr-search-list__item-label"},g?(0,o.createElement)("span",{className:"cr-search-list__item-prefix"},1===(b=s.breadcrumbs).length?(0,w.first)(b):2===b.length?(0,w.first)(b)+" › "+(0,w.last)(b):(0,w.first)(b)+" … "+(0,w.last)(b)):null,(0,o.createElement)("span",{className:"cr-search-list__item-name"},function(e,t){if(!t)return e;const r=new RegExp((0,w.escapeRegExp)(t),"ig");return e.split(r).map(((e,r)=>0===r?e:(0,o.createElement)(o.Fragment,{key:r},(0,o.createElement)("strong",null,t),e)))}(s.name,i))),!!d&&(0,o.createElement)("span",{className:"cr-search-list__item-count"},e||s.count));var b};N.propTypes={className:p().string,countLabel:p().node,controlId:p().node,depth:p().number,item:p().object,name:p().string,isSelected:p().bool,isSingle:p().bool,onSelect:p().func,search:p().string};const O=N,R=function(e){let{icon:t,size:r=24,...n}=e;return(0,o.cloneElement)(t,{width:r,height:r,...n})},B=window.wp.primitives,I=(0,o.createElement)(B.SVG,{viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg"},(0,o.createElement)(B.Path,{d:"M12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21ZM15.5303 8.46967C15.8232 8.76256 15.8232 9.23744 15.5303 9.53033L13.0607 12L15.5303 14.4697C15.8232 14.7626 15.8232 15.2374 15.5303 15.5303C15.2374 15.8232 14.7626 15.8232 14.4697 15.5303L12 13.0607L9.53033 15.5303C9.23744 15.8232 8.76256 15.8232 8.46967 15.5303C8.17678 15.2374 8.17678 14.7626 8.46967 14.4697L10.9393 12L8.46967 9.53033C8.17678 9.23744 8.17678 8.76256 8.46967 8.46967C8.76256 8.17678 9.23744 8.17678 9.53033 8.46967L12 10.9393L14.4697 8.46967C14.7626 8.17678 15.2374 8.17678 15.5303 8.46967Z"})),P=window.wp.htmlEntities,T=({id:e,instanceId:t,label:r,popoverContents:s,remove:a,screenReaderLabel:l,className:i})=>{const[u,m]=(0,o.useState)(!1);if(l=l||r,!r)return null;r=(0,P.decodeEntities)(r);const d=S()("cr-tag-a",i,{"has-remove":!!a}),p=`cr-tag__label-${t}`,g=(0,o.createElement)(o.Fragment,null,(0,o.createElement)("span",{className:"screen-reader-text"},l),(0,o.createElement)("span",{"aria-hidden":"true"},r));return(0,o.createElement)("span",{className:d},s?(0,o.createElement)(c.Button,{className:"cr-tag__text",id:p,onClick:()=>m(!0)},g):(0,o.createElement)("span",{className:"cr-tag__text",id:p},g),s&&u&&(0,o.createElement)(c.Popover,{onClose:()=>m(!1)},s),a&&(0,o.createElement)(c.Button,{className:"cr-tag__remove",onClick:a(e),label:(0,n.sprintf)((0,n.__)("Remove %s","customer-reviews-woocommerce"),r),"aria-describedby":p},(0,o.createElement)(R,{icon:I,size:20,className:"clear-icon"})))};T.propTypes={id:p().oneOfType([p().number,p().string]),label:p().string.isRequired,popoverContents:p().node,remove:p().func,screenReaderLabel:p().string};const A=(0,u.withInstanceId)(T),M={clear:(0,n.__)("Clear all selected items","customer-reviews-woocommerce"),noItems:(0,n.__)("No items found.","customer-reviews-woocommerce"),noResults:(0,n.__)("No results for %s","customer-reviews-woocommerce"),search:(0,n.__)("Search for items","customer-reviews-woocommerce"),selected:e=>(0,n.sprintf)(/* translators: Number of items selected from list. */ /* translators: Number of items selected from list. */
     2(0,n._n)("%d item selected","%d items selected",e,"customer-reviews-woocommerce"),e),updated:(0,n.__)("Search results updated.","customer-reviews-woocommerce")},L=e=>{const[t,r]=(0,o.useState)(e.search||""),{isSingle:s,isLoading:a,onChange:l,selected:i,instanceId:u,messages:m,isCompact:d,debouncedSpeak:p,onSearch:g,className:h=""}=e,_={...M,...m};(0,o.useEffect)((()=>{"function"==typeof g&&g(t)}),[g,t]);const b=e=>()=>{s&&l([]);const t=(0,w.findIndex)(i,{id:e});l([...i.slice(0,t),...i.slice(t+1)])},v=e=>()=>{f(e)?b(e.id)():l(s?[e]:[...i,e])},f=e=>-1!==(0,w.findIndex)(i,{id:e.id}),C=e=>(0,o.createElement)(O,e),y=(r,n=0)=>{const a=e.renderItem||C;return r?r.map((e=>(0,o.createElement)(o.Fragment,{key:e.id},(0,o.createElement)("li",null,a({item:e,isSelected:f(e),onSelect:v,isSingle:s,search:t,depth:n,controlId:u})),y(e.children,n+1)))):null};return(0,o.createElement)("div",{className:S()("cr-search-list",h,{"is-compact":d})},(()=>{if(a||s||!i)return null;const e=i.length;return(0,o.createElement)("div",{className:"cr-search-list__selected"},(0,o.createElement)("div",{className:"cr-search-list__selected-header"},(0,o.createElement)("strong",null,_.selected(e)),e>0?(0,o.createElement)(c.Button,{isLink:!0,isDestructive:!0,onClick:()=>{l([])},"aria-label":_.clear},(0,n.__)("Clear all","customer-reviews-woocommerce")):null),e>0?(0,o.createElement)("ul",null,i.map(((e,t)=>(0,o.createElement)("li",{key:t},(0,o.createElement)(A,{label:e.name,id:e.id,remove:b}))))):null)})(),(0,o.createElement)("div",{className:"cr-search-list__search"},(0,o.createElement)(c.TextControl,{label:_.search,type:"search",value:t,onChange:e=>r(e)})),(()=>{if(a)return(0,o.createElement)("div",{className:"cr-search-list__list is-loading"},(0,o.createElement)(c.Spinner,null));const r=((t,r)=>{const{isHierarchical:o}=e;if(!r)return o?x(t):t;const n=new RegExp((0,w.escapeRegExp)(r),"i");p(_.updated);const s=t.map((e=>!!n.test(e.name)&&e)).filter(Boolean);return o?x(s,t):s})(e.list,t);return r.length?(0,o.createElement)("ul",{className:"cr-search-list__list"},y(r)):(0,o.createElement)("div",{className:"cr-search-list__list is-not-found"},(0,o.createElement)("span",{className:"cr-search-list__not-found-icon"},(0,o.createElement)(k.A,{role:"img","aria-hidden":"true",focusable:"false"})),(0,o.createElement)("span",{className:"cr-search-list__not-found-text"},t?(0,n.sprintf)(_.noResults,t):_.noItems))})())};L.propTypes={className:p().string,isCompact:p().bool,isHierarchical:p().bool,isLoading:p().bool,isSingle:p().bool,list:p().arrayOf(p().shape({id:p().number,name:p().string})),messages:p().shape({clear:p().string,noItems:p().string,noResults:p().string,search:p().string,selected:p().func,updated:p().string}),onChange:p().func.isRequired,onSearch:p().func,renderItem:p().func,selected:p().array.isRequired,debouncedSpeak:p().func,instanceId:p().number};const $=(0,u.compose)([c.withSpokenMessages,u.withInstanceId])(L),D=({categories:e,error:t,isLoading:r,onChange:s,onOperatorChange:a,operator:l,selected:i,isCompact:u,isSingle:d,showReviewCount:p})=>{const g={clear:(0,n.__)("Clear all product categories","woo-gutenberg-products-block"),list:(0,n.__)("Product Categories","woo-gutenberg-products-block"),noItems:(0,n.__)("Your store doesn't have any product categories.","woo-gutenberg-products-block"),search:(0,n.__)("Search for product categories","woo-gutenberg-products-block"),selected:e=>(0,n.sprintf)(/* translators: %d is the count of selected categories. */ /* translators: %d is the count of selected categories. */
    33(0,n._n)("%d category selected","%d categories selected",e,"woo-gutenberg-products-block"),e),updated:(0,n.__)("Category search results updated.","woo-gutenberg-products-block")};return t?(0,o.createElement)("div",{className:"wc-block-error-message"},t):(0,o.createElement)(o.Fragment,null,(0,o.createElement)($,{className:"woocommerce-product-categories2",list:e,isLoading:r,selected:i.map((t=>e.find((e=>e.id===t)))).filter(Boolean),onChange:s,renderItem:e=>{const{item:t,search:r,depth:s=0}=e,a=t.breadcrumbs.length?`${t.breadcrumbs.join(", ")}, ${t.name}`:t.name,c=p?(0,n.sprintf)(/* translators: %1$s is the item name, %2$d is the count of reviews for the item. */ /* translators: %1$s is the item name, %2$d is the count of reviews for the item. */
    44(0,n._n)("%1$s, has %2$d review","%1$s, has %2$d reviews",t.review_count,"woo-gutenberg-products-block"),a,t.review_count):(0,n.sprintf)(/* translators: %1$s is the item name, %2$d is the count of products for the item. */ /* translators: %1$s is the item name, %2$d is the count of products for the item. */
     
    1010(0,n._n)("%d tag selected","%d tags selected",e,"woo-gutenberg-products-block"),e),updated:(0,n.__)("Tag search results updated.","woo-gutenberg-products-block")};return(0,o.createElement)(o.Fragment,null,(0,o.createElement)($,{className:"woocommerce-product-tags",list:e,isLoading:t,selected:i.map((t=>e.find((e=>e.id===t)))).filter(Boolean),onChange:s,onSearch:this.debouncedOnSearch,renderItem:this.renderItem,messages:u,isCompact:r,isHierarchical:!0}),!!a&&(0,o.createElement)("div",{hidden:i.length<2},(0,o.createElement)(c.SelectControl,{className:"woocommerce-product-tags__operator",label:(0,n.__)("Display products matching","woo-gutenberg-products-block"),help:(0,n.__)("Pick at least two tags to use this setting.","woo-gutenberg-products-block"),value:l,onChange:a,options:[{label:(0,n.__)("Any selected tags","woo-gutenberg-products-block"),value:"any"},{label:(0,n.__)("All selected tags","woo-gutenberg-products-block"),value:"all"}]})))}}Y.propTypes={onChange:p().func.isRequired,onOperatorChange:p().func,operator:p().oneOf(["all","any"]),selected:p().array.isRequired,isCompact:p().bool},Y.defaultProps={isCompact:!1,operator:"any"};const G=Y;class Q extends o.Component{constructor(){super(...arguments),this.state={list:[],loading:!0},this.renderItem=this.renderItem.bind(this),this.debouncedOnSearch=(0,w.debounce)(this.onSearch.bind(this),400)}componentDidMount(){const{selected:e}=this.props;f({selected:e}).then((e=>{this.setState({list:e,loading:!1})})).catch((()=>{this.setState({list:[],loading:!1})}))}onSearch(e){const{selected:t}=this.props;this.setState({loading:!0}),f({selected:t,search:e}).then((e=>{this.setState({list:e,loading:!1})})).catch((()=>{this.setState({list:[],loading:!1})}))}renderItem(e){const{item:t,search:r,depth:s=0}=e,a=t.breadcrumbs.length?`${t.breadcrumbs.join(", ")}, ${t.name}`:t.name;return(0,o.createElement)(O,m({className:S()("woocommerce-product-tags__item","has-count",{"is-searching":r.length>0,"is-skip-level":0===s&&0!==t.parent})},e,{"aria-label":(0,n.sprintf)(/* translators: %1$d is the count of products, %2$s is the name of the tag. */ /* translators: %1$d is the count of products, %2$s is the name of the tag. */
    1111(0,n._n)("%1$d product tagged as %2$s","%1$d products tagged as %2$s",t.count,"woo-gutenberg-products-block"),t.count,a)}))}render(){const{list:e,loading:t}=this.state,{isCompact:r,onChange:s,onOperatorChange:a,operator:l,selected:i}=this.props,u={clear:(0,n.__)("Clear all tags","customer-reviews-woocommerce"),list:(0,n.__)("Tags","customer-reviews-woocommerce"),noItems:(0,n.__)("Your reviews don't have any tags","customer-reviews-woocommerce"),search:(0,n.__)("Search for tags","customer-reviews-woocommerce"),selected:e=>(0,n.sprintf)(/* translators: %d is the count of selected tags. */ /* translators: %d is the count of selected tags. */
    12 (0,n._n)("%d tag selected","%d tags selected",e,"customer-reviews-woocommerce"),e),updated:(0,n.__)("Tag search results updated.","customer-reviews-woocommerce")};return(0,o.createElement)(o.Fragment,null,(0,o.createElement)($,{className:"woocommerce-product-tags",list:e,isLoading:t,selected:i.map((t=>e.find((e=>e.id===t)))).filter(Boolean),onChange:s,onSearch:this.debouncedOnSearch,renderItem:this.renderItem,messages:u,isCompact:r,isHierarchical:!0}),!!a&&(0,o.createElement)("div",{hidden:i.length<2},(0,o.createElement)(c.SelectControl,{className:"woocommerce-product-tags__operator",label:(0,n.__)("Display reviews matching","customer-reviews-woocommerce"),help:(0,n.__)("Pick at least two tags to use this setting.","customer-reviews-woocommerce"),value:l,onChange:a,options:[{label:(0,n.__)("Any selected tags","customer-reviews-woocommerce"),value:"any"},{label:(0,n.__)("All selected tags","customer-reviews-woocommerce"),value:"all"}]})))}}Q.propTypes={onChange:p().func.isRequired,onOperatorChange:p().func,operator:p().oneOf(["all","any"]),selected:p().array.isRequired,isCompact:p().bool},Q.defaultProps={isCompact:!1,operator:"any"};const V=Q,Z=e=>(0,o.createElement)(c.BaseControl,{id:e.instanceId||Math.random(),label:e.label||""},(0,o.createElement)(c.ColorPicker,{color:e.color,label:e.label,disableAlpha:e.disableAlpha,onChangeComplete:e.onChange})),J=window.wp.blockEditor,{name:K}=a;function X({attributes:e,setAttributes:t}){const r=(0,u.useRefEffect)((e=>{let t=setInterval((function(){if(e.getElementsByClassName("cr-reviews-grid-inner cr-colcade-loaded").length)clearInterval(t);else{let t=e.getElementsByClassName("cr-reviews-grid-inner");t.length&&"function"==typeof crResizeAllGridItemsUtil&&crResizeAllGridItemsUtil(t)}}),3e3);return()=>clearInterval(t)}),[e]);return(0,o.createElement)("div",(0,J.useBlockProps)({ref:r}),(0,o.createElement)(J.InspectorControls,{key:"setting"},(0,o.createElement)(c.PanelBody,{title:(0,n.__)("Review Grid Settings","customer-reviews-woocommerce"),initialOpen:!0},(0,o.createElement)(c.RangeControl,{label:(0,n.__)("Number of Reviews","customer-reviews-woocommerce"),value:e.count,min:1,max:6,onChange:e=>t({count:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.RangeControl,{label:(0,n.__)("Number of Shop Reviews","customer-reviews-woocommerce"),value:e.count_shop_reviews,min:0,max:3,onChange:e=>t({count_shop_reviews:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.RangeControl,{label:(0,n.__)("Show More","customer-reviews-woocommerce"),value:e.show_more,min:0,max:10,onChange:e=>t({show_more:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.RangeControl,{label:(0,n.__)("Maximum Number of Characters to Display (0 = Unlimited)","customer-reviews-woocommerce"),value:e.max_chars,min:0,max:9999,onChange:e=>t({max_chars:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.RangeControl,{label:(0,n.__)("Minimum Number of Characters in a Review (0 = Display All Reviews)","customer-reviews-woocommerce"),value:e.min_chars,min:0,max:9999,onChange:e=>t({min_chars:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.ToggleControl,{label:(0,n.__)("Show Products","customer-reviews-woocommerce"),checked:e.show_products,onChange:()=>t({show_products:!e.show_products}),__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.ToggleControl,{label:(0,n.__)("Product Links","customer-reviews-woocommerce"),checked:e.product_links,onChange:()=>t({product_links:!e.product_links}),__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.ToggleControl,{label:(0,n.__)("Shop Reviews","customer-reviews-woocommerce"),checked:e.shop_reviews,onChange:()=>t({shop_reviews:!e.shop_reviews}),__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.ToggleControl,{label:(0,n.__)("Inactive Products","customer-reviews-woocommerce"),checked:e.inactive_products,onChange:()=>t({inactive_products:!e.inactive_products}),__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.ToggleControl,{label:(0,n.__)("Show Rating Bars","customer-reviews-woocommerce"),checked:e.show_summary_bar,onChange:()=>t({show_summary_bar:!e.show_summary_bar}),__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.ToggleControl,{label:(0,n.__)("Add Review","customer-reviews-woocommerce"),checked:e.add_review,onChange:()=>t({add_review:!e.add_review}),__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.SelectControl,{label:(0,n.__)("Avatars","customer-reviews-woocommerce"),value:e.avatars,options:[{label:(0,n.__)("Initials","customer-reviews-woocommerce"),value:"initials"},{label:(0,n.__)("Standard","customer-reviews-woocommerce"),value:"standard"},{label:(0,n.__)("No avatars","customer-reviews-woocommerce"),value:"false"}],onChange:e=>t({avatars:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.SelectControl,{label:(0,n.__)("Sort By","customer-reviews-woocommerce"),value:e.sort_by,options:[{label:(0,n.__)("Date","customer-reviews-woocommerce"),value:"date"},{label:(0,n.__)("Rating","customer-reviews-woocommerce"),value:"rating"},{label:(0,n.__)("Media","customer-reviews-woocommerce"),value:"media"}],onChange:e=>t({sort_by:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.SelectControl,{label:(0,n.__)("Sort Order","customer-reviews-woocommerce"),value:e.sort,options:[{label:(0,n.__)("Ascending","customer-reviews-woocommerce"),value:"ASC"},{label:(0,n.__)("Descending","customer-reviews-woocommerce"),value:"DESC"},{label:(0,n.__)("Random","customer-reviews-woocommerce"),value:"RAND"}],onChange:e=>t({sort:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0})),(0,o.createElement)(c.PanelBody,{title:(0,n.__)("Product Categories","customer-reviews-woocommerce"),initialOpen:!1},(0,o.createElement)("div",null,(0,n.__)("Select which product categories to show reviews for.","customer-reviews-woocommerce")),(0,o.createElement)(j,{selected:e.categories,onChange:(e=[])=>{const r=e.map((({id:e})=>e));t({categories:r})},isCompact:!0})),(0,o.createElement)(c.PanelBody,{title:(0,n.__)("Products","customer-reviews-woocommerce"),initialOpen:!1},(0,o.createElement)("div",null,(0,n.__)("Select which products to show reviews for.","customer-reviews-woocommerce")),(0,o.createElement)(U,{selected:e.products,onChange:(e=[])=>{const r=e.map((({id:e})=>e));t({products:r})}})),(0,o.createElement)(c.PanelBody,{title:(0,n.__)("Product Tags","customer-reviews-woocommerce"),initialOpen:!1},(0,o.createElement)("div",null,(0,n.__)("Select which product tags to show reviews for.","customer-reviews-woocommerce")),(0,o.createElement)(G,{selected:e.product_tags,onChange:(e=[])=>{const r=e.map((({id:e})=>e));t({product_tags:r})}})),(0,o.createElement)(c.PanelBody,{title:(0,n.__)("Tags","customer-reviews-woocommerce"),initialOpen:!1},(0,o.createElement)("div",null,(0,n.__)("Select which tags to show reviews for.","customer-reviews-woocommerce")),(0,o.createElement)(V,{selected:e.tag_ids,onChange:(e=[])=>{const r=e.map((({id:e})=>e));t({tag_ids:r})}})),(0,o.createElement)(c.PanelBody,{title:(0,n.__)("Colors","customer-reviews-woocommerce"),initialOpen:!1},(0,o.createElement)(Z,{color:e.color_ex_brdr,label:(0,n.__)("External Border","customer-reviews-woocommerce"),disableAlpha:!0,onChange:e=>{t({color_ex_brdr:e.hex})}}),(0,o.createElement)(Z,{color:e.color_brdr,label:(0,n.__)("Review Card Border","customer-reviews-woocommerce"),disableAlpha:!0,onChange:e=>{t({color_brdr:e.hex})}}),(0,o.createElement)(Z,{color:e.color_ex_bcrd,label:(0,n.__)("Background","customer-reviews-woocommerce"),disableAlpha:!0,onChange:e=>{t({color_ex_bcrd:e.hex})}}),(0,o.createElement)(Z,{color:e.color_bcrd,label:(0,n.__)("Review Card Background","customer-reviews-woocommerce"),disableAlpha:!0,onChange:e=>{t({color_bcrd:e.hex})}}),(0,o.createElement)(Z,{color:e.color_pr_bcrd,label:(0,n.__)("Product Area Background","customer-reviews-woocommerce"),disableAlpha:!0,onChange:e=>{t({color_pr_bcrd:e.hex})}}),(0,o.createElement)(Z,{color:e.color_stars,label:(0,n.__)("Stars","customer-reviews-woocommerce"),disableAlpha:!0,onChange:e=>{t({color_stars:e.hex})}}))),(0,o.createElement)(c.Disabled,null,(0,o.createElement)(i(),{block:K,attributes:e})))}const{name:ee,description:te}=a;(0,s.registerBlockType)(ee,{description:(0,n.__)(te,"customer-reviews-woocommerce"),edit:e=>(0,o.createElement)(X,e),save:()=>null})},485:(e,t)=>{var r;!function(){"use strict";var o={}.hasOwnProperty;function n(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var s=typeof r;if("string"===s||"number"===s)e.push(r);else if(Array.isArray(r)){if(r.length){var a=n.apply(null,r);a&&e.push(a)}}else if("object"===s)if(r.toString===Object.prototype.toString)for(var c in r)o.call(r,c)&&r[c]&&e.push(c);else e.push(r.toString())}}return e.join(" ")}e.exports?(n.default=n,e.exports=n):void 0===(r=function(){return n}.apply(t,[]))||(e.exports=r)}()},31:(e,t,r)=>{"use strict";t.A=function(e){var t=e.size,r=void 0===t?24:t,o=e.onClick,c=(e.icon,e.className),l=function(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},s=Object.keys(e);for(o=0;o<s.length;o++)r=s[o],0<=t.indexOf(r)||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(o=0;o<s.length;o++)r=s[o],0<=t.indexOf(r)||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}(e,s),i=["gridicon","gridicons-notice-outline",c,!!function(e){return 0==e%18}(r)&&"needs-offset",!1,!1].filter(Boolean).join(" ");return n.default.createElement("svg",a({className:i,height:r,width:r,onClick:o},l,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"}),n.default.createElement("g",null,n.default.createElement("path",{d:"M12 4c4.411 0 8 3.589 8 8s-3.589 8-8 8-8-3.589-8-8 3.589-8 8-8m0-2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2zm1 13h-2v2h2v-2zm-2-2h2l.5-6h-3l.5 6z"})))};var o,n=(o=r(609))&&o.__esModule?o:{default:o},s=["size","onClick","icon","className"];function a(){return a=Object.assign||function(e){for(var t,r=1;r<arguments.length;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},a.apply(this,arguments)}},694:(e,t,r)=>{"use strict";var o=r(925);function n(){}function s(){}s.resetWarningCache=n,e.exports=function(){function e(e,t,r,n,s,a){if(a!==o){var c=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw c.name="Invariant Violation",c}}function t(){return e}e.isRequired=e;var r={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:s,resetWarningCache:n};return r.PropTypes=r,r}},556:(e,t,r)=>{e.exports=r(694)()},925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},609:e=>{"use strict";e.exports=window.React}},r={};function o(e){var n=r[e];if(void 0!==n)return n.exports;var s=r[e]={exports:{}};return t[e](s,s.exports,o),s.exports}o.m=t,e=[],o.O=(t,r,n,s)=>{if(!r){var a=1/0;for(u=0;u<e.length;u++){for(var[r,n,s]=e[u],c=!0,l=0;l<r.length;l++)(!1&s||a>=s)&&Object.keys(o.O).every((e=>o.O[e](r[l])))?r.splice(l--,1):(c=!1,s<a&&(a=s));if(c){e.splice(u--,1);var i=n();void 0!==i&&(t=i)}}return t}s=s||0;for(var u=e.length;u>0&&e[u-1][2]>s;u--)e[u]=e[u-1];e[u]=[r,n,s]},o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var r in t)o.o(t,r)&&!o.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={342:0,434:0};o.O.j=t=>0===e[t];var t=(t,r)=>{var n,s,[a,c,l]=r,i=0;if(a.some((t=>0!==e[t]))){for(n in c)o.o(c,n)&&(o.m[n]=c[n]);if(l)var u=l(o)}for(t&&t(r);i<a.length;i++)s=a[i],o.o(e,s)&&e[s]&&e[s][0](),e[s]=0;return o.O(u)},r=globalThis.webpackChunkcustomer_reviews_woocommerce=globalThis.webpackChunkcustomer_reviews_woocommerce||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})();var n=o.O(void 0,[434],(()=>o(836)));n=o.O(n)})();
     12(0,n._n)("%d tag selected","%d tags selected",e,"customer-reviews-woocommerce"),e),updated:(0,n.__)("Tag search results updated.","customer-reviews-woocommerce")};return(0,o.createElement)(o.Fragment,null,(0,o.createElement)($,{className:"woocommerce-product-tags",list:e,isLoading:t,selected:i.map((t=>e.find((e=>e.id===t)))).filter(Boolean),onChange:s,onSearch:this.debouncedOnSearch,renderItem:this.renderItem,messages:u,isCompact:r,isHierarchical:!0}),!!a&&(0,o.createElement)("div",{hidden:i.length<2},(0,o.createElement)(c.SelectControl,{className:"woocommerce-product-tags__operator",label:(0,n.__)("Display reviews matching","customer-reviews-woocommerce"),help:(0,n.__)("Pick at least two tags to use this setting.","customer-reviews-woocommerce"),value:l,onChange:a,options:[{label:(0,n.__)("Any selected tags","customer-reviews-woocommerce"),value:"any"},{label:(0,n.__)("All selected tags","customer-reviews-woocommerce"),value:"all"}]})))}}Q.propTypes={onChange:p().func.isRequired,onOperatorChange:p().func,operator:p().oneOf(["all","any"]),selected:p().array.isRequired,isCompact:p().bool},Q.defaultProps={isCompact:!1,operator:"any"};const V=Q,Z=e=>(0,o.createElement)(c.BaseControl,{id:e.instanceId||Math.random(),label:e.label||""},(0,o.createElement)(c.ColorPicker,{color:e.color,label:e.label,disableAlpha:e.disableAlpha,onChangeComplete:e.onChange})),J=window.wp.blockEditor,{name:K}=a;function X({attributes:e,setAttributes:t}){const r=(0,u.useRefEffect)((e=>{let t=setInterval((function(){if(e.getElementsByClassName("cr-reviews-grid-inner cr-colcade-loaded").length)clearInterval(t);else{let t=e.getElementsByClassName("cr-reviews-grid-inner");t.length&&"function"==typeof crResizeAllGridItemsUtil&&crResizeAllGridItemsUtil(t)}}),3e3);return()=>clearInterval(t)}),[e]);return(0,o.createElement)("div",(0,J.useBlockProps)({ref:r}),(0,o.createElement)(J.InspectorControls,{key:"setting"},(0,o.createElement)(c.PanelBody,{title:(0,n.__)("Review Grid Settings","customer-reviews-woocommerce"),initialOpen:!0},(0,o.createElement)(c.RangeControl,{label:(0,n.__)("Number of Reviews","customer-reviews-woocommerce"),value:e.count,min:0,max:100,onChange:e=>t({count:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.RangeControl,{label:(0,n.__)("Number of Shop Reviews","customer-reviews-woocommerce"),value:e.count_shop_reviews,min:0,max:100,onChange:e=>t({count_shop_reviews:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.RangeControl,{label:(0,n.__)("Show More","customer-reviews-woocommerce"),value:e.show_more,min:0,max:10,onChange:e=>t({show_more:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.RangeControl,{label:(0,n.__)("Maximum Number of Characters to Display (0 = Unlimited)","customer-reviews-woocommerce"),value:e.max_chars,min:0,max:9999,onChange:e=>t({max_chars:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.RangeControl,{label:(0,n.__)("Minimum Number of Characters in a Review (0 = Display All Reviews)","customer-reviews-woocommerce"),value:e.min_chars,min:0,max:9999,onChange:e=>t({min_chars:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.ToggleControl,{label:(0,n.__)("Show Products","customer-reviews-woocommerce"),checked:e.show_products,onChange:()=>t({show_products:!e.show_products}),__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.ToggleControl,{label:(0,n.__)("Product Links","customer-reviews-woocommerce"),checked:e.product_links,onChange:()=>t({product_links:!e.product_links}),__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.ToggleControl,{label:(0,n.__)("Shop Reviews","customer-reviews-woocommerce"),checked:e.shop_reviews,onChange:()=>t({shop_reviews:!e.shop_reviews}),__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.ToggleControl,{label:(0,n.__)("Inactive Products","customer-reviews-woocommerce"),checked:e.inactive_products,onChange:()=>t({inactive_products:!e.inactive_products}),__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.ToggleControl,{label:(0,n.__)("Show Rating Bars","customer-reviews-woocommerce"),checked:e.show_summary_bar,onChange:()=>t({show_summary_bar:!e.show_summary_bar}),__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.ToggleControl,{label:(0,n.__)("Add Review","customer-reviews-woocommerce"),checked:e.add_review,onChange:()=>t({add_review:!e.add_review}),__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.ToggleControl,{label:(0,n.__)("Schema Markup","customer-reviews-woocommerce"),checked:e.schema_markup,onChange:()=>t({schema_markup:!e.schema_markup}),__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.SelectControl,{label:(0,n.__)("Avatars","customer-reviews-woocommerce"),value:e.avatars,options:[{label:(0,n.__)("Initials","customer-reviews-woocommerce"),value:"initials"},{label:(0,n.__)("Standard","customer-reviews-woocommerce"),value:"standard"},{label:(0,n.__)("No avatars","customer-reviews-woocommerce"),value:"false"}],onChange:e=>t({avatars:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.SelectControl,{label:(0,n.__)("Sort By","customer-reviews-woocommerce"),value:e.sort_by,options:[{label:(0,n.__)("Date","customer-reviews-woocommerce"),value:"date"},{label:(0,n.__)("Rating","customer-reviews-woocommerce"),value:"rating"},{label:(0,n.__)("Media","customer-reviews-woocommerce"),value:"media"}],onChange:e=>t({sort_by:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0}),(0,o.createElement)(c.SelectControl,{label:(0,n.__)("Sort Order","customer-reviews-woocommerce"),value:e.sort,options:[{label:(0,n.__)("Ascending","customer-reviews-woocommerce"),value:"ASC"},{label:(0,n.__)("Descending","customer-reviews-woocommerce"),value:"DESC"},{label:(0,n.__)("Random","customer-reviews-woocommerce"),value:"RAND"}],onChange:e=>t({sort:e}),__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0})),(0,o.createElement)(c.PanelBody,{title:(0,n.__)("Product Categories","customer-reviews-woocommerce"),initialOpen:!1},(0,o.createElement)("div",null,(0,n.__)("Select which product categories to show reviews for.","customer-reviews-woocommerce")),(0,o.createElement)(j,{selected:e.categories,onChange:(e=[])=>{const r=e.map((({id:e})=>e));t({categories:r})},isCompact:!0})),(0,o.createElement)(c.PanelBody,{title:(0,n.__)("Products","customer-reviews-woocommerce"),initialOpen:!1},(0,o.createElement)("div",null,(0,n.__)("Select which products to show reviews for.","customer-reviews-woocommerce")),(0,o.createElement)(U,{selected:e.products,onChange:(e=[])=>{const r=e.map((({id:e})=>e));t({products:r})}})),(0,o.createElement)(c.PanelBody,{title:(0,n.__)("Product Tags","customer-reviews-woocommerce"),initialOpen:!1},(0,o.createElement)("div",null,(0,n.__)("Select which product tags to show reviews for.","customer-reviews-woocommerce")),(0,o.createElement)(G,{selected:e.product_tags,onChange:(e=[])=>{const r=e.map((({id:e})=>e));t({product_tags:r})}})),(0,o.createElement)(c.PanelBody,{title:(0,n.__)("Tags","customer-reviews-woocommerce"),initialOpen:!1},(0,o.createElement)("div",null,(0,n.__)("Select which tags to show reviews for.","customer-reviews-woocommerce")),(0,o.createElement)(V,{selected:e.tag_ids,onChange:(e=[])=>{const r=e.map((({id:e})=>e));t({tag_ids:r})}})),(0,o.createElement)(c.PanelBody,{title:(0,n.__)("Colors","customer-reviews-woocommerce"),initialOpen:!1},(0,o.createElement)(Z,{color:e.color_ex_brdr,label:(0,n.__)("External Border","customer-reviews-woocommerce"),disableAlpha:!0,onChange:e=>{t({color_ex_brdr:e.hex})}}),(0,o.createElement)(Z,{color:e.color_brdr,label:(0,n.__)("Review Card Border","customer-reviews-woocommerce"),disableAlpha:!0,onChange:e=>{t({color_brdr:e.hex})}}),(0,o.createElement)(Z,{color:e.color_ex_bcrd,label:(0,n.__)("Background","customer-reviews-woocommerce"),disableAlpha:!0,onChange:e=>{t({color_ex_bcrd:e.hex})}}),(0,o.createElement)(Z,{color:e.color_bcrd,label:(0,n.__)("Review Card Background","customer-reviews-woocommerce"),disableAlpha:!0,onChange:e=>{t({color_bcrd:e.hex})}}),(0,o.createElement)(Z,{color:e.color_pr_bcrd,label:(0,n.__)("Product Area Background","customer-reviews-woocommerce"),disableAlpha:!0,onChange:e=>{t({color_pr_bcrd:e.hex})}}),(0,o.createElement)(Z,{color:e.color_stars,label:(0,n.__)("Stars","customer-reviews-woocommerce"),disableAlpha:!0,onChange:e=>{t({color_stars:e.hex})}}))),(0,o.createElement)(c.Disabled,null,(0,o.createElement)(i(),{block:K,attributes:e})))}const{name:ee,description:te}=a;(0,s.registerBlockType)(ee,{description:(0,n.__)(te,"customer-reviews-woocommerce"),edit:e=>(0,o.createElement)(X,e),save:()=>null})},485:(e,t)=>{var r;!function(){"use strict";var o={}.hasOwnProperty;function n(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var s=typeof r;if("string"===s||"number"===s)e.push(r);else if(Array.isArray(r)){if(r.length){var a=n.apply(null,r);a&&e.push(a)}}else if("object"===s)if(r.toString===Object.prototype.toString)for(var c in r)o.call(r,c)&&r[c]&&e.push(c);else e.push(r.toString())}}return e.join(" ")}e.exports?(n.default=n,e.exports=n):void 0===(r=function(){return n}.apply(t,[]))||(e.exports=r)}()},31:(e,t,r)=>{"use strict";t.A=function(e){var t=e.size,r=void 0===t?24:t,o=e.onClick,c=(e.icon,e.className),l=function(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},s=Object.keys(e);for(o=0;o<s.length;o++)r=s[o],0<=t.indexOf(r)||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(o=0;o<s.length;o++)r=s[o],0<=t.indexOf(r)||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}(e,s),i=["gridicon","gridicons-notice-outline",c,!!function(e){return 0==e%18}(r)&&"needs-offset",!1,!1].filter(Boolean).join(" ");return n.default.createElement("svg",a({className:i,height:r,width:r,onClick:o},l,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"}),n.default.createElement("g",null,n.default.createElement("path",{d:"M12 4c4.411 0 8 3.589 8 8s-3.589 8-8 8-8-3.589-8-8 3.589-8 8-8m0-2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2zm1 13h-2v2h2v-2zm-2-2h2l.5-6h-3l.5 6z"})))};var o,n=(o=r(609))&&o.__esModule?o:{default:o},s=["size","onClick","icon","className"];function a(){return a=Object.assign||function(e){for(var t,r=1;r<arguments.length;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},a.apply(this,arguments)}},694:(e,t,r)=>{"use strict";var o=r(925);function n(){}function s(){}s.resetWarningCache=n,e.exports=function(){function e(e,t,r,n,s,a){if(a!==o){var c=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw c.name="Invariant Violation",c}}function t(){return e}e.isRequired=e;var r={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:s,resetWarningCache:n};return r.PropTypes=r,r}},556:(e,t,r)=>{e.exports=r(694)()},925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},609:e=>{"use strict";e.exports=window.React}},r={};function o(e){var n=r[e];if(void 0!==n)return n.exports;var s=r[e]={exports:{}};return t[e](s,s.exports,o),s.exports}o.m=t,e=[],o.O=(t,r,n,s)=>{if(!r){var a=1/0;for(u=0;u<e.length;u++){for(var[r,n,s]=e[u],c=!0,l=0;l<r.length;l++)(!1&s||a>=s)&&Object.keys(o.O).every((e=>o.O[e](r[l])))?r.splice(l--,1):(c=!1,s<a&&(a=s));if(c){e.splice(u--,1);var i=n();void 0!==i&&(t=i)}}return t}s=s||0;for(var u=e.length;u>0&&e[u-1][2]>s;u--)e[u]=e[u-1];e[u]=[r,n,s]},o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var r in t)o.o(t,r)&&!o.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={342:0,434:0};o.O.j=t=>0===e[t];var t=(t,r)=>{var n,s,[a,c,l]=r,i=0;if(a.some((t=>0!==e[t]))){for(n in c)o.o(c,n)&&(o.m[n]=c[n]);if(l)var u=l(o)}for(t&&t(r);i<a.length;i++)s=a[i],o.o(e,s)&&e[s]&&e[s][0](),e[s]=0;return o.O(u)},r=globalThis.webpackChunkcustomer_reviews_woocommerce=globalThis.webpackChunkcustomer_reviews_woocommerce||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})();var n=o.O(void 0,[434],(()=>o(836)));n=o.O(n)})();
  • customer-reviews-woocommerce/trunk/blocks/src/reviews-grid/block.json

    r3382233 r3413656  
    5858            "default": false
    5959        },
     60        "schema_markup": {
     61            "type": "boolean",
     62            "default": false
     63        },
    6064        "sort_by": {
    6165            "type": "string",
  • customer-reviews-woocommerce/trunk/blocks/src/reviews-grid/edit.js

    r3382233 r3413656  
    6161                        label={ __( 'Number of Reviews', 'customer-reviews-woocommerce' ) }
    6262                        value={ attributes.count }
    63                         min={ 1 }
    64                         max={ 6 }
     63                        min={ 0 }
     64                        max={ 100 }
    6565                        onChange={ ( newCount ) =>
    6666                            setAttributes( { count: newCount } )
     
    7373                        value={ attributes.count_shop_reviews }
    7474                        min={ 0 }
    75                         max={ 3 }
     75                        max={ 100 }
    7676                        onChange={ ( newCount_shop_reviews ) =>
    7777                            setAttributes( { count_shop_reviews: newCount_shop_reviews } )
     
    147147                        checked={ attributes.add_review }
    148148                        onChange={ () => setAttributes( { add_review: ! attributes.add_review } ) }
     149                        __nextHasNoMarginBottom
     150                    />
     151                    <ToggleControl
     152                        label={ __( 'Schema Markup', 'customer-reviews-woocommerce' ) }
     153                        checked={ attributes.schema_markup }
     154                        onChange={ () => setAttributes( { schema_markup: ! attributes.schema_markup } ) }
    149155                        __nextHasNoMarginBottom
    150156                    />
  • customer-reviews-woocommerce/trunk/class-ivole.php

    r3406378 r3413656  
    8585
    8686class Ivole {
    87     const CR_VERSION = '5.91.0';
     87    const CR_VERSION = '5.92.0';
    8888
    8989    public function __construct() {
  • customer-reviews-woocommerce/trunk/css/frontend.css

    r3401488 r3413656  
    35133513}
    35143514
     3515.cr-reviews-grid .cr-review-card .cr-grid-replies-container {
     3516    .cr-grid-replies {
     3517        display: flex;
     3518        align-items: center;
     3519        justify-content: flex-start;
     3520        position: relative;
     3521        margin: 15px 0px;
     3522        padding: 0;
     3523        box-sizing: border-box;
     3524    }
     3525    .cr-grid-replies-line {
     3526        height: 1px;
     3527        background: #e9e9e9;
     3528    }
     3529    .cr-grid-replies-line-left {
     3530        width: 15px;
     3531        flex-shrink: 0;
     3532    }
     3533    .cr-grid-replies-line-right {
     3534        flex-grow: 1;
     3535    }
     3536    .cr-grid-replies-pill {
     3537        display: inline-flex;
     3538        align-items: center;
     3539        gap: 6px;
     3540        padding: 4px 15px;
     3541        background: #FFFFFF;
     3542        border: solid 1px #F4F4F4;
     3543        border-radius: 18px;
     3544        font-size: 16px;
     3545        font-weight: 500;
     3546        color: #484E51;
     3547        z-index: 2; /* ensure pill floats above line */
     3548    }
     3549    .cr-grid-replies-pill .cr-grid-replies-pill-count {
     3550        color: #898F92;
     3551    }
     3552    .cr-grid-first-reply {
     3553        margin: 15px 15px;
     3554    }
     3555    .cr-grid-reply-top-row {
     3556        display: flex;
     3557        gap: 15px;
     3558    }
     3559    .cr-grid-reply-top-row {
     3560        .cr-grid-reply-thumbnail {
     3561            flex-basis: 40px;
     3562            flex-shrink: 0;
     3563            margin: 0;
     3564            position: relative;
     3565            display: flex;
     3566        }
     3567        .cr-grid-reply-thumbnail img {
     3568            max-width: 40px;
     3569            max-height: 40px;
     3570            border-radius: 20px;
     3571        }
     3572        .cr-grid-reply-thumbnail .cr-avatar-check {
     3573            width: 16px;
     3574            height: 16px;
     3575            background-color: #31856C;
     3576            position: absolute;
     3577            left: 28px;
     3578            top: 21px;
     3579            border-radius: 8px;
     3580            border: 2px solid #FFFFFF;
     3581            display: flex;
     3582            align-items: center;
     3583            justify-content: center;
     3584            box-sizing: border-box;
     3585            z-index: 10;
     3586        }
     3587        .cr-grid-reply-author {
     3588            display: flex;
     3589            flex-direction: column;
     3590            justify-content: center;
     3591            gap: 2px;
     3592        }
     3593        .cr-grid-reply-author-name {
     3594            font-family: sans-serif;
     3595            font-weight: bold;
     3596            line-height: 1.2;
     3597            font-size: 16px;
     3598            color: #203741;
     3599        }
     3600        .cr-grid-reply-author-type {
     3601            font-family: sans-serif;
     3602            font-size: 14px;
     3603            font-style: normal;
     3604            font-weight: 400;
     3605            line-height: 14px;
     3606            color: #18B394;
     3607        }
     3608    }
     3609    .cr-grid-reply-middle-row {
     3610        margin: 15px 0;
     3611        padding: 16px;
     3612        background: #FCFCFC;
     3613        border: 1px solid #F9F9F9;
     3614        border-radius: 5px;
     3615        font-size: 14px;
     3616        font-family: sans-serif;
     3617        font-style: normal;
     3618        box-sizing: border-box;
     3619        font-weight: 400;
     3620    }
     3621    .cr-grid-reply-middle-row {
     3622        .cr-grid-reply-content p {
     3623            margin: 0;
     3624        }
     3625    }
     3626}
     3627
    35153628.rtl .cr-reviews-slider .cr-review-card .review-product .product-title {
    35163629    padding-left: 0;
    35173630    padding-right: 5px;
     3631}
     3632
     3633.rtl .cr-reviews-grid .cr-review-card .top-row .review-thumbnail,
     3634.rtl .cr-reviews-slider .cr-review-card .top-row .review-thumbnail {
     3635    margin-left: 16px;
     3636    margin-right: 0px;
     3637}
     3638.rtl .cr-reviews-grid .cr-review-card .rating-row .rating-label,
     3639.rtl .cr-reviews-slider .cr-review-card .rating-row .rating-label {
     3640    margin-left: 0px;
     3641    margin-right: 15px;
    35183642}
    35193643
  • customer-reviews-woocommerce/trunk/includes/blocks/class-cr-reviews-grid.php

    r3401488 r3413656  
    385385            $remaining_reviews = $count_all_reviews - count( $reviews );
    386386
     387            // get replies to reviews
     388            $cr_replies = $this->get_review_replies( $reviews );
     389
    387390            $cr_verified_label = get_option( 'ivole_verified_owner', '' );
    388391            if( $cr_verified_label ) {
     
    419422            $stars_style = $attributes['color_stars'];
    420423            $max_chars = $attributes['max_chars'];
     424            $cr_grid_hr_style = "border-color:" . $attributes['color_brdr'] . ";";
     425            $cr_grid_hr_replies_style = "background-color:" . $attributes['color_brdr'] . ";";
     426            $cr_grid_replies_pill_style = "border-color:" . $attributes['color_brdr'] . ";";
     427            $cr_grid_replies_pill_style .= "background-color:" . $attributes['color_bcrd'] . ";";
    421428
    422429            $id = uniqid( 'cr-reviews-grid-' );
     
    438445            // display a summary bar
    439446            $summary_bar = '';
    440             if ( $attributes['show_summary_bar'] || $attributes['add_review'] ) {
     447            if ( $attributes['show_summary_bar'] || $attributes['add_review'] || $attributes['schema_markup'] ) {
    441448                $summary_bar = $this->show_summary_table( $args, $args_s );
    442449            }
     
    509516                'show_summary_bar' => 'false',
    510517                'add_review' => 'false',
     518                'schema_markup' => 'false',
    511519                'comment__not_in' => []
    512520            ), $attributes, 'cusrev_reviews_grid' );
     
    583591                $attributes['add_review'] = false;
    584592            }
     593            $attributes['schema_markup'] = $attributes['schema_markup'] === 'true' ? true : false;
    585594
    586595            return $this->render_reviews_grid( $attributes );
     
    907916        }
    908917
    909         private function show_summary_table( $args, $args_shop ){
     918        private function show_summary_table( $args, $args_shop ) {
    910919            $all = $this->count_ratings( 0, $args, $args_shop );
    911920            $output = '';
     
    10801089                $output .= '<div class="cr-count-filtered-reviews"></div>';
    10811090            }
     1091
     1092            // add structured data
     1093            if (
     1094                $this->attributes['schema_markup'] &&
     1095                ! $this->attributes['shop_reviews'] &&
     1096                $this->attributes['products'] &&
     1097                is_array( $this->attributes['products'] ) &&
     1098                1 === count( $this->attributes['products'] )
     1099            ) {
     1100                $prod_temp = wc_get_product( $this->attributes['products'][0] );
     1101                if ( $prod_temp ) {
     1102                    $prod_name = esc_html( strip_tags( $prod_temp->get_title() ) );
     1103                    $schema = array(
     1104                        '@context' => 'https://schema.org/',
     1105                        '@type' => 'Product',
     1106                        'name' => $prod_name,
     1107                        'aggregateRating' => array(
     1108                            '@type' => 'aggregateRating',
     1109                            'ratingValue' => round( $average, 1 ),
     1110                            'bestRating' => 5,
     1111                            'ratingCount' => $all
     1112                        )
     1113                    );
     1114                    $output .= '<script type="application/ld+json">';
     1115                    $output .= wp_json_encode( $schema );
     1116                    $output .= '</script>';
     1117                }
     1118            }
     1119
    10821120            $output .= '</div>';
    10831121
     
    11921230        }
    11931231
     1232        private function get_review_replies( array $reviews ) {
     1233            $replies_map = [];
     1234
     1235            // Collect parent IDs from input array
     1236            $parent_ids = wp_list_pluck( $reviews, 'comment_ID' );
     1237
     1238            if ( empty( $parent_ids ) ) {
     1239                return $replies_map;
     1240            }
     1241
     1242            // Fetch all replies in one query
     1243            $all_replies = get_comments( [
     1244                'parent__in' => $parent_ids,
     1245                'orderby'    => 'comment_date_gmt',
     1246                'order'      => 'ASC',
     1247                'number'     => 0,  // no limit
     1248            ] );
     1249
     1250            // Build map: parent_id => array of replies
     1251            foreach ( $all_replies as $reply ) {
     1252                $pid = $reply->comment_parent;
     1253
     1254                if ( ! isset( $replies_map[ $pid ] ) ) {
     1255                    $replies_map[ $pid ] = [];
     1256                }
     1257
     1258                $replies_map[ $pid ][] = $reply;
     1259            }
     1260
     1261            return $replies_map;
     1262        }
     1263
    11941264    }
    11951265
  • customer-reviews-woocommerce/trunk/includes/emails/class-cr-email-coupon.php

    r3300332 r3413656  
    1616    public $heading;
    1717    public $subject;
    18     public $template_html;
    1918    public $from;
    2019    public $from_name;
     
    3231        $this->heading          = strval( get_option( 'ivole_email_heading_coupon', __( 'Thank You for Leaving a Review', 'customer-reviews-woocommerce' ) ) );
    3332        $this->subject          = strval( get_option( 'ivole_email_subject_coupon', '[{site_title}] ' . __( 'Discount Coupon for You', 'customer-reviews-woocommerce' ) ) );
    34         $this->template_html    = Ivole_Email::plugin_path() . '/templates/email_coupon.php';
    3533        $this->from                         = get_option( 'ivole_email_from', '' );
    3634        $this->from_name                = get_option( 'ivole_email_from_name', Ivole_Email::get_blogname() );
     
    303301
    304302    public function get_content() {
    305         ob_start();
    306         //$email_heading = $this->heading;
    307         $def_body = Ivole_Email::$default_body_coupon;
    308         $lang = $this->language;
    309         include( $this->template_html );
    310         return ob_get_clean();
     303        $content = '';
     304        if (
     305            function_exists( 'qtranxf_useCurrentLanguageIfNotFoundUseDefaultLanguage' )
     306        ) {
     307            // qTranslate integration
     308            $content = qtranxf_useCurrentLanguageIfNotFoundUseDefaultLanguage(
     309                wpautop(
     310                    wp_kses_post(
     311                        get_option(
     312                            'ivole_email_body_coupon',
     313                            Ivole_Email::$default_body_coupon
     314                        )
     315                    )
     316                )
     317            );
     318        } else {
     319            // WPML integration
     320            if (
     321                has_filter( 'wpml_translate_single_string' ) &&
     322                ! function_exists( 'pll_current_language' )
     323            ) {
     324                $wpml_current_language = strtolower( $this->language );
     325                $content = wpautop(
     326                    wp_kses_post(
     327                        apply_filters(
     328                            'wpml_translate_single_string',
     329                            get_option(
     330                                'ivole_email_body_coupon',
     331                                Ivole_Email::$default_body_coupon
     332                            ),
     333                            'ivole',
     334                            'ivole_email_body_coupon',
     335                            $wpml_current_language
     336                        )
     337                    )
     338                );
     339            } elseif (
     340                function_exists( 'pll_current_language' )
     341            ) {
     342                $polylang_current_language = strtolower( $this->language );
     343                $content = wpautop(
     344                    wp_kses_post(
     345                        pll_translate_string(
     346                            get_option( 'ivole_email_body_coupon', Ivole_Email::$default_body_coupon ),
     347                            $polylang_current_language
     348                        )
     349                    )
     350                );
     351            } else {
     352                $content = wpautop(
     353                    wp_kses_post(
     354                        get_option(
     355                            'ivole_email_body_coupon',
     356                            Ivole_Email::$default_body_coupon
     357                        )
     358                    )
     359                );
     360            }
     361        }
     362        return $content;
    311363    }
    312364
  • customer-reviews-woocommerce/trunk/includes/emails/class-cr-email.php

    r3392565 r3413656  
    586586        } else {
    587587            //WPML and Polylang integration
    588             if ( has_filter( 'wpml_translate_single_string' ) && defined( 'ICL_LANGUAGE_CODE' ) && ICL_LANGUAGE_CODE && ! function_exists( 'pll_current_language' ) ) {
     588            if ( has_filter( 'wpml_translate_single_string' ) && ! function_exists( 'pll_current_language' ) ) {
    589589                $content = wpautop(
    590590                    wp_kses_post(
  • customer-reviews-woocommerce/trunk/includes/google/class-cr-structured-data.php

    r3406378 r3413656  
    3434
    3535        public function filter_woocommerce_structured_data_product( $markup, $product ) {
    36             $identifiers = self::get_product_feed_identifiers();
    37             if( isset( $identifiers['gtin'] ) ) {
    38                 $gtin = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['gtin'], $product );
    39                 $gtin_lenth = mb_strlen( $gtin );
    40                 switch( $gtin_lenth ) {
    41                     case 8:
    42                         $markup['gtin8'] = $gtin;
    43                         break;
    44                     case 12:
    45                         $markup['gtin12'] = $gtin;
    46                         break;
    47                     case 13:
    48                         $markup['gtin13'] = $gtin;
    49                         break;
    50                     case 14:
    51                         $markup['gtin14'] = $gtin;
    52                         break;
    53                     default:
    54                         $markup['gtin'] = $gtin;
    55                         break;
    56                 }
    57             }
    58             if( isset( $identifiers['mpn'] ) ) {
    59                 $mpn = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['mpn'], $product );
    60                 if( $mpn ) {
    61                     $markup['mpn'] = $mpn;
    62                 }
    63             }
    64             if( isset( $identifiers['brand'] ) ) {
    65                 $brand = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['brand'], $product );
    66                 if( !$brand ) {
    67                     $brand = trim( get_option( 'ivole_google_brand_static', '' ) );
    68                 }
    69                 if( $brand ) {
    70                     $markup['brand'] = array(
    71                         '@type' => 'Brand',
    72                         'name' => $brand
    73                     );
    74                 }
    75             }
    76 
     36            if ( 'yes' === get_option( 'ivole_product_feed_enable_id_str_dat', 'no' ) ) {
     37                $identifiers = self::get_product_feed_identifiers();
     38                if( isset( $identifiers['gtin'] ) ) {
     39                    $gtin = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['gtin'], $product );
     40                    $gtin_lenth = mb_strlen( $gtin );
     41                    switch( $gtin_lenth ) {
     42                        case 8:
     43                            $markup['gtin8'] = $gtin;
     44                            break;
     45                        case 12:
     46                            $markup['gtin12'] = $gtin;
     47                            break;
     48                        case 13:
     49                            $markup['gtin13'] = $gtin;
     50                            break;
     51                        case 14:
     52                            $markup['gtin14'] = $gtin;
     53                            break;
     54                        default:
     55                            $markup['gtin'] = $gtin;
     56                            break;
     57                    }
     58                }
     59                if( isset( $identifiers['mpn'] ) ) {
     60                    $mpn = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['mpn'], $product );
     61                    if( $mpn ) {
     62                        $markup['mpn'] = $mpn;
     63                    }
     64                }
     65                if( isset( $identifiers['brand'] ) ) {
     66                    $brand = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['brand'], $product );
     67                    if( !$brand ) {
     68                        $brand = trim( get_option( 'ivole_google_brand_static', '' ) );
     69                    }
     70                    if( $brand ) {
     71                        $markup['brand'] = array(
     72                            '@type' => 'Brand',
     73                            'name' => $brand
     74                        );
     75                    }
     76                }
     77            }
    7778            return $markup;
    7879        }
     
    8081        public function action_woocommerce_structured_data_review() {
    8182            global $product;
    82             $identifiers = self::get_product_feed_identifiers();
    83             $space = apply_filters( 'cr_productids_separator', '<br>' );
    84             if( isset( $identifiers['gtin'] ) ) {
    85                 $gtin = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['gtin'], $product );
    86                 if( !$gtin ) {
    87                     // if variable product, check if any variation has gtin
    88                     if( $product->is_type( 'variable' ) ) {
    89                         $available_variations = wc_get_products( array(
    90                             'parent' => $product->get_id(),
    91                             'status' => 'publish',
    92                             'type' => 'variation',
    93                             'limit' => -1
    94                         ) );
    95                         foreach ( $available_variations as $variation )
    96                         {
    97                             if( CR_Google_Shopping_Prod_Feed::get_field( $identifiers['gtin'], $variation ) ) {
    98                                 $gtin = __( 'N/A', 'woocommerce' );
    99                                 break;
     83            if ( 'yes' === get_option( 'ivole_product_feed_enable_id_str_dat', 'no' ) ) {
     84                $identifiers = self::get_product_feed_identifiers();
     85                $space = apply_filters( 'cr_productids_separator', '<br>' );
     86                if( isset( $identifiers['gtin'] ) ) {
     87                    $gtin = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['gtin'], $product );
     88                    if( !$gtin ) {
     89                        // if variable product, check if any variation has gtin
     90                        if( $product->is_type( 'variable' ) ) {
     91                            $available_variations = wc_get_products( array(
     92                                'parent' => $product->get_id(),
     93                                'status' => 'publish',
     94                                'type' => 'variation',
     95                                'limit' => -1
     96                            ) );
     97                            foreach ( $available_variations as $variation )
     98                            {
     99                                if( CR_Google_Shopping_Prod_Feed::get_field( $identifiers['gtin'], $variation ) ) {
     100                                    $gtin = __( 'N/A', 'woocommerce' );
     101                                    break;
     102                                }
    100103                            }
    101104                        }
    102105                    }
    103                 }
    104                 if( $gtin ) {
    105                     echo $space . '<span class="cr_gtin" data-o_content="' . $gtin . '">' . __( 'GTIN: ', 'customer-reviews-woocommerce' ) .
    106                         '<span class="cr_gtin_val">' . $gtin . '</span></span>';
    107                 }
    108             }
    109             if( isset( $identifiers['mpn'] ) ) {
    110                 $mpn = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['mpn'], $product );
    111                 if( !$mpn ) {
    112                     // if variable product, check if any variation has mpn
    113                     if( $product->is_type( 'variable' ) ) {
    114                         $available_variations = wc_get_products( array(
    115                             'parent' => $product->get_id(),
    116                             'status' => 'publish',
    117                             'type' => 'variation',
    118                             'limit' => -1
    119                         ) );
    120                         foreach ( $available_variations as $variation )
    121                         {
    122                             if( CR_Google_Shopping_Prod_Feed::get_field( $identifiers['mpn'], $variation ) ) {
    123                                 $mpn = __( 'N/A', 'woocommerce' );
    124                                 break;
     106                    if( $gtin ) {
     107                        echo $space . '<span class="cr_gtin" data-o_content="' . $gtin . '">' . __( 'GTIN: ', 'customer-reviews-woocommerce' ) .
     108                            '<span class="cr_gtin_val">' . $gtin . '</span></span>';
     109                    }
     110                }
     111                if( isset( $identifiers['mpn'] ) ) {
     112                    $mpn = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['mpn'], $product );
     113                    if( !$mpn ) {
     114                        // if variable product, check if any variation has mpn
     115                        if( $product->is_type( 'variable' ) ) {
     116                            $available_variations = wc_get_products( array(
     117                                'parent' => $product->get_id(),
     118                                'status' => 'publish',
     119                                'type' => 'variation',
     120                                'limit' => -1
     121                            ) );
     122                            foreach ( $available_variations as $variation )
     123                            {
     124                                if( CR_Google_Shopping_Prod_Feed::get_field( $identifiers['mpn'], $variation ) ) {
     125                                    $mpn = __( 'N/A', 'woocommerce' );
     126                                    break;
     127                                }
    125128                            }
    126129                        }
    127130                    }
    128                 }
    129                 if( $mpn ) {
    130                     echo $space . '<span class="cr_mpn" data-o_content="' . $mpn . '">' . __( 'MPN: ', 'customer-reviews-woocommerce' ) .
    131                         '<span class="cr_mpn_val">' . $mpn . '</span></span>';
    132                 }
    133             }
    134             if( isset( $identifiers['brand'] ) ) {
    135                 $brand = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['brand'], $product );
    136                 if( !$brand ) {
    137                     $brand = trim( get_option( 'ivole_google_brand_static', '' ) );
    138                 }
    139                 if( $brand ) {
    140                     echo $space . '<span class="cr_brand" data-o_content="' . $brand . '">' . __( 'Brand: ', 'customer-reviews-woocommerce' ) .
    141                         '<span class="cr_brand_val">' . $brand . '</span></span>';
     131                    if( $mpn ) {
     132                        echo $space . '<span class="cr_mpn" data-o_content="' . $mpn . '">' . __( 'MPN: ', 'customer-reviews-woocommerce' ) .
     133                            '<span class="cr_mpn_val">' . $mpn . '</span></span>';
     134                    }
     135                }
     136                if( isset( $identifiers['brand'] ) ) {
     137                    $brand = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['brand'], $product );
     138                    if( !$brand ) {
     139                        $brand = trim( get_option( 'ivole_google_brand_static', '' ) );
     140                    }
     141                    if( $brand ) {
     142                        echo $space . '<span class="cr_brand" data-o_content="' . $brand . '">' . __( 'Brand: ', 'customer-reviews-woocommerce' ) .
     143                            '<span class="cr_brand_val">' . $brand . '</span></span>';
     144                    }
    142145                }
    143146            }
     
    152155        */
    153156        public function filter_woocommerce_available_variation( $variations, $product, $variation ) {
    154             $identifiers = self::get_product_feed_identifiers();
    155             if( isset( $identifiers['gtin'] ) ) {
    156                 $gtin = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['gtin'], $variation );
    157                 if( $gtin ) {
    158                     $variations['_cr_gtin'] = $gtin;
    159                 } else {
    160                     $gtin = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['gtin'], $product );
     157            if ( 'yes' === get_option( 'ivole_product_feed_enable_id_str_dat', 'no' ) ) {
     158                $identifiers = self::get_product_feed_identifiers();
     159                if( isset( $identifiers['gtin'] ) ) {
     160                    $gtin = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['gtin'], $variation );
    161161                    if( $gtin ) {
    162162                        $variations['_cr_gtin'] = $gtin;
    163                     }
    164                 }
    165             }
    166             if( isset( $identifiers['mpn'] ) ) {
    167                 $mpn = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['mpn'], $variation );
    168                 if( $mpn ) {
    169                     $variations['_cr_mpn'] = $mpn;
    170                 } else {
    171                     $mpn = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['mpn'], $product );
     163                    } else {
     164                        $gtin = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['gtin'], $product );
     165                        if( $gtin ) {
     166                            $variations['_cr_gtin'] = $gtin;
     167                        }
     168                    }
     169                }
     170                if( isset( $identifiers['mpn'] ) ) {
     171                    $mpn = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['mpn'], $variation );
    172172                    if( $mpn ) {
    173173                        $variations['_cr_mpn'] = $mpn;
    174                     }
    175                 }
    176             }
    177             if( isset( $identifiers['brand'] ) ) {
    178                 $brand = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['brand'], $variation );
    179                 if( $brand ) {
    180                     $variations['_cr_brand'] = $brand;
    181                 } else {
    182                     $brand = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['brand'], $product );
     174                    } else {
     175                        $mpn = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['mpn'], $product );
     176                        if( $mpn ) {
     177                            $variations['_cr_mpn'] = $mpn;
     178                        }
     179                    }
     180                }
     181                if( isset( $identifiers['brand'] ) ) {
     182                    $brand = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['brand'], $variation );
    183183                    if( $brand ) {
    184184                        $variations['_cr_brand'] = $brand;
    185185                    } else {
    186                         $brand = trim( get_option( 'ivole_google_brand_static', '' ) );
     186                        $brand = CR_Google_Shopping_Prod_Feed::get_field( $identifiers['brand'], $product );
    187187                        if( $brand ) {
    188188                            $variations['_cr_brand'] = $brand;
     189                        } else {
     190                            $brand = trim( get_option( 'ivole_google_brand_static', '' ) );
     191                            if( $brand ) {
     192                                $variations['_cr_brand'] = $brand;
     193                            }
    189194                        }
    190195                    }
     
    219224            $image     = wp_get_attachment_url( $product->get_image_id() );
    220225            $markup = array(
     226                '@context'    => 'https://schema.org/',
    221227                '@type'       => 'Product',
    222228                '@id'         => $permalink . '#product', // Append '#product' to differentiate between this @id and the @id generated for the Breadcrumblist.
     
    284290            if ( ! empty( $markup['aggregateRating'] ) ) {
    285291                echo '<script type="application/ld+json">' .
    286                     wp_json_encode( $markup, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) .
     292                    wp_json_encode( $markup ) .
    287293                    '</script>';
    288294            }
  • customer-reviews-woocommerce/trunk/includes/reminders/class-cr-manual.php

    r3392565 r3413656  
    269269
    270270        public function custom_orders_list_column_content( $column, $post_id ) {
    271             if( 'ivole-review-reminder' === $column ) {
     271            if (
     272                'ivole-review-reminder' === $column &&
     273                ! $this->is_reminder_column_hidden()
     274            ) {
    272275                $order = wc_get_order( $post_id );
    273276                if ( $order ) {
     
    852855        }
    853856
     857        function is_reminder_column_hidden() {
     858            $column_name = 'ivole-review-reminder';
     859            $user_id = get_current_user_id();
     860
     861            // user meta key used by WordPress to store hidden columns for WooCommerce Orders
     862            $hidden = get_user_meta( $user_id, 'managewoocommerce_page_wc-orderscolumnshidden', true );
     863            if ( ! is_array( $hidden ) ) {
     864                return false; // no hidden columns configured
     865            }
     866            return in_array( $column_name, $hidden, true );
     867        }
     868
    854869    }
    855870
  • customer-reviews-woocommerce/trunk/includes/settings/class-cr-settings-shortcodes.php

    r3396824 r3413656  
    118118            '<p class="cr-admin-shortcodes"><code>[cusrev_reviews_grid count="3" show_products="true" product_links="true" sort_by="date" sort="DESC" categories="" product_tags="" tags="" ' .
    119119            'products="current" color_ex_brdr="#ebebeb" color_brdr="#ebebeb" color_ex_bcrd="" color_bcrd="#ffffff" color_pr_bcrd="#f4f4f4" color_stars="#FFBC00" ' .
    120             'shop_reviews="false" count_shop_reviews="1" inactive_products="false" avatars="initials" show_more="0" max_chars="0" min_chars="0" show_summary_bar="false" add_review="false"]</code></p>' .
     120            'shop_reviews="false" count_shop_reviews="1" inactive_products="false" avatars="initials" show_more="0" max_chars="0" min_chars="0" show_summary_bar="false" add_review="false" schema_markup="false"]</code></p>' .
    121121            '<p class="cr-admin-shortcodes"><b>' . __( 'Parameters:', 'customer-reviews-woocommerce' ) . '</b></p>' .
    122122            '<ul>' .
     
    145145            '<li>' . sprintf( __( '%1$s argument accepts %2$s or %3$s and specifies if a summary bar should be shown on top of the reviews.', 'customer-reviews-woocommerce' ), '<code>show_summary_bar</code>', '<code>"true"</code>', '<code>"false"</code>' ) . '</li>' .
    146146            '<li>' . sprintf( __( '%1$s parameter accepts %2$s, %3$s or a product ID. Use it to display a form to write a new review. If the shortcode is placed on a page of a product and the parameter is set to %2$s, the review form will correspond to that product. If the shortocode is placed on a non-product page and the parameter is set to %2$s, the review form will collect shop reviews. If the parameter is set to a product ID, the review form will correspond to a product with that ID.', 'customer-reviews-woocommerce' ), '<code>add_review</code>', '<code>"true"</code>', '<code>"false"</code>' ) . '</li>' .
     147            '<li>' . sprintf(
     148                __( '%1$s parameter accepts %2$s or %3$s and controls if %4$s structured data should be created for search engines. To comply with schema markup guidelines, this parameter takes effect only when the shortcode displays reviews for a single product, that is, when parameter %5$s is %3$s and parameter %6$s is set to either %7$s or a single product ID.', 'customer-reviews-woocommerce' ),
     149                '<code>schema_markup</code>',
     150                '<code>"true"</code>',
     151                '<code>"false"</code>',
     152                '<code>AggregateRating</code>',
     153                '<code>shop_reviews</code>',
     154                '<code>products</code>',
     155                '<code>"current"</code>'
     156                ) . '</li>' .
    147157            '</ul>' . '<br>' .
    148158            sprintf( __( '%1$s shortcode is also available as <strong>Reviews Grid</strong> block in the new WordPress Gutenberg page editor (blocks require WordPress 5.0 or newer).', 'customer-reviews-woocommerce' ), '<code>[cusrev_reviews_grid]</code>' ) . '<br><br>' .
  • customer-reviews-woocommerce/trunk/ivole.php

    r3406378 r3413656  
    44Description: Customer Reviews for WooCommerce plugin helps you get more customer reviews for your shop by sending automated reminders and coupons.
    55Plugin URI: https://wordpress.org/plugins/customer-reviews-woocommerce/
    6 Version: 5.91.0
     6Version: 5.92.0
    77Author: CusRev
    88Author URI: https://www.cusrev.com/business/
  • customer-reviews-woocommerce/trunk/js/frontend.js

    r3392565 r3413656  
    615615            e.preventDefault();
    616616            let parent = jQuery(this).parents(".review-content");
     617            if ( 0 === parent.length ) {
     618                parent = jQuery(this).parents(".cr-grid-reply-content");
     619            }
    617620            parent.find(".cr-grid-read-more").hide();
    618621            parent.find(".cr-grid-details").css("display", "inline");
     
    621624            e.preventDefault();
    622625            let parent = jQuery(this).parents(".review-content");
     626            if ( 0 === parent.length ) {
     627                parent = jQuery(this).parents(".cr-grid-reply-content");
     628            }
    623629            parent.find(".cr-grid-details").hide();
    624630            parent.find(".cr-grid-read-more").css("display", "inline");
  • customer-reviews-woocommerce/trunk/languages/customer-reviews-woocommerce.pot

    r3406378 r3413656  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: Customer Reviews for WooCommerce 5.91.0\n"
     5"Project-Id-Version: Customer Reviews for WooCommerce 5.92.0\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/customer-reviews-woocommerce\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
     
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2025-12-01T01:24:10+00:00\n"
     12"POT-Creation-Date: 2025-12-07T14:45:20+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.8.1\n"
     
    7171#: includes/analytics/class-cr-reminders-log.php:361
    7272#: includes/reminders/class-cr-local-forms.php:301
    73 #: includes/reminders/class-cr-manual.php:390
     73#: includes/reminders/class-cr-manual.php:393
    7474msgid "Error"
    7575msgstr ""
     
    9393#: includes/misc/class-cr-admin-menu-diagnostics.php:340
    9494#: includes/qna/class-cr-admin-menu-qna.php:194
    95 #: includes/reminders/class-cr-manual.php:400
    96 #: includes/reminders/class-cr-manual.php:423
     95#: includes/reminders/class-cr-manual.php:403
     96#: includes/reminders/class-cr-manual.php:426
    9797#: includes/reviews/class-cr-admin-menu-reviews.php:245
    9898#: includes/reviews/class-cr-admin-menu-reviews.php:254
     
    111111#: includes/misc/class-cr-admin-menu-diagnostics.php:340
    112112#: includes/qna/class-cr-admin-menu-qna.php:195
    113 #: includes/reminders/class-cr-manual.php:401
    114 #: includes/reminders/class-cr-manual.php:424
     113#: includes/reminders/class-cr-manual.php:404
     114#: includes/reminders/class-cr-manual.php:427
    115115#: includes/reviews/class-cr-admin-menu-reviews.php:246
    116116#: includes/reviews/class-cr-admin-menu-reviews.php:255
     
    124124
    125125#: includes/analytics/class-cr-reminders-log.php:397
    126 #: includes/reminders/class-cr-manual.php:374
     126#: includes/reminders/class-cr-manual.php:377
    127127#: includes/settings/class-cr-settings-emails.php:113
    128128#: includes/settings/class-cr-settings-review-discount.php:965
     
    136136
    137137#: includes/analytics/class-cr-reminders-log.php:400
    138 #: includes/reminders/class-cr-manual.php:378
     138#: includes/reminders/class-cr-manual.php:381
    139139msgid "WhatsApp"
    140140msgstr ""
     
    220220#: includes/blocks/class-cr-all-reviews.php:543
    221221#: templates/cr-ajax-product-reviews.php:125
    222 #: templates/reviews-grid.php:241
     222#: templates/reviews-grid.php:323
    223223msgid "Sorry, no reviews match your current selections"
    224224msgstr ""
     
    230230#: includes/reviews/class-cr-ajax-reviews.php:470
    231231#: templates/cr-ajax-product-reviews.php:111
    232 #: templates/reviews-grid.php:230
     232#: templates/reviews-grid.php:312
    233233msgid "Show more reviews (%d)"
    234234msgstr ""
    235235
    236236#: includes/blocks/class-cr-all-reviews.php:878
    237 #: includes/blocks/class-cr-reviews-grid.php:985
     237#: includes/blocks/class-cr-reviews-grid.php:994
    238238#: includes/reviews/class-cr-reviews.php:550
    239239msgid "Based on %s review"
     
    244244#: includes/blocks/class-cr-all-reviews.php:891
    245245#: includes/blocks/class-cr-all-reviews.php:895
    246 #: includes/blocks/class-cr-reviews-grid.php:998
    247 #: includes/blocks/class-cr-reviews-grid.php:1002
     246#: includes/blocks/class-cr-reviews-grid.php:1007
     247#: includes/blocks/class-cr-reviews-grid.php:1011
    248248#: includes/reviews/class-cr-reviews.php:565
    249249#: includes/reviews/class-cr-reviews.php:569
     
    253253#: includes/blocks/class-cr-all-reviews.php:904
    254254#: includes/blocks/class-cr-all-reviews.php:908
    255 #: includes/blocks/class-cr-reviews-grid.php:1011
    256 #: includes/blocks/class-cr-reviews-grid.php:1015
     255#: includes/blocks/class-cr-reviews-grid.php:1020
     256#: includes/blocks/class-cr-reviews-grid.php:1024
    257257#: includes/reviews/class-cr-reviews.php:576
    258258#: includes/reviews/class-cr-reviews.php:580
     
    262262#: includes/blocks/class-cr-all-reviews.php:917
    263263#: includes/blocks/class-cr-all-reviews.php:921
    264 #: includes/blocks/class-cr-reviews-grid.php:1024
    265 #: includes/blocks/class-cr-reviews-grid.php:1028
     264#: includes/blocks/class-cr-reviews-grid.php:1033
     265#: includes/blocks/class-cr-reviews-grid.php:1037
    266266#: includes/reviews/class-cr-reviews.php:587
    267267#: includes/reviews/class-cr-reviews.php:591
     
    271271#: includes/blocks/class-cr-all-reviews.php:930
    272272#: includes/blocks/class-cr-all-reviews.php:934
    273 #: includes/blocks/class-cr-reviews-grid.php:1037
    274 #: includes/blocks/class-cr-reviews-grid.php:1041
     273#: includes/blocks/class-cr-reviews-grid.php:1046
     274#: includes/blocks/class-cr-reviews-grid.php:1050
    275275#: includes/reviews/class-cr-reviews.php:598
    276276#: includes/reviews/class-cr-reviews.php:602
     
    280280#: includes/blocks/class-cr-all-reviews.php:943
    281281#: includes/blocks/class-cr-all-reviews.php:947
    282 #: includes/blocks/class-cr-reviews-grid.php:1050
    283 #: includes/blocks/class-cr-reviews-grid.php:1054
     282#: includes/blocks/class-cr-reviews-grid.php:1059
     283#: includes/blocks/class-cr-reviews-grid.php:1063
    284284#: includes/reviews/class-cr-reviews-list-table.php:474
    285285#: includes/reviews/class-cr-reviews.php:609
     
    289289
    290290#: includes/blocks/class-cr-all-reviews.php:959
    291 #: includes/blocks/class-cr-reviews-grid.php:1067
     291#: includes/blocks/class-cr-reviews-grid.php:1076
    292292#: includes/reviews/class-cr-reviews.php:1752
    293293#: templates/cr-review-form.php:31
     
    317317
    318318#: includes/blocks/class-cr-all-reviews.php:1149
    319 #: includes/blocks/class-cr-reviews-grid.php:1076
     319#: includes/blocks/class-cr-reviews-grid.php:1085
    320320#: includes/reviews/class-cr-reviews.php:625
    321321msgid "See all %d review"
     
    357357#: includes/qna/class-cr-admin-menu-qna.php:199
    358358#: includes/qna/class-cr-qna.php:183
    359 #: includes/reminders/class-cr-manual.php:417
     359#: includes/reminders/class-cr-manual.php:420
    360360#: includes/reviews/class-cr-admin-menu-reviews.php:250
    361361#: includes/reviews/class-cr-reviews.php:449
     
    423423msgstr ""
    424424
    425 #: includes/blocks/class-cr-reviews-grid.php:395
     425#: includes/blocks/class-cr-reviews-grid.php:398
    426426#: includes/blocks/class-cr-reviews-slider.php:239
    427427#: includes/reviews/class-cr-admin-menu-reviews.php:647
     
    431431msgstr ""
    432432
    433 #: includes/blocks/class-cr-reviews-grid.php:399
    434 #: includes/blocks/class-cr-reviews-grid.php:401
    435 #: includes/blocks/class-cr-reviews-grid.php:406
    436 #: includes/blocks/class-cr-reviews-grid.php:408
     433#: includes/blocks/class-cr-reviews-grid.php:402
     434#: includes/blocks/class-cr-reviews-grid.php:404
     435#: includes/blocks/class-cr-reviews-grid.php:409
     436#: includes/blocks/class-cr-reviews-grid.php:411
    437437#: includes/blocks/class-cr-reviews-slider.php:243
    438438#: includes/blocks/class-cr-reviews-slider.php:245
     
    447447msgstr ""
    448448
    449 #: includes/blocks/class-cr-reviews-grid.php:402
    450 #: includes/blocks/class-cr-reviews-grid.php:409
     449#: includes/blocks/class-cr-reviews-grid.php:405
     450#: includes/blocks/class-cr-reviews-grid.php:412
    451451#: includes/blocks/class-cr-reviews-slider.php:246
    452452#: includes/blocks/class-cr-reviews-slider.php:253
     
    456456msgstr ""
    457457
    458 #: includes/blocks/class-cr-reviews-grid.php:1075
     458#: includes/blocks/class-cr-reviews-grid.php:1084
    459459#: includes/reviews/class-cr-reviews.php:624
    460460msgid "Showing %1$d of %2$d review (%3$d star). "
     
    512512msgstr ""
    513513
    514 #: includes/emails/class-cr-email-coupon.php:32
     514#: includes/emails/class-cr-email-coupon.php:31
    515515#: includes/settings/class-cr-settings-email-template.php:113
    516516msgid "Thank You for Leaving a Review"
    517517msgstr ""
    518518
    519 #: includes/emails/class-cr-email-coupon.php:33
     519#: includes/emails/class-cr-email-coupon.php:32
    520520#: includes/settings/class-cr-settings-email-template.php:95
    521521msgid "Discount Coupon for You"
    522522msgstr ""
    523523
    524 #: includes/emails/class-cr-email-coupon.php:139
     524#: includes/emails/class-cr-email-coupon.php:137
    525525#: includes/emails/class-cr-email.php:160
    526526#: includes/misc/class-cr-license.php:24
     
    531531msgstr ""
    532532
    533 #: includes/emails/class-cr-email-coupon.php:153
    534 #: includes/emails/class-cr-email-coupon.php:179
     533#: includes/emails/class-cr-email-coupon.php:151
     534#: includes/emails/class-cr-email-coupon.php:177
    535535#: includes/emails/class-cr-email.php:465
    536536#: includes/emails/class-cr-email.php:506
     
    542542msgstr ""
    543543
    544 #: includes/emails/class-cr-email-coupon.php:154
    545 #: includes/emails/class-cr-email-coupon.php:180
     544#: includes/emails/class-cr-email-coupon.php:152
     545#: includes/emails/class-cr-email-coupon.php:178
    546546#: includes/emails/class-cr-email.php:466
    547547#: includes/emails/class-cr-email.php:507
     
    553553msgstr ""
    554554
    555 #: includes/emails/class-cr-email-coupon.php:155
     555#: includes/emails/class-cr-email-coupon.php:153
    556556#: includes/emails/class-cr-email.php:467
    557557#: includes/emails/class-cr-wtsap.php:694
     
    559559msgstr ""
    560560
    561 #: includes/emails/class-cr-email-coupon.php:219
     561#: includes/emails/class-cr-email-coupon.php:217
    562562#: includes/emails/class-cr-email.php:695
    563563msgid "Error: a review reminder could not be sent using CusRev mailer. Please re-save options on the CusRev.com tab at the plugin's settings page."
    564564msgstr ""
    565565
    566 #: includes/emails/class-cr-email-coupon.php:401
     566#: includes/emails/class-cr-email-coupon.php:453
    567567msgid "Discount coupon %s has been successfully sent to the customer by email."
    568568msgstr ""
    569569
    570 #: includes/emails/class-cr-email-coupon.php:409
     570#: includes/emails/class-cr-email-coupon.php:461
    571571msgid "An error occurred when sending the discount coupon %s to the customer by email."
    572572msgstr ""
     
    959959#: blocks/build/reviews-grid/index.js:12
    960960#: blocks/build/reviews-slider/index.js:12
    961 #: blocks/src/reviews-grid/edit.js:194
     961#: blocks/src/reviews-grid/edit.js:200
    962962#: blocks/src/reviews-slider/edit.js:168
    963963msgid "Product Categories"
     
    13981398msgstr ""
    13991399
    1400 #: includes/google/class-cr-structured-data.php:105
     1400#: includes/google/class-cr-structured-data.php:107
    14011401msgid "GTIN: "
    14021402msgstr ""
    14031403
    1404 #: includes/google/class-cr-structured-data.php:130
     1404#: includes/google/class-cr-structured-data.php:132
    14051405msgid "MPN: "
    14061406msgstr ""
    14071407
    1408 #: includes/google/class-cr-structured-data.php:140
     1408#: includes/google/class-cr-structured-data.php:142
    14091409msgid "Brand: "
    14101410msgstr ""
     
    15081508#: includes/import-export/class-cr-import-reviews.php:147
    15091509#: includes/qna/class-cr-admin-menu-qna.php:196
    1510 #: includes/reminders/class-cr-manual.php:411
     1510#: includes/reminders/class-cr-manual.php:414
    15111511#: includes/reminders/class-cr-reminders-list-table.php:194
    15121512#: includes/reminders/class-cr-reminders-list-table.php:399
     
    25062506#: blocks/build/reviews-grid/index.js:12
    25072507#: blocks/build/reviews-slider/index.js:12
    2508 #: blocks/src/reviews-grid/edit.js:170
     2508#: blocks/src/reviews-grid/edit.js:176
    25092509#: blocks/src/reviews-slider/edit.js:149
    25102510msgid "Rating"
     
    25652565
    25662566#: includes/reminders/class-cr-manual.php:129
    2567 #: includes/reminders/class-cr-manual.php:451
    2568 #: includes/reminders/class-cr-manual.php:566
    2569 #: includes/reminders/class-cr-manual.php:664
    2570 #: includes/reminders/class-cr-manual.php:734
     2567#: includes/reminders/class-cr-manual.php:454
     2568#: includes/reminders/class-cr-manual.php:569
     2569#: includes/reminders/class-cr-manual.php:667
     2570#: includes/reminders/class-cr-manual.php:737
    25712571msgid "A security token expired, please refresh the page and try again."
    25722572msgstr ""
    25732573
    25742574#: includes/reminders/class-cr-manual.php:139
    2575 #: includes/reminders/class-cr-manual.php:461
    2576 #: includes/reminders/class-cr-manual.php:575
    2577 #: includes/reminders/class-cr-manual.php:674
    2578 #: includes/reminders/class-cr-manual.php:744
     2575#: includes/reminders/class-cr-manual.php:464
     2576#: includes/reminders/class-cr-manual.php:578
     2577#: includes/reminders/class-cr-manual.php:677
     2578#: includes/reminders/class-cr-manual.php:747
    25792579msgid "Your user account does not have permissions for sending review reminders."
    25802580msgstr ""
    25812581
    25822582#: includes/reminders/class-cr-manual.php:148
    2583 #: includes/reminders/class-cr-manual.php:470
    2584 #: includes/reminders/class-cr-manual.php:586
    2585 #: includes/reminders/class-cr-manual.php:686
    2586 #: includes/reminders/class-cr-manual.php:755
     2583#: includes/reminders/class-cr-manual.php:473
     2584#: includes/reminders/class-cr-manual.php:589
     2585#: includes/reminders/class-cr-manual.php:689
     2586#: includes/reminders/class-cr-manual.php:758
    25872587msgid "Error: invalid order ID."
    25882588msgstr ""
     
    25932593
    25942594#: includes/reminders/class-cr-manual.php:184
    2595 #: includes/reminders/class-cr-manual.php:527
     2595#: includes/reminders/class-cr-manual.php:530
    25962596msgid "Error: a review reminder could not be sent because reviews(s) have already been collected with a CusRev mailer for this order."
    25972597msgstr ""
    25982598
    25992599#: includes/reminders/class-cr-manual.php:230
    2600 #: includes/reminders/class-cr-manual.php:332
    2601 #: includes/reminders/class-cr-manual.php:631
     2600#: includes/reminders/class-cr-manual.php:335
     2601#: includes/reminders/class-cr-manual.php:634
    26022602msgid "No reminders sent"
    26032603msgstr ""
    26042604
    26052605#: includes/reminders/class-cr-manual.php:234
    2606 #: includes/reminders/class-cr-manual.php:712
     2606#: includes/reminders/class-cr-manual.php:715
    26072607msgid " reminder(s) sent"
    26082608msgstr ""
    26092609
    26102610#: includes/reminders/class-cr-manual.php:236
    2611 #: includes/reminders/class-cr-manual.php:304
    2612 #: includes/reminders/class-cr-manual.php:317
    2613 #: includes/reminders/class-cr-manual.php:714
     2611#: includes/reminders/class-cr-manual.php:307
     2612#: includes/reminders/class-cr-manual.php:320
     2613#: includes/reminders/class-cr-manual.php:717
    26142614msgid "No reminders sent yet"
    26152615msgstr ""
     
    26302630msgstr ""
    26312631
    2632 #: includes/reminders/class-cr-manual.php:277
     2632#: includes/reminders/class-cr-manual.php:280
    26332633msgid "No customer consent received"
    26342634msgstr ""
    26352635
    26362636#. translators: %d will be automatically replaced with the count of reviews
    2637 #: includes/reminders/class-cr-manual.php:290
     2637#: includes/reminders/class-cr-manual.php:293
    26382638msgid "%d review received"
    26392639msgid_plural "%d reviews received"
     
    26412641msgstr[1] ""
    26422642
    2643 #: includes/reminders/class-cr-manual.php:296
     2643#: includes/reminders/class-cr-manual.php:299
    26442644msgid "A review reminder was scheduled via CR Cron"
    26452645msgstr ""
    26462646
    26472647#. translators: %s will be automatically replaced with the status name
    2648 #: includes/reminders/class-cr-manual.php:307
    2649 #: includes/reminders/class-cr-manual.php:320
    2650 msgid "A review reminder will be scheduled after the status is set to %s"
    2651 msgstr ""
    2652 
    26532648#: includes/reminders/class-cr-manual.php:310
    26542649#: includes/reminders/class-cr-manual.php:323
     2650msgid "A review reminder will be scheduled after the status is set to %s"
     2651msgstr ""
     2652
     2653#: includes/reminders/class-cr-manual.php:313
     2654#: includes/reminders/class-cr-manual.php:326
    26552655msgid "Automatic review reminders are disabled"
    26562656msgstr ""
    26572657
    26582658#. translators: %d will be automatically replaced with the count of review reminders
    2659 #: includes/reminders/class-cr-manual.php:330
    2660 #: includes/reminders/class-cr-manual.php:637
     2659#: includes/reminders/class-cr-manual.php:333
     2660#: includes/reminders/class-cr-manual.php:640
    26612661msgid "%d reminder sent"
    26622662msgid_plural "%d reminders sent"
     
    26642664msgstr[1] ""
    26652665
    2666 #: includes/reminders/class-cr-manual.php:340
     2666#: includes/reminders/class-cr-manual.php:343
    26672667msgid "A reminder is scheduled for "
    26682668msgstr ""
    26692669
    2670 #: includes/reminders/class-cr-manual.php:342
     2670#: includes/reminders/class-cr-manual.php:345
    26712671msgid "WP Cron error"
    26722672msgstr ""
    26732673
    2674 #: includes/reminders/class-cr-manual.php:377
     2674#: includes/reminders/class-cr-manual.php:380
    26752675msgid "A review invitation cannot be sent by WhatsApp because no phone number is found in the order."
    26762676msgstr ""
    26772677
    2678 #: includes/reminders/class-cr-manual.php:381
     2678#: includes/reminders/class-cr-manual.php:384
    26792679msgid "Copy a link to an aggregated review form for this order."
    26802680msgstr ""
    26812681
    2682 #: includes/reminders/class-cr-manual.php:382
     2682#: includes/reminders/class-cr-manual.php:385
    26832683msgid "Link"
    26842684msgstr ""
    26852685
    2686 #: includes/reminders/class-cr-manual.php:386
     2686#: includes/reminders/class-cr-manual.php:389
    26872687msgid "Copying..."
    26882688msgstr ""
    26892689
    2690 #: includes/reminders/class-cr-manual.php:394
     2690#: includes/reminders/class-cr-manual.php:397
    26912691msgid "Copied"
    26922692msgstr ""
    26932693
    2694 #: includes/reminders/class-cr-manual.php:398
     2694#: includes/reminders/class-cr-manual.php:401
    26952695msgid "Has the customer provided a consent to receive a review invitation?"
    26962696msgstr ""
    26972697
    2698 #: includes/reminders/class-cr-manual.php:408
     2698#: includes/reminders/class-cr-manual.php:411
    26992699#: includes/settings/class-cr-admin-menu-settings.php:398
    27002700msgid "Send"
    27012701msgstr ""
    27022702
    2703 #: includes/reminders/class-cr-manual.php:421
     2703#: includes/reminders/class-cr-manual.php:424
    27042704msgid "Have you sent the review invitation?"
    27052705msgstr ""
    27062706
    2707 #: includes/reminders/class-cr-manual.php:429
     2707#: includes/reminders/class-cr-manual.php:432
    27082708#: includes/settings/class-cr-admin-menu-settings.php:151
    27092709msgid "Sending..."
    27102710msgstr ""
    27112711
    2712 #: includes/reminders/class-cr-manual.php:430
     2712#: includes/reminders/class-cr-manual.php:433
    27132713msgid "Syncing..."
    27142714msgstr ""
    27152715
    2716 #: includes/reminders/class-cr-manual.php:431
     2716#: includes/reminders/class-cr-manual.php:434
    27172717msgid "Error code 1"
    27182718msgstr ""
    27192719
    2720 #: includes/reminders/class-cr-manual.php:432
     2720#: includes/reminders/class-cr-manual.php:435
    27212721msgid "Error code 2 (%s)."
    27222722msgstr ""
    27232723
    2724 #: includes/reminders/class-cr-manual.php:433
     2724#: includes/reminders/class-cr-manual.php:436
    27252725msgid "Link to the aggregated review form copied. Paste it where you need it."
    27262726msgstr ""
    27272727
    2728 #: includes/reminders/class-cr-manual.php:487
    2729 #: includes/reminders/class-cr-manual.php:603
     2728#: includes/reminders/class-cr-manual.php:490
     2729#: includes/reminders/class-cr-manual.php:606
    27302730msgid "Error: a review reminder could not be sent because reviews(s) have already been collected via a local review form for this order."
    2731 msgstr ""
    2732 
    2733 #: includes/reminders/class-cr-manual.php:499
    2734 #: includes/reminders/class-cr-manual.php:539
    2735 msgid "Check that the customer's phone number %s is formatted correctly."
    2736 msgstr ""
    2737 
    2738 #: includes/reminders/class-cr-manual.php:500
    2739 #: includes/reminders/class-cr-manual.php:540
    2740 msgid "Examples"
    2741 msgstr ""
    2742 
    2743 #: includes/reminders/class-cr-manual.php:501
    2744 #: includes/reminders/class-cr-manual.php:541
    2745 msgid "Correct: %s"
    27462731msgstr ""
    27472732
    27482733#: includes/reminders/class-cr-manual.php:502
    27492734#: includes/reminders/class-cr-manual.php:542
     2735msgid "Check that the customer's phone number %s is formatted correctly."
     2736msgstr ""
     2737
     2738#: includes/reminders/class-cr-manual.php:503
     2739#: includes/reminders/class-cr-manual.php:543
     2740msgid "Examples"
     2741msgstr ""
     2742
     2743#: includes/reminders/class-cr-manual.php:504
     2744#: includes/reminders/class-cr-manual.php:544
     2745msgid "Correct: %s"
     2746msgstr ""
     2747
     2748#: includes/reminders/class-cr-manual.php:505
     2749#: includes/reminders/class-cr-manual.php:545
    27502750msgid "Incorrect: %s"
    27512751msgstr ""
    27522752
    2753 #: includes/reminders/class-cr-manual.php:627
     2753#: includes/reminders/class-cr-manual.php:630
    27542754msgid "CR: a review reminder was triggered manually via WhatsApp."
    27552755msgstr ""
    27562756
    2757 #: includes/reminders/class-cr-manual.php:644
     2757#: includes/reminders/class-cr-manual.php:647
    27582758msgid "A review reminder has been successfully sent via WhatsApp."
    27592759msgstr ""
    27602760
    2761 #: includes/reminders/class-cr-manual.php:706
     2761#: includes/reminders/class-cr-manual.php:709
    27622762msgid "CR: a review reminder was sent via WhatsApp manually."
    27632763msgstr ""
    27642764
    2765 #: includes/reminders/class-cr-manual.php:764
     2765#: includes/reminders/class-cr-manual.php:767
    27662766msgid "Error: links to aggregated review forms can be copied only with the self-hosted setting."
    27672767msgstr ""
    27682768
    2769 #: includes/reminders/class-cr-manual.php:781
     2769#: includes/reminders/class-cr-manual.php:784
    27702770msgid "Error: a link to an aggregated review form cannot be copied because reviews(s) have already been collected with a CusRev mailer for this order."
    27712771msgstr ""
    27722772
    2773 #: includes/reminders/class-cr-manual.php:799
     2773#: includes/reminders/class-cr-manual.php:802
    27742774msgid "CR: a link to an aggregated review form was copied manually."
    27752775msgstr ""
    27762776
    2777 #: includes/reminders/class-cr-manual.php:813
     2777#: includes/reminders/class-cr-manual.php:816
    27782778msgid "Error: could not copy a link to an aggregated review form"
    27792779msgstr ""
    27802780
    2781 #: includes/reminders/class-cr-manual.php:821
     2781#: includes/reminders/class-cr-manual.php:824
    27822782msgid "Error: order ID is missing"
    27832783msgstr ""
     
    30113011#: templates/cr-review.php:119
    30123012#: templates/reviews-grid.php:131
     3013#: templates/reviews-grid.php:253
    30133014#: templates/reviews-slider.php:48
    30143015msgid "Reviewer"
     
    30193020#: includes/reviews/class-cr-reviews-list-table.php:1245
    30203021#: templates/cr-review.php:104
     3022#: templates/reviews-grid.php:249
    30213023msgid "Store manager"
    30223024msgstr ""
     
    30953097#: blocks/build/reviews-slider/index.js:12
    30963098#: blocks/src/editor-components/review-tag-control/index.js:106
    3097 #: blocks/src/reviews-grid/edit.js:231
     3099#: blocks/src/reviews-grid/edit.js:237
    30983100#: blocks/src/reviews-slider/edit.js:205
    30993101msgid "Tags"
     
    37113713#: blocks/build/reviews-grid/index.js:12
    37123714#: blocks/build/reviews-slider/index.js:12
    3713 #: blocks/src/reviews-grid/edit.js:207
     3715#: blocks/src/reviews-grid/edit.js:213
    37143716#: blocks/src/reviews-slider/edit.js:181
    37153717msgid "Products"
     
    43944396#: blocks/build/reviews-grid/index.js:12
    43954397#: blocks/build/reviews-slider/index.js:12
    4396 #: blocks/src/reviews-grid/edit.js:286
     4398#: blocks/src/reviews-grid/edit.js:292
    43974399#: blocks/src/reviews-slider/edit.js:260
    43984400msgid "Stars"
     
    48204822#: blocks/build/reviews-grid/index.js:12
    48214823#: blocks/build/reviews-slider/index.js:12
    4822 #: blocks/src/reviews-grid/edit.js:156
     4824#: blocks/src/reviews-grid/edit.js:162
    48234825#: blocks/src/reviews-slider/edit.js:137
    48244826msgid "Standard"
     
    48284830#: blocks/build/reviews-grid/index.js:12
    48294831#: blocks/build/reviews-slider/index.js:12
    4830 #: blocks/src/reviews-grid/edit.js:155
     4832#: blocks/src/reviews-grid/edit.js:161
    48314833#: blocks/src/reviews-slider/edit.js:136
    48324834msgid "Initials"
     
    54035405#: includes/settings/class-cr-settings-shortcodes.php:82
    54045406#: includes/settings/class-cr-settings-shortcodes.php:121
    5405 #: includes/settings/class-cr-settings-shortcodes.php:154
    5406 #: includes/settings/class-cr-settings-shortcodes.php:186
    5407 #: includes/settings/class-cr-settings-shortcodes.php:195
     5407#: includes/settings/class-cr-settings-shortcodes.php:164
     5408#: includes/settings/class-cr-settings-shortcodes.php:196
     5409#: includes/settings/class-cr-settings-shortcodes.php:205
    54085410msgid "Parameters:"
    54095411msgstr ""
     
    54365438#: includes/settings/class-cr-settings-shortcodes.php:90
    54375439#: includes/settings/class-cr-settings-shortcodes.php:128
    5438 #: includes/settings/class-cr-settings-shortcodes.php:162
     5440#: includes/settings/class-cr-settings-shortcodes.php:172
    54395441msgid "%1$s argument accepts a comma-separated list of <a href=\"%2$s\">product categories IDs</a> to show only reviews corresponding to specified categories of products."
    54405442msgstr ""
     
    54425444#: includes/settings/class-cr-settings-shortcodes.php:91
    54435445#: includes/settings/class-cr-settings-shortcodes.php:129
    5444 #: includes/settings/class-cr-settings-shortcodes.php:163
     5446#: includes/settings/class-cr-settings-shortcodes.php:173
    54455447msgid "%1$s argument accepts a comma-separated list of <a href=\"%2$s\">product tags</a>. Use this argument to show reviews from products associated with specific tags only."
    54465448msgstr ""
     
    54485450#: includes/settings/class-cr-settings-shortcodes.php:92
    54495451#: includes/settings/class-cr-settings-shortcodes.php:130
    5450 #: includes/settings/class-cr-settings-shortcodes.php:164
     5452#: includes/settings/class-cr-settings-shortcodes.php:174
    54515453msgid "%1$s argument accepts a comma-separated list of <a href=\"%2$s\">review tags</a>. Use this argument to show reviews associated with specific tags only."
    54525454msgstr ""
     
    54545456#: includes/settings/class-cr-settings-shortcodes.php:93
    54555457#: includes/settings/class-cr-settings-shortcodes.php:131
    5456 #: includes/settings/class-cr-settings-shortcodes.php:165
     5458#: includes/settings/class-cr-settings-shortcodes.php:175
    54575459msgid "%1$s parameter accepts %2$s or a comma-separated list of <a href=\"%3$s\">product IDs</a>. Use this parameter to show reviews of the current product only or reviews corresponding to product IDs from the comma-separated list. If you provide an empty list of product IDs like %4$s, the shortcode will display reviews of all products."
    54585460msgstr ""
     
    54645466#: includes/settings/class-cr-settings-shortcodes.php:95
    54655467#: includes/settings/class-cr-settings-shortcodes.php:138
    5466 #: includes/settings/class-cr-settings-shortcodes.php:172
     5468#: includes/settings/class-cr-settings-shortcodes.php:182
    54675469msgid "%1$s argument accepts %2$s or %3$s and specifies if general shop reviews will be shown."
    54685470msgstr ""
     
    54705472#: includes/settings/class-cr-settings-shortcodes.php:96
    54715473#: includes/settings/class-cr-settings-shortcodes.php:140
    5472 #: includes/settings/class-cr-settings-shortcodes.php:174
     5474#: includes/settings/class-cr-settings-shortcodes.php:184
    54735475msgid "%1$s argument accepts %2$s or %3$s and specifies if reviews corresponding to unpublished products will be shown."
    54745476msgstr ""
     
    54845486#: includes/settings/class-cr-settings-shortcodes.php:99
    54855487#: includes/settings/class-cr-settings-shortcodes.php:144
    5486 #: includes/settings/class-cr-settings-shortcodes.php:178
     5488#: includes/settings/class-cr-settings-shortcodes.php:188
    54875489msgid "%1$s argument defines the minimum number of characters that a review must have to be displayed. If this argument is %2$s, then all reviews (including rating-only reviews) will be displayed."
    54885490msgstr ""
     
    54905492#: includes/settings/class-cr-settings-shortcodes.php:100
    54915493#: includes/settings/class-cr-settings-shortcodes.php:141
    5492 #: includes/settings/class-cr-settings-shortcodes.php:176
     5494#: includes/settings/class-cr-settings-shortcodes.php:186
    54935495msgid "%1$s argument accepts %2$s, %3$s or %4$s and defines how avatars of customers will be displayed on reviews."
    54945496msgstr ""
     
    55165518
    55175519#: includes/settings/class-cr-settings-shortcodes.php:124
    5518 #: includes/settings/class-cr-settings-shortcodes.php:158
     5520#: includes/settings/class-cr-settings-shortcodes.php:168
    55195521msgid "%1$s argument accepts %2$s or %3$s and defines if pictures and names of products corresponding to the review will be shown below the review."
    55205522msgstr ""
    55215523
    55225524#: includes/settings/class-cr-settings-shortcodes.php:125
    5523 #: includes/settings/class-cr-settings-shortcodes.php:159
     5525#: includes/settings/class-cr-settings-shortcodes.php:169
    55245526msgid "%1$s argument accepts %2$s or %3$s and defines if product names will include links to product pages."
    55255527msgstr ""
     
    55305532
    55315533#: includes/settings/class-cr-settings-shortcodes.php:127
    5532 #: includes/settings/class-cr-settings-shortcodes.php:161
     5534#: includes/settings/class-cr-settings-shortcodes.php:171
    55335535msgid "%1$s argument defines how reviews are sorted. Possible values are %2$s, %3$s and %4$s."
    55345536msgstr ""
     
    55395541
    55405542#: includes/settings/class-cr-settings-shortcodes.php:133
    5541 #: includes/settings/class-cr-settings-shortcodes.php:167
     5543#: includes/settings/class-cr-settings-shortcodes.php:177
    55425544msgid "%1$s argument is a hex color code of the border around review cards."
    55435545msgstr ""
     
    55485550
    55495551#: includes/settings/class-cr-settings-shortcodes.php:135
    5550 #: includes/settings/class-cr-settings-shortcodes.php:169
     5552#: includes/settings/class-cr-settings-shortcodes.php:179
    55515553msgid "%1$s argument is a hex color code of the background of review cards."
    55525554msgstr ""
    55535555
    55545556#: includes/settings/class-cr-settings-shortcodes.php:136
    5555 #: includes/settings/class-cr-settings-shortcodes.php:170
     5557#: includes/settings/class-cr-settings-shortcodes.php:180
    55565558msgid "%1$s argument is a hex color code of the background color of product areas on review cards."
    55575559msgstr ""
    55585560
    55595561#: includes/settings/class-cr-settings-shortcodes.php:137
    5560 #: includes/settings/class-cr-settings-shortcodes.php:171
     5562#: includes/settings/class-cr-settings-shortcodes.php:181
    55615563msgid "%1$s argument is a hex color code of rating stars on review cards."
    55625564msgstr ""
    55635565
    55645566#: includes/settings/class-cr-settings-shortcodes.php:139
    5565 #: includes/settings/class-cr-settings-shortcodes.php:173
     5567#: includes/settings/class-cr-settings-shortcodes.php:183
    55665568msgid "%1$s argument defines the total number of shop reviews to show. It is recommended to keep it between %2$s and %3$s."
    55675569msgstr ""
     
    55725574
    55735575#: includes/settings/class-cr-settings-shortcodes.php:143
    5574 #: includes/settings/class-cr-settings-shortcodes.php:177
     5576#: includes/settings/class-cr-settings-shortcodes.php:187
    55755577msgid "%1$s argument limits the number of characters that are displayed by default for each review. A 'Show More' button will be added to display the remaining content for reviews that exceed this limit. If you do not want to limit the number of characters to display, set this argument to %2$s."
    55765578msgstr ""
    55775579
    55785580#: includes/settings/class-cr-settings-shortcodes.php:148
     5581msgid "%1$s parameter accepts %2$s or %3$s and controls if %4$s structured data should be created for search engines. To comply with schema markup guidelines, this parameter takes effect only when the shortcode displays reviews for a single product, that is, when parameter %5$s is %3$s and parameter %6$s is set to either %7$s or a single product ID."
     5582msgstr ""
     5583
     5584#: includes/settings/class-cr-settings-shortcodes.php:158
    55795585msgid "%1$s shortcode is also available as <strong>Reviews Grid</strong> block in the new WordPress Gutenberg page editor (blocks require WordPress 5.0 or newer)."
    55805586msgstr ""
    55815587
    5582 #: includes/settings/class-cr-settings-shortcodes.php:151
     5588#: includes/settings/class-cr-settings-shortcodes.php:161
    55835589msgid "Use this shortcode to display a slider with reviews on any page or post. Here are the default parameters of the shortcode:"
    55845590msgstr ""
    55855591
    5586 #: includes/settings/class-cr-settings-shortcodes.php:156
     5592#: includes/settings/class-cr-settings-shortcodes.php:166
    55875593msgid "%1$s argument defines the number of product reviews to show. It is recommended to keep it between %2$s and %3$s. If you do not want to show product reviews, set it to %4$s and enable shop reviews (see the parameters below)."
    55885594msgstr ""
    55895595
    5590 #: includes/settings/class-cr-settings-shortcodes.php:157
     5596#: includes/settings/class-cr-settings-shortcodes.php:167
    55915597msgid "%1$s argument defines the number of slides to show. It is recommended to keep it between %2$s and %3$s."
    55925598msgstr ""
    55935599
    5594 #: includes/settings/class-cr-settings-shortcodes.php:160
     5600#: includes/settings/class-cr-settings-shortcodes.php:170
    55955601msgid "%1$s argument accepts %2$s to sort reviews by date and %3$s to sort reviews by rating."
    55965602msgstr ""
    55975603
    5598 #: includes/settings/class-cr-settings-shortcodes.php:166
     5604#: includes/settings/class-cr-settings-shortcodes.php:176
    55995605msgid "%1$s argument is a hex color code of the external border around the slider."
    56005606msgstr ""
    56015607
    5602 #: includes/settings/class-cr-settings-shortcodes.php:168
     5608#: includes/settings/class-cr-settings-shortcodes.php:178
    56035609msgid "%1$s argument is a hex color code of the external background of the slider."
    56045610msgstr ""
    56055611
    5606 #: includes/settings/class-cr-settings-shortcodes.php:175
     5612#: includes/settings/class-cr-settings-shortcodes.php:185
    56075613msgid "%1$s argument accepts %2$s or %3$s and defines if the slider will slide automatically."
    56085614msgstr ""
    56095615
    5610 #: includes/settings/class-cr-settings-shortcodes.php:179
     5616#: includes/settings/class-cr-settings-shortcodes.php:189
    56115617msgid "%1$s argument accepts %2$s or %3$s and specifies if dot indicators will be shown."
    56125618msgstr ""
    56135619
    5614 #: includes/settings/class-cr-settings-shortcodes.php:181
     5620#: includes/settings/class-cr-settings-shortcodes.php:191
    56155621msgid "%1$s shortcode is also available as <strong>Reviews Slider</strong> block in the new WordPress Gutenberg page editor (blocks require WordPress 5.0 or newer)."
    56165622msgstr ""
    56175623
    5618 #: includes/settings/class-cr-settings-shortcodes.php:184
     5624#: includes/settings/class-cr-settings-shortcodes.php:194
    56195625msgid "Use this shortcode to display a widget with rating stars on any single WooCommerce product page. Here are the default parameters of the shortcode:"
    56205626msgstr ""
    56215627
    5622 #: includes/settings/class-cr-settings-shortcodes.php:188
     5628#: includes/settings/class-cr-settings-shortcodes.php:198
    56235629msgid "%1$s parameter is a hex color code of rating stars."
    56245630msgstr ""
    56255631
    5626 #: includes/settings/class-cr-settings-shortcodes.php:189
     5632#: includes/settings/class-cr-settings-shortcodes.php:199
    56275633msgid "%1$s parameter accepts a product ID. Use this parameter to show rating stars of a specific product. If you provide an empty parameter like %2$s and place the shortcode on a WooCommerce product page, it will display a rating of that product."
    56285634msgstr ""
    56295635
    5630 #: includes/settings/class-cr-settings-shortcodes.php:193
     5636#: includes/settings/class-cr-settings-shortcodes.php:203
    56315637msgid "Use this shortcode to display a block with Questions and Answers on any page or post. Here are the default parameters of the shortcode:"
    56325638msgstr ""
    56335639
    5634 #: includes/settings/class-cr-settings-shortcodes.php:197
     5640#: includes/settings/class-cr-settings-shortcodes.php:207
    56355641msgid "%1$s parameter accepts a comma-separated list of product IDs or %2$s. If product IDs are provided, the block will display Q & A linked to the corresponding products. If the parameter is equal to %3$s, the block will display Q & A for all products in the store."
    56365642msgstr ""
    56375643
    5638 #: includes/settings/class-cr-settings-shortcodes.php:198
     5644#: includes/settings/class-cr-settings-shortcodes.php:208
    56395645msgid "%1$s parameter accepts a comma-separated list of non-product pages (e.g., regular WordPress pages or posts) or %2$s. If non-product page IDs are provided, the block will display Q & A linked to the corresponding non-product pages. If the parameter is equal to %3$s, the block will display Q & A for all non-product pages in the store."
    56405646msgstr ""
     
    63766382
    63776383#: templates/reviews-grid.php:166
     6384#: templates/reviews-grid.php:272
    63786385#: templates/reviews-slider.php:87
    63796386#: blocks/build/reviews-grid/index.js:12
     
    63836390
    63846391#: templates/reviews-grid.php:167
     6392#: templates/reviews-grid.php:273
    63856393#: templates/reviews-slider.php:88
    63866394msgid "Show Less"
     
    63926400msgid "%s ago"
    63936401msgstr ""
     6402
     6403#: templates/reviews-grid.php:212
     6404msgid "Reply"
     6405msgid_plural "Replies"
     6406msgstr[0] ""
     6407msgstr[1] ""
    63946408
    63956409#: admin/build/index.js:1
     
    66096623
    66106624#: blocks/build/reviews-grid/index.js:12
     6625#: blocks/src/reviews-grid/edit.js:152
     6626msgid "Schema Markup"
     6627msgstr ""
     6628
     6629#: blocks/build/reviews-grid/index.js:12
    66116630#: blocks/build/reviews-slider/index.js:12
    6612 #: blocks/src/reviews-grid/edit.js:152
     6631#: blocks/src/reviews-grid/edit.js:158
    66136632#: blocks/src/reviews-slider/edit.js:133
    66146633msgid "Avatars"
     
    66176636#: blocks/build/reviews-grid/index.js:12
    66186637#: blocks/build/reviews-slider/index.js:12
    6619 #: blocks/src/reviews-grid/edit.js:157
     6638#: blocks/src/reviews-grid/edit.js:163
    66206639#: blocks/src/reviews-slider/edit.js:138
    66216640msgid "No avatars"
     
    66246643#: blocks/build/reviews-grid/index.js:12
    66256644#: blocks/build/reviews-slider/index.js:12
    6626 #: blocks/src/reviews-grid/edit.js:166
     6645#: blocks/src/reviews-grid/edit.js:172
    66276646#: blocks/src/reviews-slider/edit.js:145
    66286647msgid "Sort By"
     
    66316650#: blocks/build/reviews-grid/index.js:12
    66326651#: blocks/build/reviews-slider/index.js:12
    6633 #: blocks/src/reviews-grid/edit.js:169
     6652#: blocks/src/reviews-grid/edit.js:175
    66346653#: blocks/src/reviews-slider/edit.js:148
    66356654msgid "Date"
     
    66376656
    66386657#: blocks/build/reviews-grid/index.js:12
    6639 #: blocks/src/reviews-grid/edit.js:171
     6658#: blocks/src/reviews-grid/edit.js:177
    66406659msgid "Media"
    66416660msgstr ""
     
    66436662#: blocks/build/reviews-grid/index.js:12
    66446663#: blocks/build/reviews-slider/index.js:12
    6645 #: blocks/src/reviews-grid/edit.js:180
     6664#: blocks/src/reviews-grid/edit.js:186
    66466665#: blocks/src/reviews-slider/edit.js:156
    66476666msgid "Sort Order"
     
    66506669#: blocks/build/reviews-grid/index.js:12
    66516670#: blocks/build/reviews-slider/index.js:12
    6652 #: blocks/src/reviews-grid/edit.js:183
     6671#: blocks/src/reviews-grid/edit.js:189
    66536672#: blocks/src/reviews-slider/edit.js:159
    66546673msgid "Ascending"
     
    66576676#: blocks/build/reviews-grid/index.js:12
    66586677#: blocks/build/reviews-slider/index.js:12
    6659 #: blocks/src/reviews-grid/edit.js:184
     6678#: blocks/src/reviews-grid/edit.js:190
    66606679#: blocks/src/reviews-slider/edit.js:160
    66616680msgid "Descending"
     
    66646683#: blocks/build/reviews-grid/index.js:12
    66656684#: blocks/build/reviews-slider/index.js:12
    6666 #: blocks/src/reviews-grid/edit.js:185
     6685#: blocks/src/reviews-grid/edit.js:191
    66676686#: blocks/src/reviews-slider/edit.js:161
    66686687msgid "Random"
     
    66716690#: blocks/build/reviews-grid/index.js:12
    66726691#: blocks/build/reviews-slider/index.js:12
    6673 #: blocks/src/reviews-grid/edit.js:196
     6692#: blocks/src/reviews-grid/edit.js:202
    66746693#: blocks/src/reviews-slider/edit.js:170
    66756694msgid "Select which product categories to show reviews for."
     
    66786697#: blocks/build/reviews-grid/index.js:12
    66796698#: blocks/build/reviews-slider/index.js:12
    6680 #: blocks/src/reviews-grid/edit.js:209
     6699#: blocks/src/reviews-grid/edit.js:215
    66816700#: blocks/src/reviews-slider/edit.js:183
    66826701msgid "Select which products to show reviews for."
     
    66856704#: blocks/build/reviews-grid/index.js:12
    66866705#: blocks/build/reviews-slider/index.js:12
    6687 #: blocks/src/reviews-grid/edit.js:219
     6706#: blocks/src/reviews-grid/edit.js:225
    66886707#: blocks/src/reviews-slider/edit.js:193
    66896708msgid "Product Tags"
     
    66926711#: blocks/build/reviews-grid/index.js:12
    66936712#: blocks/build/reviews-slider/index.js:12
    6694 #: blocks/src/reviews-grid/edit.js:221
     6713#: blocks/src/reviews-grid/edit.js:227
    66956714#: blocks/src/reviews-slider/edit.js:195
    66966715msgid "Select which product tags to show reviews for."
     
    66996718#: blocks/build/reviews-grid/index.js:12
    67006719#: blocks/build/reviews-slider/index.js:12
    6701 #: blocks/src/reviews-grid/edit.js:233
     6720#: blocks/src/reviews-grid/edit.js:239
    67026721#: blocks/src/reviews-slider/edit.js:207
    67036722msgid "Select which tags to show reviews for."
     
    67066725#: blocks/build/reviews-grid/index.js:12
    67076726#: blocks/build/reviews-slider/index.js:12
    6708 #: blocks/src/reviews-grid/edit.js:243
     6727#: blocks/src/reviews-grid/edit.js:249
    67096728#: blocks/src/reviews-slider/edit.js:217
    67106729msgid "Colors"
     
    67136732#: blocks/build/reviews-grid/index.js:12
    67146733#: blocks/build/reviews-slider/index.js:12
    6715 #: blocks/src/reviews-grid/edit.js:246
     6734#: blocks/src/reviews-grid/edit.js:252
    67166735#: blocks/src/reviews-slider/edit.js:220
    67176736msgid "External Border"
     
    67206739#: blocks/build/reviews-grid/index.js:12
    67216740#: blocks/build/reviews-slider/index.js:12
    6722 #: blocks/src/reviews-grid/edit.js:254
     6741#: blocks/src/reviews-grid/edit.js:260
    67236742#: blocks/src/reviews-slider/edit.js:228
    67246743msgid "Review Card Border"
     
    67276746#: blocks/build/reviews-grid/index.js:12
    67286747#: blocks/build/reviews-slider/index.js:12
    6729 #: blocks/src/reviews-grid/edit.js:262
     6748#: blocks/src/reviews-grid/edit.js:268
    67306749#: blocks/src/reviews-slider/edit.js:236
    67316750msgid "Background"
     
    67346753#: blocks/build/reviews-grid/index.js:12
    67356754#: blocks/build/reviews-slider/index.js:12
    6736 #: blocks/src/reviews-grid/edit.js:270
     6755#: blocks/src/reviews-grid/edit.js:276
    67376756#: blocks/src/reviews-slider/edit.js:244
    67386757msgid "Review Card Background"
     
    67416760#: blocks/build/reviews-grid/index.js:12
    67426761#: blocks/build/reviews-slider/index.js:12
    6743 #: blocks/src/reviews-grid/edit.js:278
     6762#: blocks/src/reviews-grid/edit.js:284
    67446763#: blocks/src/reviews-slider/edit.js:252
    67456764msgid "Product Area Background"
  • customer-reviews-woocommerce/trunk/readme.txt

    r3406378 r3413656  
    33Tags: woocommerce, review plugin, review reminder, customer reviews, review for discount
    44Requires at least: 4.5
    5 Tested up to: 6.8
     5Tested up to: 6.9
    66Requires PHP: 7.2
    7 Stable tag: 5.91.0
     7Stable tag: 5.92.0
    88License: GPLv3 or later
    99License URI: https://www.gnu.org/licenses/gpl.html
     
    106106* Getting unique, user-generated SEO content for your shop - customer reviews often contain long tail keywords
    107107* Building user-generated content (UGC) such as photos and videos uploaded by your customers
     108* Embedding JSON-LD structured data for product reviews to help search engines better understand and display your review content
    108109* Enhancing rich snippets and structured data markup for reviews with pictures
    109110* Enhancing the standard WooCommerce structured data markup with product identifiers (GTIN, MPN, Brand)
     
    234235== Changelog ==
    235236
     237= 5.92.0 =
     238* New feature: 'schema_markup' parameter in [cusrev_reviews_grid] shortcode to create AggregateRating rich snippet
     239* Improvement: display replies to reviews in [cusrev_reviews_grid] shortcode
     240* Improvement: reduce database queries on WooCommerce Orders page when Review Reminder column is hidden
     241* Bug fix: JSON-LD structured data markup not properly detected due to a missing schema property
     242* Bug fix: product identifiers displayed on product pages despite being deactivated in the settings
    236243= 5.91.0 =
    237244* New feature: 'Review Schema Markup' option on the 'Review Extensions' tab of the plugin's settings to add schema markup when a theme or plugin prevents output of the standard WooCommerce schema markup
  • customer-reviews-woocommerce/trunk/templates/reviews-grid.php

    r3392565 r3413656  
    104104                    <div class="cr-review-card-content">
    105105                        <?php echo $customer_images_html; ?>
    106                         <div class="top-row">
     106                        <div class="top-row" style="<?php echo esc_attr( $cr_grid_hr_style ); ?>">
    107107                            <?php
    108108                            $avtr = get_avatar( $review, 56, '', esc_attr( $author ) );
     
    201201                            endif;
    202202                        endif;
     203                        // replies to reviews
     204                        if (
     205                            $cr_replies &&
     206                            isset( $cr_replies[$review->comment_ID] ) &&
     207                            is_array( $cr_replies[$review->comment_ID] ) &&
     208                            0 < count( $cr_replies[$review->comment_ID] )
     209                        ) :
     210                            $cr_reply_count = count( $cr_replies[$review->comment_ID] );
     211                            $cr_replies_label = sprintf(
     212                                _n( 'Reply', 'Replies', $cr_reply_count, 'customer-reviews-woocommerce' ),
     213                                $cr_reply_count
     214                            );
    203215                        ?>
    204                         <?php if ( $show_products && $product ):
     216                            <div class="cr-grid-replies-container">
     217                                <div class="cr-grid-replies">
     218                                    <div class="cr-grid-replies-line cr-grid-replies-line-left" style="<?php echo esc_attr( $cr_grid_hr_replies_style ); ?>"></div>
     219                                    <div class="cr-grid-replies-pill" style="<?php echo esc_attr( $cr_grid_replies_pill_style ); ?>">
     220                                        <span class="cr-grid-replies-pill-label"><?php echo esc_html( $cr_replies_label ); ?></span>
     221                                        <span class="cr-grid-replies-pill-count"><?php echo intval( $cr_reply_count ); ?></span>
     222                                    </div>
     223                                    <div class="cr-grid-replies-line cr-grid-replies-line-right" style="<?php echo esc_attr( $cr_grid_hr_replies_style ); ?>"></div>
     224                                </div>
     225                                <div class="cr-grid-first-reply">
     226                                    <div class="cr-grid-reply-top-row">
     227                                        <?php
     228                                        $cr_reply_author = get_comment_author( $cr_replies[$review->comment_ID][0] );
     229                                        $cr_reply_avtr = get_avatar( $cr_replies[$review->comment_ID][0], 40, '', esc_attr( $cr_reply_author ) );
     230                                        if ( $avatars && $cr_reply_avtr ): ?>
     231                                            <div class="cr-grid-reply-thumbnail">
     232                                                <?php echo $cr_reply_avtr; ?>
     233                                            </div>
     234                                        <?php endif; ?>
     235                                        <div class="cr-grid-reply-author">
     236                                            <div class="cr-grid-reply-author-name">
     237                                                <?php echo esc_html( $cr_reply_author ); ?>
     238                                            </div>
     239                                            <div class="cr-grid-reply-author-type">
     240                                                <?php
     241                                                if (
     242                                                    isset( $cr_replies[$review->comment_ID][0]->user_id ) &&
     243                                                    0 < $cr_replies[$review->comment_ID][0]->user_id &&
     244                                                    user_can( $cr_replies[$review->comment_ID][0]->user_id, 'manage_woocommerce' )
     245                                                ) {
     246                                                    echo esc_html(
     247                                                        apply_filters(
     248                                                            'cr_reviews_store_manager',
     249                                                            __( 'Store manager', 'customer-reviews-woocommerce' )
     250                                                        )
     251                                                    );
     252                                                } else {
     253                                                    echo esc_html__( 'Reviewer', 'customer-reviews-woocommerce' );
     254                                                }
     255                                                ?>
     256                                            </div>
     257                                        </div>
     258                                    </div>
     259                                    <div class="cr-grid-reply-middle-row">
     260                                        <div class="cr-grid-reply-content">
     261                                            <?php
     262                                                // compatibility with WPML / WCML plugins to translate replies
     263                                                if ( class_exists( 'WCML\Reviews\Translations\FrontEndHooks' ) ) {
     264                                                    if ( method_exists( 'WCML\Reviews\Translations\FrontEndHooks', 'translateReview' ) ) {
     265                                                        ( new WCML\Reviews\Translations\FrontEndHooks() )->translateReview( $cr_replies[$review->comment_ID][0] );
     266                                                    }
     267                                                }
     268                                                $cr_reply_clear_content = wp_strip_all_tags( $cr_replies[$review->comment_ID][0]->comment_content );
     269                                                if ( $max_chars && strlen( $cr_reply_clear_content ) > $max_chars ) {
     270                                                    $cr_reply_less_content = wp_kses_post( mb_substr( $cr_reply_clear_content, 0, $max_chars ) );
     271                                                    $cr_reply_more_content = wp_kses_post( mb_substr( $cr_reply_clear_content, $max_chars ) );
     272                                                    $cr_reply_read_more = '<span class="cr-grid-read-more">...<br><a href="#">' . esc_html__( 'Show More', 'customer-reviews-woocommerce' ) . '</a></span>';
     273                                                    $cr_reply_more_content = '<div class="cr-grid-details" style="display:none;">' . $cr_reply_more_content . '<br><span class="cr-grid-read-less"><a href="#">' . esc_html__( 'Show Less', 'customer-reviews-woocommerce' ) . '</a></span></div>';
     274                                                    $cr_reply_comment_content = $cr_reply_less_content . $cr_reply_read_more . $cr_reply_more_content;
     275                                                    echo $cr_reply_comment_content;
     276                                                } else {
     277                                                    echo wpautop( wp_kses_post( $cr_replies[$review->comment_ID][0]->comment_content ) );
     278                                                }
     279                                            ?>
     280                                        </div>
     281                                    </div>
     282                                </div>
     283                            </div>
     284                        <?php
     285                        endif;
     286                        if ( $show_products && $product ):
    205287                            if( 'publish' === $product->get_status() ):
    206288                                ?>
Note: See TracChangeset for help on using the changeset viewer.