// Page Code for /checkout-link import { cart } from 'wix-stores'; import wixLocation from 'wix-location'; /** * Accepts `products` query parameter in Meta format: * - Encoded: products=112233%3A1%2C445566%3A2 * - Unencoded: products=112233:1,445566:2 (still works) * * Each entry is ID:QTY. Colons/commas may be RFC 3986-escaped. * Example final URL for Meta: * https://mysticalcrow.com/checkout-link?products=112233%3A1%2C445566%3A2 */ function parseProductsParam(rawParam) { if (!rawParam || typeof rawParam !== 'string') return []; // Try to decode once; if it throws or changes nothing, we still continue safely let decoded = rawParam; try { // decodeURIComponent will convert %3A -> ":", %2C -> "," decoded = decodeURIComponent(rawParam); } catch (_e) { // If decoding fails, we’ll proceed with the original string } // Split by commas (now that we normalized to ":" and ",") // Trim spaces just in case. return decoded .split(',') .map(s => s.trim()) .filter(Boolean) .map(pair => { const [id, qty] = pair.split(':').map(x => (x || '').trim()); const quantity = Number(qty); return (id && !Number.isNaN(quantity) && quantity > 0) ? { productId: id, quantity } : null; }) .filter(Boolean); } async function addAllToCart(items) { // Wix Stores cart.addProducts accepts an array of product objects. // We’ll add one by one to ensure each promise resolves, but you can batch if desired. for (const item of items) { // If a product has variants/options, you’ll need to pass the relevant // selection data here (e.g., options: [{ optionName, selection }]). // For simple products, productId + quantity is sufficient. await cart.addProducts([{ productId: item.productId, quantity: item.quantity }]); } } $w.onReady(async function () { const { products } = wixLocation.query; if (!products) { // No parameter present; go to cart so the user isn't stuck. wixLocation.to('/cart'); return; } const items = parseProductsParam(products); if (!items.length) { // Parameter present but invalid/empty after parsing wixLocation.to('/cart'); return; } try { await addAllToCart(items); // Success: go straight to checkout wixLocation.to('/checkout'); } catch (_err) { // If anything fails (bad ID, etc.), fall back to cart wixLocation.to('/cart'); } });
top of page

Nice Big Set

 

Practical Magic: An Oracle for Everyday Enchantment

Energize the purpose, knowledge, and potential within you to empower your heart and transform your tomorrows. This inspired collaboration is a rich compendium of fascination, insight, ritual, symbolism, and divination that you can action in your daily life for surprising and satisfying results. Beautiful artworks specially created to reflect the meaning and alchemy of each card. Step-by-step spellwork, visualizations, associations, and exercises for ushering in a charmed life. A comprehensive magical resource for creating sacred space, understanding moon phases, working with Nature’s cycles, influencing your future, and more. Journey into initiation and possibility, welcome adventure and reward, set nurturing boundaries, and shape your reality with the support of deities, herbs, crystals, color, the elements, and intention. Believe in your innate powers of creation and innovation, and charge your world with wonder—now and always. 

 

Practical Magic Deck and book set includes 36 cards, 304-page guidebook and a stand for displaying cards during meditations or altar work. Packaged in a deluxe wrap-around hardcover box with magnetic close.

 

 

Size Box measures 6” x 8” x 2.125”; 36 cards measure 3.74” x 5.47”; Card stand measures 3.74” x 5.47”

Practical Magic: An Oracle for Everyday Enchantment

SKU: 9781646711413
$36.00Price
Quantity
    bottom of page