diff --git a/README.md b/README.md index 0a6f37e..f86ee8c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,71 @@ -# fourth-wall-embed-wp +# Fourthwall Store Embed WordPress Plugin -A WordPress Plugin to embed a Fourthwall store or individual products with advanced caching and configuration options. +A WordPress plugin to embed Fourthwall Store products in your WordPress site. + +## Shortcodes + +### Display All Store Products +``` +[fourthwall] +``` +Displays all products from your Fourthwall store. + +### Display Single Product +``` +[fourthwall_single url="https://your-store.com/product-url" show_description="true"] +``` +Displays a single product with optional description. + +**Parameters:** +- `url` (required): The full URL of the product +- `show_description` (optional): Set to "true" to show product description + +### Display Random Products +``` +[fourthwall_random count="5"] +``` +Displays a random selection of products from your store. + +**Parameters:** +- `count` (optional): Number of products to display (default: 3) +- `urls` (optional): Comma-separated list of specific product URLs to randomize from +- `store_url` (optional): Custom store URL (uses default from settings if not provided) + +#### Examples: + +**Random 5 products from all store products:** +``` +[fourthwall_random count="5"] +``` + +**Random 3 products from specific URLs:** +``` +[fourthwall_random count="3" urls="https://store.com/product1,https://store.com/product2,https://store.com/product3"] +``` + +**Random 2 products from a different store:** +``` +[fourthwall_random count="2" store_url="https://different-store.com"] +``` + +## Installation + +1. Upload the plugin files to `/wp-content/plugins/fourth-wall-embed-wp/` +2. Activate the plugin through the 'Plugins' menu in WordPress +3. Go to Settings > Fourthwall Store Embed to configure your store URL + +## Configuration + +In the WordPress admin, go to Settings > Fourthwall Store Embed to set your Fourthwall store URL. + +## Features + +- Caches requests for better performance +- Responsive design +- SSL verification options +- Error handling for failed requests +- Random product selection +- Support for multiple store URLs ### How to use the plugin diff --git a/libs/shortcode.php b/libs/shortcode.php index 284d9f8..a06eb0e 100644 --- a/libs/shortcode.php +++ b/libs/shortcode.php @@ -234,3 +234,125 @@ function fwembed_single_shortcode($atts) { } add_shortcode('fourthwall_single', 'fwembed_single_shortcode'); add_shortcode( 'fourthwall', 'fwembed_shortcode' ); +add_shortcode( 'fourthwall_random', 'fwembed_random_shortcode' ); + +/** + * Extract all product URLs from a store page + * + * @param string $html_content The HTML content to parse + * @param string $base_url The base URL for constructing links + * @return array Array of product URLs + */ +function fwembed_extract_product_urls($html_content, $base_url) { + $product_urls = array(); + libxml_use_internal_errors(true); + $dom = new DOMDocument(); + @$dom->loadHTML(loadHTML5($html_content), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); + $dom->documentURI = $base_url; + $divs = $dom->getElementsByTagName('div'); + + foreach ($divs as $div) { + if ($div->hasAttribute('data-testid') && $div->getAttribute('data-testid') === 'product') { + $xpath = new DOMXPath($dom); + $tileLink = $xpath->query('.//a[contains(@class, "tile")]', $div); + + if ($tileLink->length > 0) { + $linkHref = $tileLink->item(0)->getAttribute('href'); + $full_url = $base_url . $linkHref; + $product_urls[] = $full_url; + } + } + } + libxml_clear_errors(); + return $product_urls; +} + +/** + * Get random products from store or specified URLs + * + * @param string $store_url The store URL to fetch products from (optional if urls provided) + * @param array $urls Array of specific product URLs to randomize from + * @param int $count Number of products to display + * @return string HTML content of random products + */ +function fwembed_get_random_products($store_url = null, $urls = array(), $count = 3) { + $product_urls = array(); + + // If specific URLs are provided, use those + if (!empty($urls)) { + $product_urls = $urls; + } + // Otherwise, fetch all products from the store + elseif ($store_url) { + $result = fwembed_make_request($store_url); + + if ($result['error']) { + return "Error fetching store URL: " . $result['error']; + } + + $product_urls = fwembed_extract_product_urls($result['content'], $store_url); + } else { + return "Error: Either store URL or product URLs must be provided"; + } + + // Shuffle the URLs to randomize + shuffle($product_urls); + + // Limit to requested count + $selected_urls = array_slice($product_urls, 0, $count); + + $html = ''; + foreach ($selected_urls as $url) { + $product_html = fwembed_parse_html_single($url, false); + if ($product_html && !strpos($product_html, 'Error fetching URL')) { + $html .= $product_html; + } + } + + return $html; +} + +function fwembed_random_shortcode($atts) { + $atts = shortcode_atts( + array( + 'count' => '3', + 'urls' => '', + 'store_url' => '', + ), + $atts + ); + + $count = intval($atts['count']); + if ($count <= 0) { + $count = 3; + } + + $urls = array(); + if (!empty($atts['urls'])) { + // Split URLs by comma and clean them up + $url_array = explode(',', $atts['urls']); + foreach ($url_array as $url) { + $clean_url = trim($url); + if (!empty($clean_url)) { + $urls[] = $clean_url; + } + } + } + + $store_url = ''; + if (!empty($atts['store_url'])) { + $store_url = trim($atts['store_url']); + } else { + // Use default store URL from settings if no store_url provided + $options = get_option('fourthwall_settings_name'); + $store_url = isset($options['fourth_url']) ? $options['fourth_url'] : ''; + } + + $products_html = fwembed_get_random_products($store_url, $urls, $count); + + if (empty($products_html)) { + return '
No products found to display.
'; + } + + return '