Repository navigation
Releases: pixeler-sk/px-shop-core
Release list
v1.13.0
Antispam na formulároch odstúpenia a reklamácie vyžaduje px-wc-requests 1.10.0 (filter pxer_submit_check).
- Nový modul
seller– údaje predávajúceho zadané raz (obchodné meno,
sídlo, IČO, DIČ, IČ DPH, register, kontakt, orgán dozoru): shortcode
[px_seller]/[px_seller field="ico"],{px_seller}v e-mailoch
WooCommerce,PX_Seller::get(). - Nový modul
antispam(predvolene vypnutý) – Cloudflare Turnstile alebo
Google reCAPTCHA v2 na waitliste, registrácii, zabudnutom hesle,
recenziách a formulároch px-wc-requests (filterpxer_submit_check);
kľúče z wp-config.php alebo nastavení, bez kľúčov nerobí nič. - Waitlist posiela token antispamu (
antispam_tokenv REST). - Firemné údaje: povinné polia viditeľne povinné. Po zaškrtnutí „Nakupujem
na firmu" majú názov firmy a IČO hviezdičku,aria-requireda triedu
validate-requirednamiesto „(voliteľné)" (aj bez JS podľa uložených
alebo odoslaných údajov); chyby sú prepojené s poľom (data-id, text pod
poľom,woocommerce-invalid); IČO pri SK/CZ s numerickou klávesnicou. - Firemné údaje v Môj účet: kontrola formátu IČO/DIČ/IČ DPH pri uložení
fakturačnej adresy, IČO/DIČ/IČ DPH v prehľade adries. - Waitlist: texty formulára, hlásení a e-mailov jednotne vo vykaní (sk_SK).
- Waitlist variácií: udalosť
px-waitlist-toggle(detail.visible,
variationId,parentId) pri ukázaní a skrytí formulára — kontrakt pre
vlastný výber variácií v téme.
v1.12.0
- Waitlist: formulár na detail vypredaného produktu vkladá jadro samo —
téma ani site plugin ho už nemusia volať. Body
woocommerce_single_product_summary(31) pre štandardné šablóny
apxt_single_summary_end(5) pre px-shop-theme; presun alebo vypnutie
filtrompx_waitlist_form_hooks. Na jeden produkt a stránku sa vypíše
len raz, takže staršie vlastné volanierender_form()ho nezdvojí. - Waitlist pre vypredanú variáciu: variabilný produkt má formulár
skrytý, ukáže sa po výbere vypredanej kombinácie a prihlásenie ide na
ID variácie (e-maily nesú jej názov). Metabox produktu ukazuje
prihlásených aj po variáciách. - Omnibus: denný sken sa plánuje až na
init— zmizne notice
„_load_textdomain_just_in_time … woocommerce" po aktivácii.
v1.11.0
- Nový modul Médiá produktov pre MCP (
media_abilities, predvolene
vypnutý, WordPress 6.9+). Schopnosti Abilities API pre MCP konektor
(kategóriapx-shop-media):px-shop-core/get-product-images,
px-shop-core/set-product-images(hlavný obrázok a galéria z knižnice
médií alebo z URL so sideloadom, bez mazania príloh, zdroj v meta
_px_source_url) apx-shop-core/set-attachment-alt. Prenesené z benabu. - Slovenské preklady nových textov.
v1.10.0
- Video, odkaz celého bannera a karusel vyžadujú px-shop-theme >= 0.6.0
(handlespx-banner-videoapx-banner-carousel). So staršou témou sa
video nevykreslí (ostane obrázok) a skupina scarouselostane obyčajnými
bannermi pod sebou. - Content — video na pozadí bannera. Box Banner display má nové polia:
video z YouTube/Vimeo (odkaz v akomkoľvek tvare — watch?v=, youtu.be,
embed/, shorts/, s parametrami ako?si=; Vimeo aj neverejné s hashom)
alebo súbor MP4/WebM z knižnice médií (súbor má prednosť), a voľbu
Prehrávať aj na mobile. Meta_px_banner_video_url,
_px_banner_video_id,_px_banner_video_mobile(REST, sanitizácia,
can_edit). Do HTML nejde iframe — len wrapper sdata-px-banner-video
(pri súbore<video preload="none">), prehrávač stavia téma (handle
px-banner-video, plugin ho vyžiada len pri banneri s videom). Wrapper
jeinert. YouTube/Vimeo čaká na súhlas: modul Súhlas s cookies, ak je
aktívny (data-px-consent-cmp="px", služba + kategória), inak CookieYes
(cookieyes, kategóriaadvertisement), keď je nájdený plugin
cookie-law-info alebo to web povie filtrompx_content_video_cmp
(CookieYes z GTM); kategóriu menípx_content_video_cmp_category,
celý výsledokpx_content_video_consent. Obrázok bannera ostáva posterom a
LCP prvkom;eagerpridávafetchpriority="high", nový argument
image_sizesnastaví atribútsizes. - Content — odkaz celého bannera (
_px_banner_link_url): nadpis sa
stane odkazom, téma ho roztiahne cez celý banner (stretched link);
tlačidlá ostávajú funkčné, žiadne vnorené<a>. Banner bez nadpisu
dostane prázdny odkaz saria-label(parts/banner-link.php). - Nové
supportskľúčevideo(media-right, media-left, background)
alink(všetky štyri layouty); nepodporované polia sa v admine skryjú. - Content — karusel.
render_group()/[px_banner carousel="1"]:
skupina s viac než jednou položkou dostane Swiper markup
(.px-banners--carousel.swiper>.swiper-wrapper>.swiper-slide)
s ovládaním (šípky, bodky, pauza prezentácie aj videa — skryté do štartu
JS) a vyžiada handlepx-banner-carousel. Texty filtrompx_content_carousel_labels,
argumentylabelagroup_class. heading_tagh1 dostane v skupine len prvý banner (ostatné h2).eager
afetchprioritymá len prvý banner skupiny; v karuseli je druhý slide
eagerbez priority (prvý prechod neukáže prázdny banner). Nový argument
priority. Filterpx_content_carousel_labelssa zlučuje s predvolenými
textami. Vimeo odkazy/video(s)/IDmajú prednosť pred prvým číselným
segmentom. Prázdny odkaz bannera bez nadpisu nesie názov z nadtitulku
alebo perexu.- Nový modul Staré slugy termov (
old_term_slugs, predvolene zapnutý,
nezávisí od WooCommerce). Pri zmene slugu termu verejnej taxonómie
(admin, REST, WP-CLI) sa predchádzajúci slug uloží do term meta
_px_old_slug; stará URL, ktorá skončí 404, dostane 301 na aktuálnu
(get_term_link()) so zachovaním/page/N/aj query stringu. Funguje aj
po zmene slugu rodiča (podkategórie). Nejednoznačná zhoda nechá 404.
Seedpx_add_old_term_slug( $term_id, $slug ), zoznam s odstránením
v úprave termu, filtrepx_old_term_slugs_taxonomies,
px_old_term_slugs_redirect. - Slovenské preklady nových textov.
v1.9.1
- Oprava: názvy a popisy modulov sa už neprekladajú pri načítaní registra
naplugins_loaded, ale až na obrazovke nastavení (nová funkcia
px_shop_core_module_labels()a filterpx_shop_core_module_labels).
WordPress 6.7+ hlásil_load_textdomain_just_in_timepre doménu
px-shop-core. Modul pridaný site pluginom cez filter
px_shop_core_modulesmôžetitle/descniesť ďalej v definícii —
obrazovka nastavení ich vezme ako náhradu.
v1.9.0
- Nový modul Jednotková cena (
unit_price): cena za 1 kg / 1 l / 1 m /
1 ks vedľa predajnej ceny, ako to vyžaduje označovanie cenami (smernica
98/6/ES, zákon 108/2024 § 2 písm. h) a § 6). Na produkte (aj variácii) sa pod
cenou vypĺňa obsah balenia — množstvo a jednotka (ml, l, g, kg, m, m², m³,
ks); jednotková cena sa počíta z ceny, ktorú obchod zobrazuje (aktívna,
akciová, s daňou alebo bez podľa nastavenia). Zákonné výnimky drží modul
sám: nekreslí sa, keď by sa rovnala predajnej cene (1 ks, presne 1 l) a pri
baleniach do 50 g / 50 ml. Bez údaja sa nekreslí nič, takže zapnutý modul
existujúci web nemení. Predvolený výstup pod cenou v archíve a na detaile
sa vypína filtrompx_unit_price_display(téma si riadok kreslí sama cez
PX_Unit_Price::get_html()); variácia nesiepx_unit_price_html; live
search vraciaunit_price. WP-CLIwp px unit-price set|clear|list.
Import cez WooCommerce CSV: stĺpceMeta: _px_unit_qtyaMeta: _px_unit.
v1.7.0
-
Live search: vyhľadávanie podľa SKU a EAN/GTIN — v šepkávači aj na
štandardnej stránke výsledkov (?s=…&post_type=product). WordPress prehľadáva
len názov, perex a obsah, takže nalepený kód dielu alebo pípnutý čiarový kód
dovtedy nevrátil nič — jediný prípad, keď zákazník aj personál presne vedia,
čo chcú. Zhoda variácie sa mapuje na rodiča (variácia nemá vlastnú stránku
a na krabici býva jej SKU). Presná zhoda potláča prefixové: keď kód nesie
konkrétny produkt, rodina s rovnakým začiatkom SKU je už len šum. Presná SKU
alebo EAN tak vráti jeden výsledok a pri jednom výsledku presmeruje
WooCommerce (wc_template_redirect()) rovno na produkt — ale len keď je
v URLpost_type=product, teda z formulára v hlavičke. -
Live search: SKU sa okrem presnej zhody hľadá aj podľa predpony, ale až
od štyroch znakov, aby „RAM" neťahalo pol katalógu. Prefixové zhody sa radia
podľa dĺžky SKU, takže keď ich je viac než strop, prežije to najbližšie
napísanému — rez nesmie padnúť podľa ID produktu, päťdesiat najstarších
z päťsto neodpovedá na nič. EAN/GTIN len presne a len v tvare
GTIN-8/12/13/14. Dáta idú zwc_product_meta_lookup(riadok na produkt,
ten istý zdroj ako vyhľadávanie v administrácii WooCommerce), pričom SKU
a EAN sa pýtajú dvoma dotazmi: index má lensku, spoločnéORby oň
optimalizátor pripravil a každá číselná fráza by znamenala full scan. -
Live search: lookup je cache, ktorú WooCommerce prepisuje pri uložení
produktu, takže importér zapisujúci_skupriamo do postmeta ju vie nechať
pozadu. Správna oprava je WooCommerce → Stav → Nástroje → Obnoviť
vyhľadávacie tabuľky produktov. Dohľadanie priamo v postmeta (sken bez
indexu) v kóde ostáva, ale beží len pod WP-CLI — verejné vyhľadávacie pole
ho spúšťať nesmie, crawler s vymyslenými kódmi by ho vyvolal na každý
request. -
Live search: nové filtre
px_shop_core_search_code_ids( $ids, $term, $limit )(obchod s číslami dielov inde než v_skusi sem zapojí vlastný
zdroj) apx_shop_core_search_code_limit(50 — strop zhôd na kód pridaných
na stránku výsledkov). HelperPX_Search::product_ids_matching_code( $term, $limit )je verejný. Šepkávač nájdené produkty radí pred fulltextové
výsledky; viditeľnosť, sklad a stav produktu riešiWP_Query, takže sa
nefiltruje dvakrát. Na stránke výsledkov sa ID pripájajú do klauzuly
posts_search— a keď fragment nevyzerá presne tak, ako ho stavia jadro
(alebo v ňom po odtrhnutí ostane zmienka opost_password), filter dotaz
nechá na pokoji; polovične pochopený WHERE je presne to, čím sa vo
vyhľadávaní začnú objavovať koncepty. -
Live search: odpoveď šepkávača je 60 sekúnd v transiente a nesie
Cache-Control: public, max-age=60. Endpointpixeler/v1/searchje verejný
a bez rate limitu — každé písmeno v poli posielalo vlastnýWP_Query+
get_terms(), takže opakovaná fráza (aj cudzia) vedela zbytočne zaťažiť
databázu. Filterpx_shop_core_search_responsebeží aj nad cachovanými
dátami, aby si téma vedela dopísať jazykovo závislé popisky. -
Live search: kľúč cache nesie normalizovanú frázu (malé písmená, zúžené
medzery — „Prilba" a „prilba" je tá istá otázka), jazyk a všetko, od čoho
závisíprice_html: menu, nastavenie „ceny s daňou / bez dane" a oslobodenie
od DPH, ktoré prepína aj modul firemných údajov tohto pluginu. Inak by prvý
návštevník s iným daňovým kontextom otrávil ceny všetkým na 60 sekúnd.
Prihlásenému zákazníkovi sa necachuje vôbec a zapisuje sa len s perzistentnou
object cache — bez nej by každá neznáma fráza znamenala dva riadky vo
wp_optionsa crawler by ich narobil státisíce. Na webe bez object cache tak
serverová cache šepkávača nie je a zostáva len hlavičkaCache-Control, ktorá
opakované písmená zachytí v prehliadači a na CDN. Fráza je obmedzená na 64
znakov,viewAllostáva mimo cache (nesie pôvodné písanie návštevníka). -
Live search: nový filter
px_shop_core_search_query_args( $args, $term )
nad WP_Query argumentmi šepkávača. Web si tak vie preložiť časť frázy na
atribútový filter — „matrac 90x200" natax_querynadpa_rozmerplus
fulltext „matrac" — bez toho, aby plugin poznal názvy atribútov konkrétneho
e-shopu. Ak filter skráti$args['s'], vyhľadávanie kategórií použije
skrátenú frázu (a pri prázdnej ho preskočí), takže spotrebované tokeny
neprepadnú do zhody na názov kategórie.
v1.6.0
Nový modul Súhlas s cookies (consent), predvolene vypnutý — vlastná CMP
namiesto Complianzu:
- Register služieb je jediný zdroj pravdy. Jedna deklarácia v PHP (názov,
prevádzkovateľ, kategória, účel, odkaz na zásady, zoznam cookies, spôsob
blokovania) živí lištu, modál, stránku so zásadami aj blokovanie. Vstavaný
katalóg: GA4, Google Ads, Google Tag Manager, Meta Pixel, Microsoft Clarity,
Smartsupp, Heureka Overené zákazníkmi, YouTube, Google Maps, reCAPTCHA plus
vlastné cookies WordPressu, WooCommerce a PX Shop. Filter
px_consent_servicespridá službu site pluginu a tá dostane riadok v modále,
na podstránke aj blokovanie zadarmo. - Lišta v dvoch vrstvách. V prvej Prijať všetko / Odmietnuť všetko /
Nastavenia — rovnaké tlačidlá rovnakej váhy, žiadne predznačené políčka,
žiadna cookie wall a nič neblokuje obsah stránky. V druhej prepínače per
kategória aj per službu s účelom, prevádzkovateľom a tabuľkou cookies.
role="dialog", focus trap, ovládanie klávesnicou, Esc zatvára modál. - Súhlas žije v cookie
px_consent(verzia zásad, čas, ID súhlasu,
kategórie aj služby) s platnosťou 182 dní (px_consent_lifetime_days).
Zmena poľa Verzia zásad v nastaveniach = lišta sa spýta znova všetkých.
PHP cookie nikdy nečíta — výstup stránky je pre všetkých rovnaký a plnostránková
cache nemá čo pokaziť. - Blokovanie: skripty služieb idú do stránky ako
<script type="text/plain" data-px-consent="kategória" data-px-service="id">
a JS z nich po súhlase urobí skutočné skripty. Rovnaký kontrakt môže použiť
ktorýkoľvek ručne vložený skript tretej strany. Pri odvolaní sa zmažú cookies,
ktoré vieme podľa registra pomenovať, a stránka sa načíta znova — bežiaci
skript sa inak odinštalovať nedá. - Google (GA4, Ads, GTM) sa neblokuje, riadi sa signálmi.
consent default
so všetkýmdeniedide do<head>swait_for_update,consent update
chodí na vlastnú udalosťpx:consent(pokrýva prvý súhlas, návrat aj
odvolanie) a rovnaký stav sa tlačí dodataLayerako event
px_consent_update, na ktorý sa vie zavesiť GTM. Meta Pixel dostáva
fbq('consent', 'grant'/'revoke'). - Vložené videá a mapy sa nahradia zástupným boxom s tlačidlom; kliknutie
povolí len tú jednu službu, nie celý marketing. YouTube sa púšťa cez
youtube-nocookie.com. Bez JavaScriptu ostáva v stránke odkaz na pôvodný
obsah, takže sa nestratí ani pre čítačku, ani pre vyhľadávač. - Podstránka: shortcode
[px_cookie_policy]vypíše z registra tabuľky per
službu (účel, prevádzkovateľ, právny základ, cookies, odkaz na zásady).
Stránka s predvyplneným úvodom vznikne pri zapnutí modulu ako koncept —
právny text ide von až vtedy, keď si ho niekto prečíta. - Dva bannery sa nestretnú. Pri aktívnom Complianze, CookieYes, Cookiebote
a spol. sa modul sám nenačíta a v admine napíše prečo. Zapnutý modul zároveň
vypne mostconsent_mode— signály posiela sám. - Známy limit: bez certifikácie IAB TCF nestačí vlastná CMP pre AdSense ani
Ad Manager (Google to vyžaduje od 2024). Merania GA4 a konverzií v Google Ads
cez Consent Mode sa to netýka. - Vzhľad patrí téme: plugin nesie len layoutové CSS (fixná pozícia, skryté
stavy, prekrytie modálu). Šablóny sa prepisujú v téme
(yourtheme/px-shop-core/consent/*.php), texty filtrami
px_consent_banner_titleapx_consent_banner_text. - Odkaz „Nastavenia cookies" kdekoľvek v téme: stačí
data-px-consent-settings
na tlačidle, prípadnewindow.pxConsent.open(). Dostupnosť sa testuje
class_exists( 'PX_Consent' ) && PX_Consent::active()— trieda existuje aj
vtedy, keď modul cúvol pred externou CMP, a holý test by nakreslil tlačidlo,
ktoré nemá čo otvoriť. - Udalosť
px:consentnenesie ID súhlasu — len verziu zásad, kategórie
a služby. Identifikátor ostáva v cookie; cezdataLayera kontajner by z neho
bol stabilný identifikátor návštevníka, ktorý súhlas práve odmietol. - Vracajúci sa návštevník dostane
consent updateuž v<head>, hneď za
consent default— čakanie na skript v pätičke stálo prvépage_view.
Cookie sa tam číta rovnako prísne ako vconsent.js: čo nie je boolean alebo
nesie inú verziu zásad, nie je odpoveď, a pri viacerých cookies rovnakého
mena platí tá najprísnejšia. - Globálny
gtagvzniká len vtedy, keď modul naozaj načítava knižnicu Googlu.
Bez jediného ID ide do stránky lenconsent default— inak by cudzie pluginy
videlitypeof gtag === 'function'a knižnicu nenačítali. - Vložený obsah sa neobalí dvakrát: oEmbed prejde blokovaním pri rozbalení
a znova s celým obsahom príspevku, takže po kliknutí sa vkladalo vnútorné
zástupné okno namiesto videa. Mapy sa poznajú na ľubovoľnej doméne Googlu
(google.sk/maps) ayoutu.besa prepisuje na plnohodnotný
youtube-nocookie.com/embed/…. - Most
consent_modesa vypína sám (PX_Consent::loaded()), nezávisle od
poradia v registri modulov, a nastavenia napíšu skutočný dôvod namiesto
všeobecného „Overridden in code". - Modál pri otvorení dá zvyšok stránky
inert(fallbackaria-hidden), po
uložení voľby ide fokus na obsah stránky a po odblokovaní embedu na vzniknutý
rámček — tlačidlo, ktoré zmizlo, by inak zhodilo fokus na začiatok dokumentu.
Lišta jerole="region"s názvom, nie dialóg: nič neblokuje ani nedrží fokus. - Cookies sa pri odvolaní mažú aj na aktuálnej ceste a jej nadradených
segmentoch, nielen na/. - Register vypisuje len cookies, ktoré na webe naozaj vzniknú:
px_wishlist
apx_comparepodľa zapnutých modulov, reCAPTCHA sa zapína v nastaveniach
(v kategórii nevyhnutné, teda bez prepínača pre návštevníka) a pribudla
pxt_per_pagez témy.
v1.5.1
Firemné údaje — IČO sa vyžaduje len tam, kde ho firmy naozaj majú.
Pri zapnutej povinnosti IČO pokladňa odmietla každú zahraničnú firemnú
objednávku, teda presne toho zákazníka, pre ktorého je reverse charge —
írska či nemecká firma IČO nemá. Povinnosť teraz platí len v krajinách
s registrom, ktorý poznáme (SK, CZ); mení sa filtrom
px_company_country_has_ic.
v1.5.0
Nový modul Google Consent Mode v2 (consent_mode), predvolene vypnutý:
- Posiela Googlu signály súhlasu, ktoré free verzia Complianzu nevie — tá má
poleconsent-modenatvrdo zakázané, hoci runtime za ním žiadnu licenciu
nekontroluje. Complianz ostáva CMP (banner, kategórie, cookie lišta,
právne dokumenty), modul len prekladá jeho rozhodnutia do reči Googlu. - Bez neho web jazdí v režime „blokuj do súhlasu": Google nedostane od
neudelených súhlasov žiadny signál, takže nie je modelovanie konverzií a
Google Ads v EHP nepustí remarketingové publiká ani enhanced conversions. consent defaultso všetkýmdeniedide do<head>,consent update
na eventoch Complianzucmplz_fire_categoriesacmplz_revoke. Mapovanie:
preferences→personalization_storage,statistics→
analytics_storage,marketing→ad_storage,ad_user_data,
ad_personalization.- Complianzu sa filtrom nad
option_cmplz_optionsvypne vlastný GA snippet,
aby sa gtag nevydával dvakrát. Do DB sa nezapisuje — sprievodca Complianzu
vie hodnotu prepnúť späť. - Measurement ID sa číta z Complianzu (jeden zdroj pravdy, editovateľný
v admine), prebije ho filterpx_consent_mode_measurement_id. Ďalšie
filtre:px_consent_mode_wait_for_update(500 ms),
px_consent_mode_ads_data_redaction(true),
px_consent_mode_url_passthrough(false). - Súhlas sa zámerne nečíta na strane PHP — výstup je pre všetkých rovnaký,
takže je bezpečný voči page cache. - Zapnúť až vtedy, keď na webe nič iné nevydáva gtag (napr. vlastná
implementácia v site plugine alebo GA vkladaný Complianzom), inak sa
načíta dvakrát.
Firemné údaje (company_fields):
- Poradie polí podľa toho, ako človek rozmýšľa: meno a priezvisko, potom
políčko „Nakupujem na firmu" a až za ním firemný blok. Doteraz blok sedel
nad menom, čo pýtalo IČO skôr, než zákazník povedal, kto vlastne je.
Políčko je teraz normálne pole pokladne s prioritou, nie kus HTML nad
formulárom, takže sa zaraďuje samo. Neukladá sa — WooCommerce si necháva
len polia s predponoubilling_/shipping_. - Názov firmy je súčasťou bloku aj vtedy, keď je pole „Firma" vo
WooCommerce nastavené na skryté. Bez neho zostalo na faktúre IČO bez mena.
Vypne to filterpx_company_force_company_field. - Doplnenie z registra vyplní aj názov firmy a odškrtnutie políčka ho spolu
s číslami vyčistí — inak by firma zostala na faktúre súkromnej osobe. - SuperFaktúre sa vypne jej vlastný firemný blok. Má ho predvolene
zapnutý, len driemal, kým v pokladni nebolo pole „Firma" — teda presne to,
čo tento modul vracia. Inak by v pokladni boli dve políčka „nakupujem na
firmu", dve sady polí do rôznych meta kľúčov a dva pluginy rozhodujúce
o jednej DPH. SuperFaktúra to isté robí pre WC Nastavenia SK/CZ; údaje na
faktúru dostáva ďalej cezsf_client_data. - Z popisu políčka zmizlo „(voliteľné)" — pri zaškrtávacom políčku to znelo,
akoby existoval nákup na firmu, ktorý je povinný.