u/farhadweb
farhadweb
farhadweb
Plugin-based options (no custom code): • Advanced Product Fields (Studio Wombat) or WooCommerce Product Add-Ons You can add a numeric field for “boxes”, define a price formula (boxes × 250 × unit price), and display the calculated total dynamically. • Measurement Price Calculator (if pricing is strictly formula-based) Works well if the box → pieces relationship is fixed.
Custom (lightweight) approach: If each box always contains a fixed number (e.g. 250 pcs), the simplest setup is: • Sell the product per box • Use a small JS snippet to: • Let the user enter number of boxes • Display derived info (pcs count + total price) • Let WooCommerce handle quantity = boxes
This avoids pricing hacks and keeps cart/tax/VAT logic intact.
Recommendation: If you need this on both product and listing pages and want flexibility later, go with an add-ons plugin that supports formulas. If the logic is fixed and simple, a small JS enhancement on top of standard WooCommerce quantities is often the most maintainable solution.
farhadweb
Plugin-based options (no custom code): • Advanced Product Fields (Studio Wombat) or WooCommerce Product Add-Ons You can add a numeric field for “boxes”, define a price formula (boxes × 250 × unit price), and display the calculated total dynamically. • Measurement Price Calculator (if pricing is strictly formula-based) Works well if the box → pieces relationship is fixed.
Custom (lightweight) approach: If each box always contains a fixed number (e.g. 250 pcs), the simplest setup is: • Sell the product per box • Use a small JS snippet to: • Let the user enter number of boxes • Display derived info (pcs count + total price) • Let WooCommerce handle quantity = boxes
This avoids pricing hacks and keeps cart/tax/VAT logic intact.
Recommendation: If you need this on both product and listing pages and want flexibility later, go with an add-ons plugin that supports formulas. If the logic is fixed and simple, a small JS enhancement on top of standard WooCommerce quantities is often the most maintainable solution.
farhadweb
In my experience, those clients rarely come from generic freelance marketplaces.
The places that have worked best for me are: - Existing client referrals (especially after 1–2 successful long-term projects) - Being visible in niche technical communities (not selling, just helping and discussing architecture) - Agencies that deliberately don’t want to build everything in-house and value specialists - Companies that already have something broken or outgrown (legacy systems, internal tools, migrations)
The key difference is that these clients usually come with a problem, not a “website idea”. Once someone says “we need this system to survive the next 2–3 years”, the conversation changes completely.
Long-term work has mostly come from trust + technical clarity, not from pitching. Being able to explain why a solution fits the business tends to filter out quick-site seekers naturally.
farhadweb
This isn’t a WordPress issue — it’s a Google indexing / caching issue.
Changing the logo in WordPress only updates your site. Google may still be showing: - a cached version - an old structured data logo - or the logo from your homepage favicon / schema
Things to check and do:
Make sure you updated the logo in ALL places:
- Theme customizer (site logo)
- SEO plugin (Yoast / Rank Math → Organization / Site representation)
- Favicon / Site icon
If you use an SEO plugin, ensure the correct logo is set in the schema (Organization / WebSite).
In Google Search Console:
- Use URL Inspection on your homepage
- Click “Request indexing”
If the old logo still appears, it’s normal — Google can take days or weeks to refresh branding assets.
Nothing is “broken”; Google just hasn’t reprocessed the page yet.
farhadweb
Yes — your understanding is correct, and this is actually a very common and recommended approach.
WordPress core files (wp-admin, wp-includes, and root files) are version-specific. If you overwrite them with older files, WordPress will effectively downgrade.
Best practice migration flow: 1. Install a fresh WordPress with the latest version 2. Copy ONLY: - wp-content/ (themes, plugins, uploads) - the database 3. Update wp-config.php with the correct DB credentials 4. Do NOT overwrite core files
As long as wp-admin and wp-includes come from the fresh install, WordPress will stay on the newer version.
A couple of important notes: - After importing the DB, visit /wp-admin once to trigger any DB upgrade routines - Make sure plugin and theme versions are compatible with the newer WP version - Clear caches (object cache / opcode cache) if applicable
So yes — copying all files from the old site is exactly what caused the downgrade. Migrating wp-content + DB onto a fresh core install is the clean approach.
farhadweb
If you really don’t want to spend time on “tech stuff”, keep this as boring and minimal as possible.
Host: • Use a managed WordPress host (they handle updates, backups, security) Examples: Kinsta, WP Engine, Flywheel Avoid cheap shared hosting if you value your time.
Theme: • Block-based, lightweight, no page builder dependency - Twenty Twenty-Four - GeneratePress - Kadence All of these support sidebars, accessibility, and work well long-term.
Plugins (keep it SHORT): • SEO: Yoast or Rank Math (pick ONE) • Performance: whatever your host recommends (often built-in) • Accessibility: WP Accessibility or skip unless you need audits • Dark mode: only if your theme doesn’t support it natively • Security: often handled by the host — don’t stack plugins
General advice: • Fewer plugins = less maintenance • Avoid heavy page builders if you don’t enjoy tweaking layouts • One site with your mag as a section/tab is totally fine and simpler to manage
If Squarespace felt easier, the goal here is to make WordPress feel boring — not powerful.
farhadweb
You don’t actually need a complex calculator or heavy JS for this — WooCommerce already supports this cleanly.
The simplest and most stable approach is to treat “1 box” as the purchasable unit and use quantity as the number of boxes.
How to do it properly:
• Set the product price = price per box (e.g. 75 Ft) • Set product unit info clearly in the description (250 pcs / box) • Customer selects quantity = number of boxes • Total price is handled natively by WooCommerce
Then, for display purposes only: • Use a small JS snippet (or PHP filter) to dynamically show: - Pieces = quantity × 250 - Calculated price preview (optional)
If you want this without custom code, plugins that can handle it: • Advanced Product Fields for WooCommerce • WooCommerce Measurement Price Calculator (official) • Advanced Quantity / Pricing plugins
Avoid doing price math purely in JavaScript — always let WooCommerce calculate the actual price server-side to prevent cart/order mismatches.
In most B2B setups like this, “box as unit + quantity multiplier” is the cleanest and safest solution.
farhadweb
Enfold is licensed via ThemeForest, and the license is per single end product (one website).
So: - 1 license = 1 website / domain - You can use it on staging or local environments for the same site - But if you deploy it on another live site/domain, you need a separate license
The license is lifetime for that site (no yearly renewal), but support is time-limited unless you extend it.
You’re absolutely right to avoid nulled versions — Enfold is a very common target for malware when pirated.
farhadweb
This is a fairly common Yoast behavior with hierarchical taxonomies.
Yoast does not always dynamically rebuild breadcrumb paths immediately after changing term parents. It relies on internal indexing + primary term logic, not just the raw taxonomy hierarchy.
A few things to check / try:
1) Re-run Yoast’s indexables Go to: SEO → Tools → Optimize SEO data This forces Yoast to rebuild its internal index and usually fixes outdated breadcrumb paths.
2) Check for a “Primary term” If this taxonomy is attached to posts/pages, Yoast may be using an old primary term selection that no longer matches the hierarchy. Even for archives, stale primary term data can affect breadcrumbs.
3) Clear all caches Not just LiteSpeed: - Object cache (Redis/Memcached if enabled) - PHP opcode cache (OPcache) Yoast breadcrumbs are sometimes cached at a deeper level than page cache.
4) Breadcrumb filter override
If you have any custom wpseo_breadcrumb_links filter in the theme or a plugin, it may be hardcoding or reordering the path.
5) Known limitation Yoast breadcrumbs are not a pure reflection of the taxonomy tree. In some edge cases, especially after restructuring hierarchies, they don’t update correctly until the index is rebuilt.
In most cases, step #1 (Optimize SEO data) resolves this immediately.
farhadweb
This is totally doable, but the key is separating “preview + acceptance” from the actual payment step.
A common and clean approach is:
1) Collect the user data via a form (name, age, signature, etc.). 2) Generate a dynamic PDF from that data on form submission (but before payment). 3) Show the generated PDF to the user (inline preview or download link) and require explicit acceptance (checkbox). 4) Only after acceptance, allow them to proceed to payment.
In WordPress, this is usually handled with: - A form plugin that supports conditional logic + payments (Gravity Forms, Fluent Forms, Formidable, etc.) - A PDF generator add-on (like E2PDF or native PDF add-ons from the form plugin) - Conditional payment logic so the payment field/button is unlocked only after acceptance
Trying to generate the PDF during the payment step is where things usually get messy. Treat the PDF as a pre-contract step, not part of the gateway flow itself.
If signatures are involved, make sure the PDF is generated server-side and stored (or hashed) for audit purposes before redirecting to the payment gateway.
farhadweb
This usually happens because the banner height isn’t actually controlled by the banner setting itself, but by the content inside it.
If the headline, subheading, form, or background image has a fixed min-height or large padding, the section will refuse to shrink and will “push” everything down.
A few practical things to check:
- Reduce the font size and line-height of the heading and subtitle first.
- Check padding/margin on the banner section (top & bottom padding is often the real culprit).
- Make sure the background image isn’t set with a fixed height or “cover” + min-height.
- If this is built with a page builder, avoid setting both a fixed height AND vertical alignment at the same time.
In most cases, once the text size and padding are reduced, the banner will naturally collapse to a smaller height without breaking the layout below.
farhadweb
This usually isn’t a Polylang “auto-delete” bug by itself, but a conflict in how the duplicated post is being linked.
Duplicate Page (and similar plugins) often clone the post after Polylang has already created the translation relationship. When that happens, Polylang later cleans up what it thinks is an orphaned translation, so it looks like it’s deleting it on publish.
A few things worth checking:
- Disable Duplicate Page temporarily and create the translation using Polylang’s native “Add translation” flow only.
- Make sure “Media / content duplication” in Polylang settings is consistent (automatic vs manual).
- Check whether the duplicated page is getting a new post ID but keeping the original language relationship.
- With Elementor specifically, try saving the translated page once without editing it in Elementor first, then edit.
ACF can also contribute if fields are set to “copy once” and the duplication plugin interferes with that state.
In short: avoid third-party duplicate plugins with Polylang if possible, especially when Elementor is involved. Polylang expects to control the translation lifecycle itself.
farhadweb
This resonated a lot.
In my experience, the first thing that breaks isn’t WordPress itself, it’s state tracking: who’s waiting on content, who approved what, what changed last, and what’s still unpaid.
What helped me wasn’t adding more tools, but picking one lightweight source of truth and being strict about it. For me that ended up being: - one simple task board (client → site → next action) - all client communication funneled into a single channel per project - and very explicit “waiting on client” states so it’s not living in my head
As soon as that context switching is externalized, WP work becomes calm again.
I don’t think this is a WordPress problem at all — it’s a freelancing problem that just becomes very visible with multiple installs.
farhadweb
WPML didn’t really “remove” username logins — they switched to email-based auth on their account system (not WordPress itself).
If you’ve tried all possible emails and still can’t log in, the only real option is contacting them directly. You don’t need to be logged in to use this form: https://wpml.org/home/contact-us/contact-form/
Use the “Account / Billing” category and mention: - Approximate purchase year - Username you remember - Any domains where WPML licenses were activated - Old invoices if you have them
They can usually locate the account manually from that info.
farhadweb
Short answer: yes, you can run both — but you generally shouldn’t overlap their WAF or active blocking features.
Wordfence (paid) works best when it’s the single in-app WAF handling request blocking. Running multiple plugins that hook into login protection, file scanning, or request filtering can: - Increase false positives - Add unnecessary overhead - Make incidents harder to debug (“who blocked what?”)
That said, using them in complementary roles is reasonable: - Wordfence → WAF, brute force protection, real-time blocking - Sucuri → file integrity monitoring, audit logs, change alerts
If both are enabled, I’d recommend: - Disable overlapping features (login protection, rate limiting) in one of them - Keep a single source of truth for blocking decisions - Treat the second plugin primarily as a monitoring/alerting layer
In higher-security setups, this separation is common: one active defense, one passive observer. Just avoid running two WAFs competing for the same hooks.
farhadweb
For files at that size, you generally don’t want to serve the original image directly.
The common, practical approach is: • Convert the source into tiles (Deep Zoom / image pyramids) • Serve only the visible tiles at each zoom level
Tools/approaches that work well: • OpenSeadragon (works great with Deep Zoom / IIIF) • IIIF image servers (e.g. Cantaloupe, IIPImage) • Pre-generate tiles and host them statically (CDN-friendly)
This is how museums, maps, and gigapixel images handle zooming without forcing a 300–500MB download.
If this is for the web, PNG/TIFF as a delivery format is the wrong tool — keep them as source files only, and expose a tiled viewer inste
farhadweb
For small, truly “snippet-sized” tweaks I usually avoid snippet plugins altogether and either: - drop them into a small must-use plugin, or - keep them in a simple custom plugin tracked in git
That said, if someone prefers a UI: - FluentSnippets is fine for quick experiments - Code Snippets is stable and widely used - File-based approaches are generally safer long-term than DB-stored snippets
Once snippets start to grow or become business-critical, treating them as real code (plugin + version control) scales much better than any snippet manager.
farhadweb
Since it’s a Wix site, there won’t be a 1:1 WordPress “theme” match, but the layout is pretty standard.
In WordPress you can get very close with: - Astra or GeneratePress as the base theme - Gutenberg or a light page builder (no heavy animations needed) - A simple grid-based layout + large typography + plenty of white space
If you want something more opinionated out of the box, you could also look at: - Kadence - Blocksy
The key here is structure and spacing, not the theme itself.
farhadweb
Nice work 👍
A couple of questions from a performance angle: - Does it rely on wc_order_stats / Analytics tables or custom aggregation? - How does it behave on larger stores (e.g. 100k+ orders)? - Are reports generated on the fly or cached/precomputed?
I like the “no external APIs” approach — that’s often overlooked but makes a big difference for privacy and reliability. I’ll take a closer look.
farhadweb
This usually happens when the theme has separate menu locations for desktop and mobile.
Check Appearance → Menus → Manage Locations and make sure the same menu is assigned to both the primary/header menu and the mobile menu (sometimes called “Mobile”, “Off-canvas”, or “Responsive”).
Also double-check: • The missing pages are published (not draft/private) • They’re added explicitly to the menu (not relying on “Automatically add new pages”) • No conditional logic in the theme (some themes hide items on the front page)
If you share the URL and theme name, it’ll be easier to pinpoint.
farhadweb
That’s a fair way to look at it.
I don’t really see Ansible and tools like Webinoly as direct competitors. Ansible shines when you need repeatable, multi-host orchestration and long-term infra consistency.
Webinoly (or similar opinionated stacks) optimize for a narrower scope: fast, sane defaults for a single server or small fleet. Less flexibility, but also less cognitive overhead.
For basic to mid-level WP usage, that trade-off can be totally reasonable. Once complexity grows, Ansible (or something similar) usually becomes unavoidable.
farhadweb
If you’re comfortable living in the CLI and want to stay close to the OS, I’d stick with a minimal Nginx + PHP-FPM + MariaDB stack and automate only the boring parts.
Tools like Ansible or simple bash scripts give you reproducibility without adding a control panel layer. That keeps things lean, debuggable, and future-proof.
Docker makes sense at scale, but for a handful of WordPress sites it often adds more operational overhead than value unless you already run everything containerized.
The key is opinionated defaults + documentation, not more tooling.
farhadweb
This is expected behavior with WooCommerce Subscriptions.
Woo controls the subscription lifecycle, billing schedule, retries, status, etc. Stripe is only used as a payment gateway + token vault, not as the subscription engine.
So: - You won’t see “Subscriptions” in the Stripe dashboard - You’ll only see charges, payment intents, invoices, and saved payment methods - Renewals are triggered by Woo → via webhooks → charging the stored payment method in Stripe
If you want Stripe-native subscriptions, you’d need to use Stripe Billing directly, not Woo Subscriptions.
For the renewal issue: Double-check webhooks, cron health, and whether automatic renewals were disabled globally or per subscription — Woo usually doesn’t recover missed renewals automatically once that state changes.
farhadweb
This is way more common than people like to admit.
“Site is up but business is broken” issues are the worst because they fail silently: - form submissions - transactional emails - webhooks - cron jobs - background tasks
I’ve seen contact forms working visually but emails failing, payments completing but order hooks not firing, or leads being stored nowhere because of a small update or SMTP change.
After getting burned a few times, I now assume: - uptime monitoring is not enough - error logs alone are not enough
For critical flows (forms, payments, emails), I always add: - form submission logging (DB-level, not just email) - email logging - at least one synthetic test (fake submission / test order) on a schedule
Clients will notice before you do if money or leads are involved — unless you actively monitor business-critical actions, not just availability.
yes, there was some friction at first — but it mostly solved itself once I enforced it consistently.
What made the difference was framing the “single channel” and states as part of how work progresses, not as a preference. I’m explicit early on: “If it’s not in the board / project channel, it doesn’t exist yet.”
A few things that helped: • I redirect, not argue. If feedback comes via email/DM, I acknowledge it and move it to the agreed place. • “Waiting on client” isn’t passive — it’s visible. Clients tend to respond faster when they see themselves as the blocker. • After 1–2 gentle corrections, most clients adapt. The ones who don’t are usually a signal of future scope or boundary issues anyway.
Once clients see that this actually speeds things up (and reduces back-and-forth), they usually buy in. The consistency matters more than the tool — it’s the repeated behavior that trains the system, on both sides.