Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 12/22/2025 in all areas

  1. WireNPS is a comprehensive module for collecting and analyzing customer feedback via a modern Net Promoter Score (NPS) popup interface. Key Features: Elegant NPS Widget: A non-intrusive, mobile-friendly popup for ratings (0-10) and text feedback. Real-time Analytics: Dashboard featuring NPS score calculation, score distribution charts, and 30-day trend graphs. Multilingual Support: Built-in support for English, German, French, and Chinese with automatic browser/user language detection. Flexible Access: Support for both logged-in users and guests (Public/Private modes). Data Export: CSV export functionality for external analysis. Privacy Control: Configurable IP/User Agent tracking and cookie management. Requirements: ProcessWire 3.0+ PHP 8.2+ Quick Installation: Download or git clone into /site/modules/WireNPS/. Install via the ProcessWire admin. Create an AJAX handler page using the provided template. GitHub: https://github.com/mxmsmnv/WireNPS
    3 points
  2. Hi everyone! You’ve probably seen embedded product cards directly in articles on sites like Allegro, PriceRunner? I was using Hanna Code but found its capabilities limiting for my needs, so I decided to fork it and create Embedr - a more feature-rich version: Key Features: 🎯 Dynamic content blocks via ProcessWire selectors (not just static code) πŸ”„ Live preview directly in admin interface 🎨 Built-in visual card builder (UIKit-based) - no PHP required! πŸ“ Custom PHP templates for full control when needed 🏷️ Reusable embed types system πŸ” Debug mode with comprehensive logging βœ… Guest-safe - works for all users out of the box Quick Example: Create an embed with a selector: Name: featured-products Selector: template=product, featured=1, limit=6 Type: products Insert in text: ((featured-products)) Done! The module automatically finds pages and renders product cards. Need custom design? Just create a PHP template at /site/templates/components/products.php GitHub: https://github.com/mxmsmnv/Embedr Give it a try and let me know what you think! πŸš€
    2 points
  3. As usual this has been my ritual for years, changing my website and it's always been Processwire as usual, this time I went for a minimal look.
    2 points
  4. Hello! πŸ‘‹ I'm thrilled to (re-)introduce WireWall β€” an advanced security firewall module for ProcessWire that I've been actively developing and refining in production for months. After blocking massive amounts of malicious traffic (99.98%+ on my e-commerce sites) with zero impact on real users, it's time for a refreshed community announcement with all the latest features from v1.3.4. What is WireWall? WireWall turns your ProcessWire site into a secure fortress with enterprise-grade tools: city-level geo-blocking, full IPv6/CIDR, multi-layer bot protection, true stealth mode, rate limiting fixes, and file-based caching that easily handles 1M+ IPs. Key Features (as of 1.3.4) Geographic Control City-level blocking (e.g. Philadelphia, Beijing, Sydney) Subdivision/region blocking (Pennsylvania, New South Wales, Île-de-France) Country blocking (blacklist/whitelist 200+ countries) MaxMind GeoLite2 integration (Country + ASN + City) β€” 0.5-2ms lookups HTTP fallback (ip-api.com) when MaxMind not available Full IPv6 + CIDR support Bot & Threat Protection Bad bots, scanners, vulnerability tools AI training bots (GPTBot, ClaudeBot, GrokBot, Perplexity, etc.) Fake/headless browser detection (Puppeteer, Selenium, etc.) VPN/Proxy/Tor detection (multi-API chain) Datacenter blocking (AWS, GCP, Azure, Hetzner, etc.) ASN blocking & whitelisting (block/allow entire networks) Security & Rate Limiting Configurable rate limiting with burst handling & permanent/temporary bans JavaScript challenge for suspicious traffic IP whitelist/blacklist with CIDR Priority system β€” now 16 levels (logged-in users at #3, trusted modules at #2) Stealth & UX True silent 404 mode β€” plain "Not Found" text (no HTML/branding) Beautiful custom block page with location/IP display Custom redirect or message on block Option to completely disable AJAX protection (fallback for tricky integrations) Performance & Management File-based cache β€” scales to millions of IPs, no DB overhead Cache UI with stats & per-type clear buttons Detailed logging (city/region/ASN included) Admin area always protected (triple-layer) Real-World Results On production sites (e-commerce + others), WireWall consistently: Blocks 99.98%+ of attacks/scrapers/VPN fraud Zero false positives for logged-in users & legitimate traffic (thanks to priority fixes) Handles spikes without issues after rate limiting improvements Eliminates most cloud-based automated probes Installation (Quick) cd site/modules/ git clone https://github.com/mxmsmnv/WireWall.git Then in admin: Modules β†’ Refresh Install WireWall Configure (start with rate limiting + VPN detection + bad/AI bots) Monitor: Setup β†’ Logs β†’ wirewall Priority System (how requests are evaluated) Admin area β†’ always ALLOW Trusted ProcessWire module AJAX β†’ ALLOW Logged-in users β†’ ALLOW (new in 1.3.4 β€” unconditional bypass) IP whitelist β†’ ALLOW Allowed bots / IPs / ASNs β†’ ALLOW Rate limiting β†’ BLOCK if exceeded IP blacklist β†’ BLOCK JS challenge β†’ CHALLENGE VPN/Proxy/Tor β†’ BLOCK Datacenter β†’ BLOCK ASN blocking β†’ BLOCK Global rules (bots/paths/UA/referer) β†’ BLOCK Country blocking β†’ BLOCK/ALLOW City blocking β†’ BLOCK/ALLOW Subdivision blocking β†’ BLOCK/ALLOW Country-specific rules β†’ BLOCK First match wins. MaxMind Setup (strongly recommended) Free GeoLite2 databases β†’ fast & offline. See README or https://wirewall.org for setup guide. Requirements ProcessWire 3.0.200+ PHP 8.1+ Resources GitHub: https://github.com/mxmsmnv/WireWall Releases & Changelog: https://github.com/mxmsmnv/WireWall/releases Landing: https://wirewall.org License: MIT (free for commercial use) Why build this? ProcessWire deserved a native, scalable, granular firewall with city-level control, offline capability, and proper exception handling β€” things missing or hard in other solutions. Happy to answer questions, hear about your security setups, or debug any issues! Feedback from the community has already shaped big improvements (like the recent logged-in & stealth fixes). Best regards, Maxim
    1 point
  5. The custom AJAX endpoints that RockFrontend is using are basically PHP files located in: /site/templates/ajax/ So the requests go to: http://www.mysite.com/ajax/myEndpoint To prevent these requests from being blocked I tweaked this piece of module code: // WireWall.module.php line 1140 // Check if request URL contains /processwire/ or /admin/ or /ajax/ $requestUri = $_SERVER['REQUEST_URI'] ?? ''; if (stripos($requestUri, '/processwire/') !== false || stripos($requestUri, '/admin/') !== false || stripos($requestUri, '/ajax/') !== false) { return true; }
    1 point
  6. Nested Checkboxes An inputfield for Page Reference fields that groups options by their parent page, and optionally by grandparent page too. This can help editors understand the grouping of the selectable pages, and also makes it quicker for an editor to select or unselect an entire group of pages. The checkboxes at the parent and grandparent level are not for storing those pages in the field value - only for quickly selecting or unselecting groups of pages at the lowest level of the hierarchy. For example, in the screen recording above the "Cities" Page Reference field allows only pages with the "city" template, and the pages at the country and continent level are not included in the field value. The inputfield is only for use with Page Reference fields because the structure comes from the page tree. Requires PW >= v3.0.248. Configuration For each field that uses the inputfield you have these options: Checkboxes structure: choose "Parents" or "Parents and grandparents". Collapse sections that contain no checked checkboxes: this option makes the inputfield more compact. There are also the standard column width and column quantity options familiar from the InputfieldCheckboxes inputfield. These apply to the selectable pages at the lowest level of the hierarchy, and the structure is arguably more readable when these are left at their defaults. https://github.com/Toutouwai/InputfieldNestedCheckboxes https://processwire.com/modules/inputfield-nested-checkboxes/
    1 point
  7. Maybe I have a few little goodies that you might like πŸ˜‰ Wire2PDF (first Alpha) What's new? Custom fonts You can upload and use own fonts Set PDF metadata (defined with variables or custom by a specific templatefield title, subject, keywords, author and creator Create PDF/A-1b for font embedding Now i have to test before it is ready to publish.
    1 point
  8. @d'HinnisdaΓ«l, I was curious about organising a PageArray into a hierarchy, so here is some hook code for modifying a normal InputfieldCheckboxes (when used with a Page Reference field) that you could experiment with. $wire->addHookBefore('InputfieldCheckboxes::render', function(HookEvent $event) { /** @var InputfieldCheckboxes */ $inputfield = $event->object; $field = $inputfield->hasField; if(!$field || $field->name !== 'YOUR_FIELD_NAME') return; function buildHierarchy($pagearray) { // Organise pages by their parent ID and collect all IDs $grouped = []; $itemsById = []; $allIds = []; foreach($pagearray as $page) { $itemsById[$page->id] = $page; $allIds[$page->id] = true; $grouped[$page->parent->id][] = $page; } // Find orphaned parents - parent IDs that don't exist in the PageArray $orphanedParents = []; foreach($grouped as $parentId => $items) { if($parentId !== null && !isset($allIds[$parentId])) { $orphanedParents[] = $parentId; } } // Recursive function to build children function buildChildren($parentId, &$grouped, &$itemsById) { if(!isset($grouped[$parentId])) { return []; } $children = []; foreach($grouped[$parentId] as $item) { $node = clone $item; // Not using "children" as the property name here to avoid clashing with native property $node->nodeChildren = buildChildren($item->id, $grouped, $itemsById); $children[] = $node; } return $children; } // Build trees for all orphaned parents $hierarchy = []; foreach($orphanedParents as $parentId) { $hierarchy = array_merge($hierarchy, buildChildren($parentId, $grouped, $itemsById)); } return $hierarchy; } function renderCheckboxesList($items, $inputfield) { $out = "<div class='nested-checkboxes-list'>"; foreach($items as $item) { $label = $item->getFormatted('title'); $checked = ''; if($inputfield->isOptionSelected($item->id)) $checked = " checked='checked'"; $out .= "<div class='nested-checkboxes-item'><label><input$checked type='checkbox' name='{$inputfield->name}[]' value='{$item->id}' class='uk-checkbox'><span class='pw-no-select'>$label</span></label>"; if($item->nodeChildren) $out .= renderCheckboxesList($item->nodeChildren, $inputfield); $out .= "</div>"; } $out .= "</div>"; return $out; } $options = $inputfield->getOptions(); $optionIdsString = implode('|', array_keys($options)); $selectable = $event->wire()->pages->find("id=$optionIdsString, sort=parent.sort, sort=sort"); $hierarchy = buildHierarchy($selectable); $out = renderCheckboxesList($hierarchy, $inputfield); $out .= <<<EOT <style> .nested-checkboxes-list:not(.InputfieldCheckboxes > .nested-checkboxes-list) { padding-left:25px; } .nested-checkboxes-item input { margin-right:0.5em; } </style> EOT; $event->replace = true; $event->return = $out; }); Before: After: There's no JavaScript (I'll leave that to you), but in any case you would likely need to use PHP logic to set the selection state of parent items on Pages::saveReady() or else the field value would get out of whack any time an option was set via the API rather than via the inputfield. That's why having the parents/grandparents in the field value is something that can't really be handled by a module that is an inputfield only and is probably best done in custom code that's specific to your project.
    1 point
Γ—
Γ—
  • Create New...