# Wally David > A Web Developers Journal Language: en URL: https://wallydavid.com/ All pages on this site are available as clean Markdown by adding the header `Accept: text/markdown` to any HTTP request. REST API: https://wallydavid.com/wp-json/mescio-for-agents/v1/markdown?url={page_url} ## Pages - [WordPress Website Development, Agentic Marketing & Interactive Media](https://wallydavid.com/) - [Website Development Services | Custom WordPress & Web Design | Wally David](https://wallydavid.com/website-development/) - [SEO & AIO Services](https://wallydavid.com/seo/) - [My account](https://wallydavid.com/my-account/) - [Checkout](https://wallydavid.com/checkout/) - [Cart](https://wallydavid.com/cart/):   You may be interested in…                     Your cart is currently empty! - [Digital Solutions](https://wallydavid.com/digital-solutions/) - [Website Maintenance](https://wallydavid.com/website-maintenance/) - [Protected: Work](https://wallydavid.com/portfolio/) - [Privacy & Terms](https://wallydavid.com/privacy-policy/) - [Contact](https://wallydavid.com/contact/) - [Blog](https://wallydavid.com/blog/) - [AiVO](https://wallydavid.com/aivo/) ## Blog Posts - [Apple Maps, CarPlay and a Trip to Canada](https://wallydavid.com/apple-maps-carplay-and-a-trip-to-canada/) (2026-09-01): Your Business Might Be Invisible to the Person Driving to It. This has come up a few time recently, but I recently took a trip to Canada and discovered a marketing problem I hadn't really thought about before: Apple Maps. I - [WooCommerce Hackery – Adding Custom Company Fields to Orders Page](https://wallydavid.com/woocommerce-hackery/) (2026-08-11): Dear Diary.. Don't forget this - "Adding company to the orders screen" and "adding a custom order status". Click screen options and add quick click "actions" and "Company" // 1. Add custom column header to the orders list add_filter( 'manage_woocommerce_page_wc-orders_columns', - [Your Office “Web Editor” Could Be Hurting Your AI Visibility](https://wallydavid.com/your-office-web-editor-could-be-hurting-your-ai-visibility/) (2026-07-28): For years, companies have taken the same approach to website management: hand the login to someone in the office and let them update content as needed. Maybe it's a marketing coordinator, an administrative assistant, or the person who "knows computers." - [Stop Using PayPal as Your Primary eCommerce Payment Processor](https://wallydavid.com/stop-using-paypal-as-your-primary-ecommerce-payment-processor/) (2026-07-15): If you're launching a new online store, think carefully before making PayPal your primary checkout option. Platforms like WooCommerce, Shopify, and Toast already require customers to create an account or provide enough information to manage orders, view purchase history, and - [Fun Blocking Countries with CloudFlares Expression Builder](https://wallydavid.com/fun-blocking-countries-with-cloudflares-expression-builder/) (2026-07-09): I'm in the US and I get more traffic from Russia, Singapore, India and a hand full of other countries than I care for eroding my client traffic metrics. CloudFlare's UI isn't always great, but its expression builder is pretty - [WordPress in the Era of AI: Building Websites for Both People and Machines](https://wallydavid.com/wordpress-in-the-era-of-ai-building-websites-for-both-people-and-machines/) (2026-07-08): For years, building a successful WordPress website followed a fairly predictable checklist. Create quality content, optimize page speed, install analytics, connect Google Tag Manager, write unique meta titles and descriptions, and make sure the site was mobile-friendly. If you wanted - [My Site Had Fake Schema Markup for Who Knows How Long (and How I Fixed It)](https://wallydavid.com/my-site-had-fake-schema-markup-for-who-knows-how-long-and-how-i-fixed-it/) (2026-07-02): I sell “schema-first AIO” on my SEO page. So imagine my face when I actually looked at what my own site was outputting and found my Organization schema pointing to linkedin.com/in/your-profile, twitter.com/your-handle, and facebook.com/your-page. Not typos. Literal placeholder text. Live, - [Use Shortcode’s with SCF (Secure Custom Fields)](https://wallydavid.com/use-shortcodes-with-scf-secure-custom-fields/) (2026-06-16): An hour of digging through documentation, reddit, and blogs, I ended up having to watch a stupid video to get this function. RANT: Secure Custom Fields disables short codes by default now. Who knew, I hardly use it, but it - [Salient – How to remove the period in the copyright text](https://wallydavid.com/salient-how-to-remove-the-period-in-the-copyright-text/) (2026-06-12): A dumb theme design thing that I have to change all the time. Just a reminder. salient > nectar > helpers > footer.php See LINE 112 Change this... $copyright_text = '© '. date( 'Y' ) . ' ' . esc_html( - [A WordPress Developers Review and Thoughts on Base44](https://wallydavid.com/a-wordpress-developers-review-and-thoughts-on-base44/) (2026-06-10): I've been using Base44 for a while now in my production workflow trying to make a case for certain AI platforms as viable development solutions. From the perspective of a WordPress developer, Base44 shines as an exceptional, highly efficient platform - [Disable WordPress Patterns Sub Menu – Again](https://wallydavid.com/disable-wordpress-patterns-sub-menu-again/) (2026-06-03): The ways I hate WordPress some days are endless. I'm pretty sure they think if they just keep renaming the patterns page ID maybe people will use it. Nope -- and my hot take is if you're a nutty WordPress - [Google launches “Mothership Advantage” Gemini 3.5 AI Search before rivals can replace it](https://wallydavid.com/google-launches-mothership-advantage-gemini-3-5-ai-search-before-rivals-can-replace-it/) (2026-05-21): Tone down the hype. Despite what "experts" claim, no AI platform can touch Google’s LLM development. Google owns the world’s largest data funnel: its search engine. While others scrape public data, Google processes billions of daily user queries and behaviors. - [AI is not even close to killing WordPress development yet](https://wallydavid.com/ai-is-not-even-close-to-killing-wordpress-development-yet/) (2026-05-21) - [SynthID Watermark may be the most impactful thing Google Announced](https://wallydavid.com/synthid-watermark-may-be-the-most-impactful-thing-google-announced/) (2026-05-21): Of everything I watched during Googles announcement for Gemini 3.5, SynthID watermarking may end up being the most impactful change for consumers. In an effort to improve trust and transparency around AI-generated content, companies like OpenAI, Nvidia, Kakao, and ElevenLabs - [Why Your Google Business Profile Is Just as Important as Your Website for Local SEO](https://wallydavid.com/why-your-google-business-profile-is-just-as-important-as-your-website-for-local-seo/) (2026-05-20): Your Google Business Profile is just as important as your website for local SEO, yet many businesses overlook it. In many searches, especially local “near me” results, Google Maps and GBP listings appear before traditional website rankings. That means your - [Most SEO Tools Display Disconnected Vanity Metrics That Don’t Matter](https://wallydavid.com/most-seo-tools-display-disconnected-vanity-metrics-that-dont-matter/) (2026-05-20): There is only one metric in all of SEO and PPC that matters - Conversion. Full stop. Many businesses and marketing teams (myself included) are becoming frustrated with traditional SEO reporting platforms like Moz, SpyFu, AgencyAnalytics, and Semrush because the - [SERP FAQ Removal – OMG The Sky Isn’t Falling](https://wallydavid.com/serp-faq-removal-omg-the-sky-isnt-falling/) (2026-05-18) - [Got To Get That EST](https://wallydavid.com/got-to-get-that-est/) (2026-04-17): DateTime::getTimestamp() returns unix timestamp. That number is always UTC. What you want is format the date according to your time zone. Use this if you have multiple time zones and don't want to fiddle with the server time settings. $dt - [Killing the Pattern Menu – Again](https://wallydavid.com/killing-the-pattern-menu-again/) (2026-04-14): I do a lot of WordPress dashboard customization—and I still can’t stand the block editor. When tools like Elementor and Visual Composer are powering the vast majority of builds (something like 80–90%), the Customizer along with the Block and Patterns - [Prevent other Admins from Promoting other Admins](https://wallydavid.com/prevent-other-admins-from-promoting-other-admins/) (2026-04-14): Sometimes I hate the things I have to know about WordPress. I shouldn't have to know this. "Make your client an admin, then use this so they can't make more admins without asking." Add this to your functions to make - [EmDashCMS.com Would Have Been Awesome 8 Years Ago](https://wallydavid.com/emdashcms-com-would-have-been-awesome-8-years-ago/) (2026-04-10): After spending a week experimenting with Cloudflare’s EmDash CMS, here’s where I’ve landed: this feels like the version of WordPress many of us were hoping for about eight years ago—before Gutenberg entered the picture. EmDash brings some genuinely solid ideas - [YayMail and other fun ways to die slowly](https://wallydavid.com/yaymail-and-other-fun-ways-to-die-slowly/) (2026-04-10): I’m fairly certain there’s a special corner of hell reserved for WordPress plugin developers who built their careers on upselling half-baked “freemium” tools. That said, I’ve never been a fan of the word no—and I like paying for things even - [Expressions To Geo Block Individual State Traffic With CloudFlare](https://wallydavid.com/expressions-to-geo-block-individual-state-traffic-with-cloudflare/) (2026-03-27): Cloudflare has become the go-to solution for high-traffic websites. If you’re working in web development, understanding traffic distribution and load balancing isn’t optional—and Cloudflare is one of the most powerful (and easiest) platforms to set up and manage, especially for - [Basic WordPress Security For Self Hosted Sites](https://wallydavid.com/basic-wordpress-security-for-self-hosted-sites/) (2026-03-03): If you’re Googling something like “why are my WordPress server processes and RAM maxed out?” and landed here, here’s the quick version. XML-RPC (xmlrpc.php in WordPress) is a legacy protocol that allows remote procedure calls — basically, it lets external - [Add A Confetti JavaScript To Your Site For No Reason](https://wallydavid.com/add-a-confetti-javascript-to-your-site-for-no-reason/) (2025-12-12): Add this JavaScript to the footer of your website to create a fun confetti effect. This one is free and you can just copy and paste. Change the DURATION to set it to run longer or shorter. - [Reorder Constant Contact Forms Fields With CSS](https://wallydavid.com/reorder-constant-contact-forms-fields-with-css/) (2025-12-11): Sometimes you inherit web things that you don't have access to. Today's instance is a Constant Contact account form, which usually always sets the EMAIL field first. Luckily Constant Contacts embedded forms have nice output code with clear ID's and - [Code Purists, Amateur WordPress Developers Other Ways to Die](https://wallydavid.com/code-purists-amateur-wordpress-developers-other-ways-to-die/) (2025-11-11) - [AI Tech Is Tanking, Welcome To The Next DOT COM Bubble](https://wallydavid.com/ai-tech-is-tanking-welcome-to-the-next-dot-com-bubble/) (2025-08-22) - [Useful Mac Apps](https://wallydavid.com/useful-mac-apps/) (2025-07-30) - [ChatGPT Is massively overhyped and tanking your SEO readability score. Calm down.](https://wallydavid.com/chatgpt-is-massively-overhyped-and-tanking-your-seo-readability-score-calm-down/) (2025-05-27): What does Google, AltaVista, DuckDuck Go, Yandex, and Yahoo roughly index according to Yoast and SemRush. A single natural key phrase (key words are dead) The 150 character meta description Roughly the first four sentences under 22 characters or 150 words. - [Disable WooCommerce Product Image Zoom](https://wallydavid.com/disable-woocommerce-product-image-zoom/) (2025-05-23): I hate WooCommerce. It's the best most horrible e-commerce option in the world. Reminder: how to disable product image zoom on single posts: function custom_single_product_image_html( $html, $post_id ) { $post_thumbnail_id = get_post_thumbnail_id( $post_id ); return get_the_post_thumbnail( $post_thumbnail_id, apply_filters( 'single_product_large_thumbnail_size', 'shop_single' - [Windows prevented Vortex from loading files necessary to complete the installation.](https://wallydavid.com/windows-prevented-vortex-from-loading-files-necessary-to-complete-the-installation/) (2025-05-12) - [Load Dashicons in Front End](https://wallydavid.com/load-dashicons-in-front-end/) (2025-04-30) - [WooCommerce Modify Billing To Match Drivers License](https://wallydavid.com/woocommerce-modify-billing-to-match-drivers-license/) (2025-03-21): Sometimes you need to ask users to be specific about WooCommerce billing details. Especially when registering for say, a CPL or a medical or government billing form. Here is a quick plugin to edit the "Billing Details" text on the - [What’s Causing Maxed Processes and 100% Ram Usage in cPanel with WordPress](https://wallydavid.com/whats-causing-maxed-processes-and-100-ram-usage-in-cpanel-with-wordpress/) (2025-02-27): This is one of the most irritating things to troubleshoot in cPanel, WHM, or whatever Linux hosting you're using. What the heck is using all the processing bandwidth and ram. Your server is running along just fine, then just like - [Adding a Service fee in WooCommerce for Free](https://wallydavid.com/adding-a-service-fee-in-woocommerce-for-free/) (2025-02-17): Automatic is systematically buying up every plugin for WooCommerce and making it a paid plugin that you have to add and manage through a WordPress.com account. I can't even express my dislike for WooCommerce enough. Anyways, don't buy an $80 - [GoDaddy SSL/TLS Status Not Issuing an SSL Fix](https://wallydavid.com/godaddy-ssl-tls-status-not-issuing-an-ssl-fix/) (2025-02-17): If you have a lot of domains in your GoDaddy cPanel, and your hosting will not issue an SSL thorough the SSL/TLS Status screen for one of your domains, this means you have an invalid add-on domain somewhere in your - [Useful wp-config.php Tweaks](https://wallydavid.com/wp-config-php-tweaks/) (2025-02-11): Here's another note to myself. Add this to be able to upload SVGs, fonts and whatever file type you want. Careful with this one, uploading anything means uploading anything, so there could be security risks here to be aware of. - [Tips For Speeding Up WordPress](https://wallydavid.com/tips-for-speeding-up-wordpress/) (2025-02-11): Set Post Revisions Before you even begin your development project, add this little gem to the wp-config file. Nothing blows a database up like a couple hundred revisions. If you've already launched your site and have a zillion revisions on - [WooCommerce, the WORST best WordPress Option](https://wallydavid.com/woocommerce-the-worst-best-wordpress-option/) (2025-02-04): Just a reminder to myself how to hide WooCommerce menus because I have to google this EVERY time. add_filter( 'woocommerce_admin_features', function( $features ) { /** * Remove Marketing Menu * Filter list of features and remove those not needed * - [500,000+ Open-licensed SVG Vector and Icons](https://wallydavid.com/500-000-open-licensed-svg-vector-and-icons/) (2025-01-13) - [Matt Mullenweg is Ruining WordPress for Developers and the Internet](https://wallydavid.com/matt-mullenweg-is-ruining-wordpress-for-developers-and-the-internet/) (2024-12-17): NEWS: A Judge handed WP Engine a preliminary win in the legal fight with Automattic - Read more here. Everyone that makes a living from the WordPress open-source eco-system has felt the cringe from Matts actions in the last couple - [Helpdesk, Contact & Call Plugin](https://wallydavid.com/helpdesk-contact-call-plugin/) (2024-11-25):   Contact button "Click URL" field notes: You can add any url to this field. However, if you'd like to use this plugin as a help desk pop-up you need to add the following code to the "Click URL" field - [A Few .htaccess Hacks To Speed Up WordPress](https://wallydavid.com/a-few-htaccess-hacks-to-speed-up-wordpress/) (2024-11-14): A couple hacks to speed up WordPress Open your .htaccess file on your server for editing. Look for the line that says #END WordPress. All code from this article should go below that line. Set up GZIP By enabling this, - [The Benefits of Minimalism in Web Design](https://wallydavid.com/the-benefits-of-minimalism-in-web-design/) (2024-11-14) - [Basic SEO Guide In A Nutshell](https://wallydavid.com/basic-seo-guide-in-a-nutshell/) (2024-11-13): 1.) Start by finding out what keywords people use to find your website and use them in your content and ad copy. Then pick a page, say your home page. Pick the beset keyword that describes your page. Lets use: - [Linux Doesn’t Suck, It’s Developers Do](https://wallydavid.com/linux-doesnt-suck-its-developers-do/) (2024-11-08): First, let's define a NORMAL USER: ie: a non-developer. a home or office user. a non-IT professional. a business employee or production worker. someone who just wants their technology to work without understanding the technical details. It's Simple The whole - [macOS Isn’t Magical Or Fun Anymore](https://wallydavid.com/macos-isnt-magical-or-fun-anymore/) (2024-11-06): I learned the terminal, how to code, write internal company apps, write games and a whole slew of other things in the first few years of OSX. Most of what I could do then, I can't do now, because Apple - [PayPal REALLY Wants Pay Later Messaging On Your WooCommerce Store](https://wallydavid.com/paypal-really-wants-pay-later-messaging-on-your-woocommerce-store/) (2024-10-28): The last few versions of the PayPal gateway for WooCommerce are mysteriously broke. Turning the Pay Later toggles to off does nothing. The Settings will not save and the Pay Later or Pay in Installments ads on the cart and - [Disable ACF Unsafe HTML Rendering](https://wallydavid.com/disable-acf-unsafe-html-rendering/) (2024-10-23): ACF now automatically escapes unsafe HTML (Vague Term) when rendered by the_field or the ACF shortcode. It throws a message at the top of posts and pages where it's detected issues that says, "We’ve detected the output of some of ## Products ### Uncategorized - [Wallys Video Converter](https://wallydavid.com/digital-solutions/wallys-video-converter/) — $4.99 [in stock] - [Pay Invoice](https://wallydavid.com/digital-solutions/pay-invoice/) — From: $0.00 [in stock]: Pay your invoice quickly and securely online using a credit card. Simply enter your invoice details and payment information through our secure checkout (Square) to complete your transaction in just a few moments. Online payments are processed safely, providing a fast and convenient way to keep your accounts up to date. Secure checkout by Square Payments - [12 Month Managed Client Hosting](https://wallydavid.com/digital-solutions/12-month-managed-hosting/) — $299.88 [in stock]: Single Site Installation 1CPU / 2GB Ram / 25gb Storage Fully Managed Hosting Plugins & Themes Speed Optimization Enhanced Security Free Malware Removal Cloud Backups Spam Prevention Status Monitoring Plugin/Theme/WP Updates --- # Full Content --- title: "Apple Maps, CarPlay and a Trip to Canada" url: "https://wallydavid.com/apple-maps-carplay-and-a-trip-to-canada/" lang: "en-US" type: "post" description: "Your Business Might Be Invisible to the Person Driving to It. This has come up a few time recently, but I recently took a trip to Canada and discovered a marketing problem I hadn't really thought about before: Apple Maps. I" last_modified: "2026-09-02T13:45:46+00:00" categories: [Articles] tags: [AI search, Apple, Apple Maps, CarPlay, Google, Google Business Profile, Google Maps, SEO, Siri] custom_fields: pld_like_count: 26 nectar_blog_post_view_count: 91 --- # Apple Maps, CarPlay and a Trip to Canada [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 **Your Business Might Be Invisible to the Person Driving to It.** This has come up a few time recently, but I recently took a trip to Canada and discovered a marketing problem I hadn’t really thought about before: Apple Maps. I was driving a rental car using Apple CarPlay and tried to find my hotel by name. It couldn’t find it. I ended up fumbling around while driving, trying to find the hotel’s physical address so I could enter it manually. That got me thinking: How many businesses have spent thousands on SEO, Google Business Profile and Google Maps, but have never checked whether Apple Maps can actually find them? For years, everything has been Google. And Google Business Profile makes it relatively easy for businesses to establish and manage their presence. But Apple Maps is a different ecosystem—and one that businesses and marketing agencies often overlook. That’s becoming a bigger problem because Apple CarPlay puts Apple Maps directly in the dashboard of millions of vehicles. When someone is driving to your business, they may not be searching Google. They may simply say, “Hey Siri, take me to ABC Company.” Marketing agencies need to start thinking beyond Google. If you’re doing local SEO for a client, Apple Maps should be on the checklist. Is the business listed? Is the name, address, phone number and website correct? Is the map pin in the right place? Can someone actually find the business from their car? **This isn’t about Google versus Apple. It’s about being findable.** Search is no longer just Google. People search on phones, through voice assistants, in apps, through AI—and increasingly from the dashboard of their car. Your business can have a great website and a perfectly optimized Google Business Profile, but if a customer can’t find you when they’re sitting in their car, you still have a visibility problem. Maybe it’s time we start treating Apple Maps as part of local SEO. --- --- title: "Wallys Video Converter" url: "https://wallydavid.com/digital-solutions/wallys-video-converter/" lang: "en-US" type: "product" last_modified: "2026-08-31T01:43:29+00:00" price: "<span class="woocommerce-Price-amount amount"><bdi><span class="woocommerce-Price-currencySymbol" translate="no">$</span>4.99</bdi></span>" sku: "" in_stock: true --- # Wallys Video Converter [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 [divider line_type=”No Line” custom_height=”35″] --- --- title: "AiVO" url: "https://wallydavid.com/aivo/" lang: "en-US" type: "page" last_modified: "2026-08-12T15:04:46+00:00" custom_fields: nectar-metabox-portfolio-display: "all" nectar-metabox-portfolio-display-sortable: "off" --- # AiVO [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "WooCommerce Hackery – Adding Custom Company Fields to Orders Page" url: "https://wallydavid.com/woocommerce-hackery/" lang: "en-US" type: "post" description: "Dear Diary.. Don't forget this - \"Adding company to the orders screen\" and \"adding a custom order status\". Click screen options and add quick click \"actions\" and \"Company\" // 1. Add custom column header to the orders list add_filter( 'manage_woocommerce_page_wc-orders_columns'," last_modified: "2026-08-11T14:36:24+00:00" categories: [Articles] custom_fields: pld_like_count: 26 nectar_blog_post_view_count: 174 --- # WooCommerce Hackery – Adding Custom Company Fields to Orders Page [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Dear Diary.. Don’t forget this – “Adding company to the orders screen” and “adding a custom order status”. Click screen options and add quick click “actions” and “Company” // 1. Add custom column header to the orders list add_filter( 'manage_woocommerce_page_wc-orders_columns', 'add_company_order_column' ); function add_company_order_column( $columns ) {     $new_columns = array();     foreach ( $columns as $key => $column ) {         $new_columns[$key] = $column;         // Insert the Company column after the Order number/status         if ( 'order_status' === $key ) {             $new_columns['billing_company'] = 'Company';         }     }     $new_columns['billing_company'] = 'Company';     return $new_columns; } // 2. Populate the custom column with company data add_action( 'manage_woocommerce_page_wc-orders_custom_column', 'fill_company_order_column', 10, 2 ); function fill_company_order_column( $column, $order ) {     if ( 'billing_company' === $column ) {         $company = $order->get_billing_company();         echo ! empty( $company ) ? esc_html( $company ) : '—';     } } Plugin 2: [Custom Order Status Manager for WooCommerce](https://wordpress.org/plugins/bp-custom-order-status-for-woocommerce/) ![Setting up WooCommerce Actions and A Custom Status](https://wallydavid.com/wp-content/uploads/2026/08/woocommerce-status-1024x489.avif) Plugin 3: [Product Customer List for WooCommerce](https://wordpress.org/plugins/wc-product-customer-list/) – Possibly the most essential WooCommerce Plugin ever. Easy export for any orders of a specific product including custom fields and statuses. ![WooCommerce Customer Product Export Easy Free](https://wallydavid.com/wp-content/uploads/2026/08/woo-product-export-1024x370.avif) --- --- title: "Your Office “Web Editor” Could Be Hurting Your AI Visibility" url: "https://wallydavid.com/your-office-web-editor-could-be-hurting-your-ai-visibility/" lang: "en-US" type: "post" description: "For years, companies have taken the same approach to website management: hand the login to someone in the office and let them update content as needed. Maybe it's a marketing coordinator, an administrative assistant, or the person who \"knows computers.\"" last_modified: "2026-07-28T15:06:47+00:00" categories: [Articles] custom_fields: pld_like_count: 235 nectar_blog_post_view_count: 203 --- # Your Office “Web Editor” Could Be Hurting Your AI Visibility [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 For years, companies have taken the same approach to website management: hand the login to someone in the office and let them update content as needed. Maybe it’s a marketing coordinator, an administrative assistant, or the person who “knows computers.” As long as they’re changing text, adding images, and updating SEO titles and meta descriptions, everything must be fine…right? Not anymore. The era of AI-powered search has fundamentally changed what it means to maintain a website. Search engines and AI assistants no longer rely solely on page content, keyword density, meta descriptions, or image alt tags. Today’s search ecosystem depends on an interconnected network of technical data that most casual website editors never see. ## AI Visibility Is More Than SEO Traditional SEO focused on content. Write good copy, add keywords, optimize headings, and publish. Today, AI visibility requires an entire ecosystem working together. Your website’s discoverability now depends on elements such as: - Structured data (Schema.org JSON-LD) - **llm.txt** and **llms-full.txt** files - Properly configured **robots.txt** - Accurate XML sitemaps - Internal linking - Canonical URLs - Consistent metadata - Clean page architecture - Crawlable images and media These pieces don’t exist independently—they work together. Think of them as an ecosystem rather than individual optimization tasks. ## The Hidden Problem When someone makes a “quick” update to a page, they usually only edit what they can see. - They change a product description. - They rename a service. - They replace an image. - They remove a section. - The website looks correct to visitors. But behind the scenes? - The structured data may still describe the old content. - The **llm.txt** file may reference outdated terminology. - The sitemap may not reflect new URLs. - Schema may still reference images that no longer exist. - AI systems continue reading outdated information while visitors see something entirely different. The result is a disconnect between what humans read and what AI understands. ## AI Doesn’t Read Your Website Like People Do Human visitors browse pages visually. - AI systems build an understanding of your business using structured signals. - Schema tells AI what something is. - LLM files explain your products and services in machine-friendly language. - Robots.txt tells crawlers where they should go. - XML sitemaps identify every important page. These systems reinforce one another, so when one becomes outdated or the content is not in sync, the entire visibility starts to weaken. ## Agentic Visibility Depends on Consistency As AI search evolves, we’re entering what many refer to as agentic search—a model where AI agents gather information from multiple technical signals before deciding whether your content is trustworthy enough to recommend. If your page says one thing… - your Schema says another… - your LLM documentation says something different… - and your images no longer match… Then AI has less confidence in your content, and that inconsistency can reduce your visibility, even if your website looks perfectly fine to human visitors. ## The Technical Side Most Editors Never See One of the biggest misconceptions about modern website management is that everything lives inside the content management system. In reality, many of the files and configurations that influence AI visibility exist outside of WordPress, Shopify, Wix, or whatever platform powers your website. Files like llm.txt, robots.txt, XML sitemaps, and structured data often reside in the server’s root directory or require editing JSON, modifying scripts, or understanding Schema.org standards. These aren’t tasks that can typically be handled through a visual page editor, and they require a level of technical knowledge that goes well beyond writing good content. This isn’t a criticism of in-house marketing teams or office employees—they’re usually doing exactly what they’ve been asked to do. **The challenge is that maintaining AI visibility has become a technical discipline**, where every content update may also require changes to machine-readable files and structured data that most editors never even know exist. ## Website Maintenance Has Changed For years, businesses could separate content creation from technical optimization. Today, those two roles are becoming inseparable. Every content update should trigger questions like: - Does the Schema still accurately describe this page? - Does the **llm.txt** or **llms-full.txt** file need updating? - Are image references still valid? - Does the sitemap need to be regenerated? - Should structured data be modified? - Have internal links changed? - Will AI understand these updates correctly? These aren’t questions most office employees—or even many traditional web designers—think to ask. ## AI Visibility Is Becoming a Competitive Advantage Companies that continue treating websites as simple collections of pages risk falling behind competitors whose sites present a complete, consistent technical picture to AI. The organizations that invest in maintaining their structured data, machine-readable documentation, and technical search infrastructure will be easier for AI systems to understand, summarize, recommend, and cite. In the age of AI, publishing content is only half the job. The other half is making sure every technical signal surrounding that content tells the exact same story. That’s no longer just SEO. It’s AI visibility. And for many businesses, it may soon become one of the most important factors determining whether customers find them at all. --- --- title: "Stop Using PayPal as Your Primary eCommerce Payment Processor" url: "https://wallydavid.com/stop-using-paypal-as-your-primary-ecommerce-payment-processor/" lang: "en-US" type: "post" description: "If you're launching a new online store, think carefully before making PayPal your primary checkout option. Platforms like WooCommerce, Shopify, and Toast already require customers to create an account or provide enough information to manage orders, view purchase history, and" last_modified: "2026-07-15T16:17:28+00:00" categories: [Articles] tags: [ecommerce, PayPal, Square, Tips, WordPress] custom_fields: pld_like_count: 23 nectar_blog_post_view_count: 192 --- # Stop Using PayPal as Your Primary eCommerce Payment Processor [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 If you’re launching a new online store, think carefully before making PayPal your primary checkout option. Platforms like WooCommerce, Shopify, and Toast already require customers to create an account or provide enough information to manage orders, view purchase history, and track shipments. Adding PayPal into the mix often introduces a second layer of account management. Increasingly, customers are prompted to sign in to—or create—a PayPal account before completing their purchase. While PayPal still offers value as an optional payment method for customers who actively prefer it, making it the primary checkout experience can create unnecessary friction. Every additional login screen, password prompt, verification code, or account creation request is another opportunity for a customer to abandon their cart. Returning shoppers may not remember which PayPal email they used years ago, may have forgotten their password, or may simply not want to recover another account just to make a purchase. What should be a 30-second checkout can quickly turn into a frustrating multi-step process. Modern payment processors like Square provide a much simpler experience. Customers are presented with a straightforward payment form where they can enter their card information, complete the purchase, and move on. There are no unexpected account requirements, no secondary login, and far fewer interruptions during checkout. The best checkout experience is the one customers barely notice. They click **Checkout**, enter their payment details, receive their confirmation, and continue with their day. Every extra decision or obstacle increases the likelihood of cart abandonment. If you already use PayPal, consider offering it as an alternative payment option rather than making it the default. Give customers the choice, but let the simplest path be the easiest one. At the end of the day, eCommerce success is about reducing friction. The fewer barriers between a customer deciding to buy and actually completing the purchase, the higher your conversion rates will be. --- --- title: "Fun Blocking Countries with CloudFlares Expression Builder" url: "https://wallydavid.com/fun-blocking-countries-with-cloudflares-expression-builder/" lang: "en-US" type: "post" description: "I'm in the US and I get more traffic from Russia, Singapore, India and a hand full of other countries than I care for eroding my client traffic metrics. CloudFlare's UI isn't always great, but its expression builder is pretty" last_modified: "2026-07-09T14:29:48+00:00" categories: [Articles] custom_fields: pld_like_count: 36 nectar_blog_post_view_count: 186 --- # Fun Blocking Countries with CloudFlares Expression Builder [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 I’m in the US and I get more traffic from Russia, Singapore, India and a hand full of other countries than I care for eroding my client traffic metrics. CloudFlare’s UI isn’t always great, but its expression builder is pretty sweet if you figure out how to use it. This solves about 99% of my traffic problems. Throw something like this in the expression builder and suddenly you get a new UI above it that is super easy to visually add more blocked countries too. Silly really. (ip.src.country in {"CA" "LT" "AU" "IN" "SG" "IE" "PL" "CN" "TW" "RU" "NL" "SG" "DE" "HK" "MY" "FR" "HU" "BR"}) ![](https://wallydavid.com/wp-content/uploads/2026/07/cloudflare_countries-1024x803.avif) --- --- title: "WordPress in the Era of AI: Building Websites for Both People and Machines" url: "https://wallydavid.com/wordpress-in-the-era-of-ai-building-websites-for-both-people-and-machines/" lang: "en-US" type: "post" description: "For years, building a successful WordPress website followed a fairly predictable checklist. Create quality content, optimize page speed, install analytics, connect Google Tag Manager, write unique meta titles and descriptions, and make sure the site was mobile-friendly. If you wanted" last_modified: "2026-07-08T14:54:12+00:00" categories: [Articles] custom_fields: nectar_blog_post_view_count: 197 --- # WordPress in the Era of AI: Building Websites for Both People and Machines [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 For years, building a successful WordPress website followed a fairly predictable checklist. Create quality content, optimize page speed, install analytics, connect Google Tag Manager, write unique meta titles and descriptions, and make sure the site was mobile-friendly. If you wanted to take things a step further, you added structured data, improved Core Web Vitals, and worked on backlinks. That approach is no longer enough. Artificial intelligence is changing how websites are discovered, understood, and recommended. Search engines are no longer simply indexing pages for keyword matching—they are interpreting content, relationships, context, and authority through AI models. At the same time, large language models (LLMs) are beginning to use websites as sources of information for conversational search, AI assistants, and autonomous agents. The result is that WordPress development is entering a new phase. Websites are no longer being built solely for human visitors or traditional search engines. They now need to communicate effectively with AI systems as well. ## SEO Has Evolved Into AI Optimization Traditional SEO still matters. Fast websites, quality content, proper heading structures, internal linking, and metadata continue to play an important role. However, AI systems consume information differently than traditional search crawlers. They rely heavily on structured, machine-readable content to understand what a page is about, who created it, how trustworthy it is, and how it relates to the rest of your website. This makes structured data (Schema.org markup) more important than ever. Every significant page should include schema that accurately describes its purpose. That could mean: - Organization schema - Local Business schema - Article schema - Product schema - FAQ schema - Event schema - Service schema - Person schema - Breadcrumb schema Rather than viewing schema as an optional SEO enhancement, it should now be considered part of the content itself. If the visible content changes, the structured data should change with it. ## AI Needs More Than HTML One of the newer concepts gaining attention is providing AI systems with dedicated documentation about your website. Files such as **llms.txt** and **llms-full.txt** are designed to provide structured guidance for AI models, helping them understand your site’s organization, important content, preferred documentation, and available resources. While these files are not yet an official web standard in the same way as robots.txt or sitemap.xml, they are increasingly being discussed and adopted as AI crawlers become more common. Think of these files as an instruction manual for AI. Instead of forcing an AI system to discover everything page by page, these files provide a curated overview of your website, making it easier for AI agents to understand your business and retrieve accurate information. For organizations producing technical documentation, software, APIs, knowledge bases, or large collections of articles, these files can become especially valuable. ## The Rise of Agentic Browsing One of the biggest changes happening in search is the emergence of AI agents capable of completing tasks on behalf of users. Rather than simply displaying ten blue links, AI systems can increasingly summarize information, compare products, answer questions, complete forms, and even navigate websites autonomously. Google has begun surfacing additional AI-related metrics within its developer tooling, including references to agentic browsing capabilities in PageSpeed Insights. While these metrics are still evolving, they signal an important shift: websites are increasingly being evaluated not only for how humans experience them, but also for how effectively AI agents can interpret and navigate them. This represents a significant change in website optimization. The question is no longer just: _“Can Google crawl my website?”_ It is becoming: _“Can an AI agent understand my website?”_ ## A New Maintenance Problem This shift also creates a challenge that many agencies and website owners have not yet considered. Traditionally, editing a page meant updating the visible content and publishing the changes. Today, that may no longer be enough. Suppose a marketing employee updates a product page, rewrites an article, changes pricing, or modifies service information. The visible content changes immediately. But what about: - Product schema - Article schema - FAQ schema - Organization data - llms.txt - llms-full.txt - Internal AI documentation - Knowledge files If those behind-the-scenes resources aren’t updated as well, your website may begin serving inconsistent information. Human visitors see one version, while search engines and AI systems continue referencing outdated structured data. Over time, this inconsistency can reduce the effectiveness of both traditional SEO and AI-driven search experiences. ## Content Management Is Becoming Knowledge Management WordPress has traditionally been a content management system. In the AI era, it is becoming a knowledge management system. Every page now contains two equally important layers: **The human layer** - Written content - Images - Video - Calls to action - Navigation **The machine layer** - Structured schema - Metadata - Canonical information - XML sitemaps - llms.txt - llms-full.txt - Semantic relationships - Entity information Both layers must remain synchronized. > Changing one without updating the other creates technical debt that often goes unnoticed until search visibility or AI-generated answers begin to suffer. ## Agencies Need New Workflows This evolution changes the responsibilities of agencies and freelance developers. Launching a website is no longer the finish line. Modern maintenance plans should include: - Regular schema validation - AI visibility reviews - Metadata audits - LLM documentation updates - Technical SEO monitoring - Structured data testing - Content consistency reviews > Likewise, clients need to understand that editing a page is no longer just about changing text. A seemingly simple content update may require corresponding updates to structured data and AI-facing documentation to ensure every layer of the website stays aligned. ## Looking Ahead The next generation of websites won’t be optimized solely for search engines or human visitors—they’ll be optimized for intelligent systems that read, interpret, summarize, and act on information. Just as responsive design became mandatory with the rise of smartphones, AI readiness is becoming an essential part of modern web development. The websites that perform best over the coming years will be those that treat structured data, semantic markup, and AI documentation as core components of their content strategy rather than optional technical extras. WordPress remains one of the most flexible content management systems available, but succeeding in the AI era requires a broader mindset. Building a great website now means creating a site that speaks clearly to people, search engines, and AI alike. Those who embrace that shift early will be better positioned as AI continues to reshape how information is discovered, understood, and delivered. --- --- title: "My Site Had Fake Schema Markup for Who Knows How Long (and How I Fixed It)" url: "https://wallydavid.com/my-site-had-fake-schema-markup-for-who-knows-how-long-and-how-i-fixed-it/" lang: "en-US" type: "post" description: "I sell “schema-first AIO” on my SEO page. So imagine my face when I actually looked at what my own site was outputting and found my Organization schema pointing to linkedin.com/in/your-profile, twitter.com/your-handle, and facebook.com/your-page. Not typos. Literal placeholder text. Live," last_modified: "2026-07-22T15:47:18+00:00" categories: [Articles] custom_fields: pld_like_count: 67 nectar_blog_post_view_count: 147 --- # My Site Had Fake Schema Markup for Who Knows How Long (and How I Fixed It) [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 I sell “schema-first AIO” on my SEO page. So imagine my face when I actually looked at what my own site was outputting and found my Organization schema pointing to linkedin.com/in/your-profile, twitter.com/your-handle, and facebook.com/your-page. Not typos. Literal placeholder text. Live, on every page, probably since the day I installed the plugin. ## How I didn’t notice Schema markup lives in a script type="application/ld+json" tag in your page’s head — invisible unless you View Source or run the page through a validator. I run a plugin called Schema App Structured Data, which does exactly what it says: auto-generates Organization, WebSite, Person, and ProfessionalService schema for the whole site out of the box. Convenient. Set it and forget it. Except “set it and forget it” also means “never actually check what it set.” The plugin ships default example values for fields like sameAs (your social profile links), and if you don’t go fill those in yourself, they stay as the examples. Forever. Mine had been sitting there unfixed, and since it’s invisible without inspecting the code, nothing ever flagged it — not Google, not a broken layout, nothing. Just silently telling every crawler and AI system that my LinkedIn is “your-profile.” Same story with areaServed: set to “Worldwide” by default. I work with clients in West Michigan — Muskegon, Grand Rapids, Grand Haven, Holland, Battle Creek. “Worldwide” isn’t wrong exactly, it’s just useless. It tells search engines and AI systems nothing about where I actually operate, which matters a lot for local search and even more for how AI Overviews decide who to recommend for “web developer near me” type queries. ## Why this actually matters (not just embarrassing) AI Overviews and chat-based search lean on structured data to decide what to trust and cite. They’re not reading your page like a human — they’re parsing the schema to understand what you are, what you do, and where you do it. Placeholder data doesn’t just fail to help; it actively tells these systems the wrong thing, or nothing useful at all. If I’m pitching clients on getting this right, my own site is the first place it needs to be right. ## What I actually fixed The free tier of the plugin doesn’t expose these fields anywhere in the WordPress settings — no field to type your real LinkedIn URL, no field for your real service area. That’s apparently locked behind their paid tier. So rather than pay for a whole platform upgrade to fix three URLs and a location string, I added a small, targeted JSON-LD block of my own with the correct data: {   "@context": "https://schema.org",   "@graph":     },     {       "@type": "ProfessionalService",       "name": "Wally David Web Design & Development",       "areaServed": ,       "serviceType":     }   ] } Full transparency: this means I’ve technically got two Organization entities floating around in my page source right now — the plugin’s (still broken) and mine (accurate). Not the cleanest end state, and it’s on my list to properly clean up by either overriding the plugin’s output at the code level or finally deciding whether the paid tier is worth it. But between shipping accurate data alongside a stale duplicate, versus leaving fake placeholder links live indefinitely, this was the faster fix. ## The actual takeaway If you’re running any plugin that auto-generates schema for you — and a lot of SEO plugins do — go look at what it’s actually outputting. Not the settings page. The rendered HTML. View Source, search for ld+json, and read it. Plugins are good at generating the skeleton; they are not good at knowing your real social profiles, your real service area, or anything specific to your business. That part’s still on you. Run your own site through [Google’s Rich Results Test](https://search.google.com/test/rich-results) or the [Schema.org Validator](https://validator.schema.org/) this week. If you find your own “your-profile” moment, you’re not alone — and it’s a fifteen-minute fix once you know to look. Need help auditing what your site is actually telling search engines and AI systems about you? That’s exactly what my [SEO & AIO services](https://wallydavid.com/seo/) cover — [get in touch](https://wallydavid.com/contact/) and I’ll take a look. --- --- title: "Use Shortcode’s with SCF (Secure Custom Fields)" url: "https://wallydavid.com/use-shortcodes-with-scf-secure-custom-fields/" lang: "en-US" type: "post" description: "An hour of digging through documentation, reddit, and blogs, I ended up having to watch a stupid video to get this function. RANT: Secure Custom Fields disables short codes by default now. Who knew, I hardly use it, but it" last_modified: "2026-06-16T15:11:56+00:00" categories: [Articles] custom_fields: nectar_blog_post_view_count: 186 --- # Use Shortcode’s with SCF (Secure Custom Fields) [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 An hour of digging through documentation, reddit, and blogs, I ended up having to watch a stupid video to get this function. RANT: Secure Custom Fields disables short codes by default now. Who knew, I hardly use it, but it was frustrating trying to find this for sure. I would think this would be a toggle or setting, but I know that UX isn’t a strong skill set for the Automatic people MATT. So anyways, add this to your functions to make SCF an actual useful plugin again. function acf_field_shortcode($atts) {   $atts = shortcode_atts(array(     'field' => '',     'post_id' => false,   ), $atts, 'acf');   if (function_exists('get_field')) {     $field_value = get_field($atts['field'], $atts['post_id']);     if (is_array($field_value)) {       return esc_html(print_r($field_value, true));     } else {       return esc_html($field_value);     }     }   return ''; } add_shortcode('acf', 'acf_field_shortcode'); --- --- title: "Salient – How to remove the period in the copyright text" url: "https://wallydavid.com/salient-how-to-remove-the-period-in-the-copyright-text/" lang: "en-US" type: "post" description: "A dumb theme design thing that I have to change all the time. Just a reminder. salient > nectar > helpers > footer.php See LINE 112 Change this... $copyright_text = '© '. date( 'Y' ) . ' ' . esc_html(" last_modified: "2026-06-12T19:24:23+00:00" categories: [Articles] tags: [Salient Theme, Tech Support Help, WordPress, WordPress Plugin] custom_fields: pld_like_count: 62 nectar_blog_post_view_count: 177 --- # Salient – How to remove the period in the copyright text [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 A dumb theme design thing that I have to change all the time. Just a reminder. salient > nectar > helpers > footer.php See LINE 112 Change this... $copyright_text = '© '. date( 'Y' ) . ' ' . esc_html( get_bloginfo( 'name' ) ) . '. '; to this... $copyright_text = '© '. date( 'Y' ) . ' ' . esc_html( get_bloginfo( 'name' ) ) . ' '; --- --- title: "A WordPress Developers Review and Thoughts on Base44" url: "https://wallydavid.com/a-wordpress-developers-review-and-thoughts-on-base44/" lang: "en-US" type: "post" description: "I've been using Base44 for a while now in my production workflow trying to make a case for certain AI platforms as viable development solutions. From the perspective of a WordPress developer, Base44 shines as an exceptional, highly efficient platform" last_modified: "2026-06-12T19:20:47+00:00" categories: [Articles] custom_fields: pld_like_count: 243 pld_dislike_count: 3 nectar_blog_post_view_count: 183 --- # A WordPress Developers Review and Thoughts on Base44 [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 I’ve been using Base44 for a while now in my production workflow trying to make a case for certain AI platforms as viable development solutions. From the perspective of a WordPress developer, Base44 shines as an exceptional, highly efficient platform for rapid prototyping and spinning up live UI examples. It dramatically speeds up the initial UI/UX development phase by allowing designers and developers to visually experiment with layouts and interactions in real time. Instead of relying on a traditional, structured code editor, the platform utilizes an object selector paired with an AI prompt system. This unique interface lets you select a specific element on the page and simply prompt the AI to revise its style, look, or layout on the fly, making early-stage conceptualization incredibly fluid and fast. However, this prompt-driven workflow quickly falls apart when attempting to build fully realized, content-heavy websites or managing ongoing maintenance. Because Base44 completely lacks unified CSS stylesheets, global templates, or a centralized theme system, executing sweeping aesthetic changes across a site becomes an incredibly tedious chore. Every single page and element must be updated manually through individual AI prompts, rather than updating a single template file as you would in WordPress. Furthermore, without a defined content editor, the platform is virtually unusable for blogging or managing dynamic, scaling content. Ultimately, while Base44 is a powerful tool for accelerating front-end UI mockups, its structural limitations mean it won’t be replacing the robust architecture and scalability of WordPress development anytime soon. --- --- title: "Disable WordPress Patterns Sub Menu – Again" url: "https://wallydavid.com/disable-wordpress-patterns-sub-menu-again/" lang: "en-US" type: "post" description: "The ways I hate WordPress some days are endless. I'm pretty sure they think if they just keep renaming the patterns page ID maybe people will use it. Nope -- and my hot take is if you're a nutty WordPress" last_modified: "2026-06-03T18:30:02+00:00" categories: [Articles] custom_fields: pld_like_count: 36 pld_dislike_count: 1 nectar_blog_post_view_count: 163 --- # Disable WordPress Patterns Sub Menu – Again [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 The ways I hate WordPress some days are endless. I’m pretty sure they think if they just keep renaming the patterns page ID maybe people will use it. Nope — and my hot take is if you’re a nutty WordPress purist using any part of Gutenberg you’re a horrible developer. There.. I said it out loud. Anyway, here is a a few methods to hide this nonsense from end users. Method 1 – Works 6.9 – 7.0 add_action( 'admin_menu', function() {     remove_submenu_page('themes.php', 'site-editor.php?path=/patterns'); }, 999 ); Method 2 – doesn’t work anymore add_action( 'admin_menu', function() {        remove_submenu_page( 'themes.php', 'edit.php?post_type=wp_block' ); }, 999 ); Method 3 – doesn’t work anymore add_action( 'after_setup_theme', function() {     // Removes the default core patterns     remove_theme_support( 'core-block-patterns' ); }); --- --- title: "Google launches “Mothership Advantage” Gemini 3.5 AI Search before rivals can replace it" url: "https://wallydavid.com/google-launches-mothership-advantage-gemini-3-5-ai-search-before-rivals-can-replace-it/" lang: "en-US" type: "post" description: "Tone down the hype. Despite what \"experts\" claim, no AI platform can touch Google’s LLM development. Google owns the world’s largest data funnel: its search engine. While others scrape public data, Google processes billions of daily user queries and behaviors." last_modified: "2026-05-21T20:20:16+00:00" categories: [Articles] custom_fields: pld_like_count: 43 pld_dislike_count: 1 nectar_blog_post_view_count: 201 --- # Google launches “Mothership Advantage” Gemini 3.5 AI Search before rivals can replace it [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 **Tone down the hype. **Despite what “experts” claim, no AI platform can touch Google’s LLM development.** **Google owns the world’s largest data funnel: its search engine. While others scrape public data, Google processes billions of daily user queries and behaviors. They capture the entire lifecycle of information, from the initial user question to the final destination where AI content (even 3rd-party) is hosted, like YouTube or Search Console-linked sites. That being said, Google’s new AI search bar is the biggest overhaul to its interface in 25 years. This shift is a direct counter to the rise of rival AI platforms like Claude and ChatGPT, which have become go-to spots for product and service inquiries. While competitors still struggle with “hallucinations,” they are improving rapidly. > _Despite platforms like ChatGPT and Clauds growth, 71% of users on these platforms still verify data responses in Google to fact check with a “trust but verify” approach. A trust problem that Google doesn’t have._ **Google’s response. **Powered by Gemini 3.5, Google AI-Powered search mirrors many of ChatGPT and Claud’s features—saving history in “Threads” and generating text, images, and code—but with one massive advantage: it pulls data directly from the “Google Mothership” rather than just scraping the surface of the web like other AI platforms. **Food for thought.** Because Google controls so much of the web ecosystem through APIs, cloud services, Android, Workspace, Search, and advertising infrastructure, competing AI platforms often struggle to match Google’s level of access to real-world generative content distribution and integration. My thoughts are the new AI-powered Search experience is also significantly faster, more agentic, and capable of generating interactive layouts, dashboards, simulations, and advanced summaries directly inside search results that its going to be impossible to ignore. Google is positioning Gemini 3.5 as an “AI action layer” across Search, Chrome, Workspace, Android, and Shopping — allowing Search to not only answer questions, but actively monitor information, automate workflows, and assist with complex tasks. Search yes, but also something like Claud and OpenClaw assistive AI alternatives for the masses, but with Google integration. // ![AI Search Drain](https://wallydavid.com/wp-content/uploads/2026/05/AI-Results-Drain-1024x661.avif) --- --- title: "AI is not even close to killing WordPress development yet" url: "https://wallydavid.com/ai-is-not-even-close-to-killing-wordpress-development-yet/" lang: "en-US" type: "post" last_modified: "2026-07-22T14:53:13+00:00" categories: [Articles] custom_fields: pld_like_count: 86 pld_dislike_count: 2 nectar_blog_post_view_count: 211 --- # AI is not even close to killing WordPress development yet [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 [/toggle][toggle color=”Default” heading_tag=”default” heading_tag_functionality=”default” title=”The Real-World Cons”][/toggle][toggle color=”Default” heading_tag=”default” heading_tag_functionality=”default” title=”Where These Tools Actually Shine”][/toggle][/toggles] --- --- title: "SynthID Watermark may be the most impactful thing Google Announced" url: "https://wallydavid.com/synthid-watermark-may-be-the-most-impactful-thing-google-announced/" lang: "en-US" type: "post" description: "Of everything I watched during Googles announcement for Gemini 3.5, SynthID watermarking may end up being the most impactful change for consumers. In an effort to improve trust and transparency around AI-generated content, companies like OpenAI, Nvidia, Kakao, and ElevenLabs" last_modified: "2026-05-21T13:04:37+00:00" categories: [Articles] custom_fields: pld_like_count: 243 pld_dislike_count: 9 nectar_blog_post_view_count: 199 --- # SynthID Watermark may be the most impactful thing Google Announced [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Of everything I watched during Googles announcement for Gemini 3.5, SynthID watermarking may end up being the most impactful change for consumers. In an effort to improve trust and transparency around AI-generated content, companies like OpenAI, Nvidia, Kakao, and ElevenLabs and others have already adopted Google’s SynthID system to watermark AI-generated media. That means AI-created content can now be identified and labeled across search results and other platforms. (Think AI songs on Spotify, AI reels on facebook or combatting fake AI generated news.) There was a time when people could generate AI content, tweak a few words, and pass it off as completely original. That era is ending. SynthID is designed to persist even through edits, compression, and modifications. This applies to images, video, audio and written content as well. As Google expands SynthID detection across Google Search, Chrome, and the Gemini app, users will have more visibility into where that content actually came from and whether AI played a role in creating it. So all that ChatGPT website content will now be detected and labeled as AI generated on your search result – and I couldn’t be happier. AI is an incredible tool when used responsibly. But transparency matters. Use AI to assist creativity, not replace originality while pretending it was entirely human-made. Read the announcements here: https://lnkd.in/g9BuPnpy --- --- title: "Why Your Google Business Profile Is Just as Important as Your Website for Local SEO" url: "https://wallydavid.com/why-your-google-business-profile-is-just-as-important-as-your-website-for-local-seo/" lang: "en-US" type: "post" description: "Your Google Business Profile is just as important as your website for local SEO, yet many businesses overlook it. In many searches, especially local “near me” results, Google Maps and GBP listings appear before traditional website rankings. That means your" last_modified: "2026-05-20T03:07:49+00:00" categories: [Articles] tags: [AI search, Google, Google Business Profile, SEO] custom_fields: pld_like_count: 62 nectar_blog_post_view_count: 190 --- # Why Your Google Business Profile Is Just as Important as Your Website for Local SEO [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Your Google Business Profile is just as important as your website for local SEO, yet many businesses overlook it. In many searches, especially local “near me” results, Google Maps and GBP listings appear before traditional website rankings. That means your profile is often the first impression customers see. A properly optimized GBP helps businesses rank throughout West Michigan by expanding services, updating contact information, adding accurate hours, and defining service areas. Businesses offering 24-hour emergency services often rank higher because Google prioritizes immediate availability for local searches. Service area settings also help companies appear in surrounding cities and regional searches beyond their physical address. ## Your GBP Is Often the First Impression — Not Your Website In modern local search, users frequently make decisions directly from Google Maps results without ever visiting a website. This means your Google Business Profile is no longer optional marketing support — it is a core part of your local SEO strategy. ### Photos play a role as well. While geotagged images and EXIF metadata are not officially confirmed ranking factors, Google can read photo descriptions, tags, and geo data, helping reinforce local relevance in geographic searches. Uploading original photos from actual jobs throughout West Michigan can improve trust and visibility. ### Business Attributes Can Influence Visibility Additional profile attributes such as Hispanic-owned, Woman-owned, Veteran-owned, or LGBTQ+ friendly can also help businesses stand out in filtered searches and local results above competitors that ignore these settings. ### Review Responses Matter More Than Most Businesses Realize Reviews are equally important for both SEO and PPC campaigns. A business can spend heavily on paid ads, but if users click and see a poor star rating, they are unlikely to convert. Managing reviews, responding professionally, and maintaining strong ratings improves customer trust, click-through rates, and overall local search performance. ## Businesses that treat GBP as seriously as their website consistently outperform competitors that neglect it. --- --- title: "Most SEO Tools Display Disconnected Vanity Metrics That Don’t Matter" url: "https://wallydavid.com/most-seo-tools-display-disconnected-vanity-metrics-that-dont-matter/" lang: "en-US" type: "post" description: "There is only one metric in all of SEO and PPC that matters - Conversion. Full stop. Many businesses and marketing teams (myself included) are becoming frustrated with traditional SEO reporting platforms like Moz, SpyFu, AgencyAnalytics, and Semrush because the" last_modified: "2026-05-20T03:10:16+00:00" categories: [Articles] tags: [Agentic AI, Moz, PPC, SemRush, SEO, SpyFu] custom_fields: pld_like_count: 125 pld_dislike_count: 2 nectar_blog_post_view_count: 193 --- # Most SEO Tools Display Disconnected Vanity Metrics That Don’t Matter [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 There is only one metric in all of SEO and PPC that matters – Conversion. Full stop. Many businesses and marketing teams (myself included) are becoming frustrated with traditional SEO reporting platforms like Moz, SpyFu, AgencyAnalytics, and Semrush because the data often feels disconnected from actual business performance. These platforms rely heavily on estimated third-party metrics such as Domain Authority, keyword difficulty, backlink scores, visibility indexes, or projected traffic models — not the real first-party engagement and conversion data businesses care about most. While those metrics can provide directional insight, they frequently fail to answer the questions executives and business owners are actually asking: _Did the website generate leads? Did organic search produce sales? Did users convert?_ One of the biggest frustrations is that many SEO tools still operate around outdated ranking-era metrics rather than modern search behavior, AI-driven discovery, and user intent. Businesses are paying for dashboards filled with estimated traffic graphs while overlooking the most important source of truth available: actual performance data from Google Search Console, analytics, CRM systems, call tracking, eCommerce events, and server-side conversion tracking. **A keyword ranking or authority score means very little if the traffic does not convert into revenue, appointments, applications, or customer engagement.** This gap becomes even more obvious as AI search, AI Overviews, voice assistants, and IoT devices increasingly rely on real-world content engagement signals instead of vanity metrics. Modern AI systems evaluate topical relevance, structured data, entity relationships, user interaction patterns, and content usefulness far more than arbitrary authority scores created by third-party SEO vendors. Businesses are beginning to realize that “estimated traffic” is often less valuable than understanding: - Which pages generate qualified leads - Which searches drive actual conversions - Which content creates engagement or sales - How users behave after arriving - Whether AI systems can interpret and trust the content Agentic AI and first-party data integrations are shifting the industry toward a more accurate model. Instead of relying on broad external estimates, AI-driven systems can now analyze live Search Console data, analytics events, conversion funnels, CRM records, phone calls, and behavioral metrics to identify what is truly impacting business growth. This approach focuses on outcomes instead of assumptions — measuring revenue, engagement, and user intent rather than assigning arbitrary scores to websites. For many companies, the future of SEO and digital marketing reporting is not another “authority metric.” It is the ability to combine real search visibility data with actual business conversions using AI-powered analysis that can interpret trends, identify opportunities, and connect search behavior directly to measurable ROI. --- --- title: "SERP FAQ Removal – OMG The Sky Isn’t Falling" url: "https://wallydavid.com/serp-faq-removal-omg-the-sky-isnt-falling/" lang: "en-US" type: "post" last_modified: "2026-05-20T03:08:21+00:00" categories: [Articles] tags: [AI search, Rich Results, Schema, SEO, serp] custom_fields: pld_like_count: 48 nectar_blog_post_view_count: 197 --- # SERP FAQ Removal – OMG The Sky Isn’t Falling [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "Website Development Services | Custom WordPress & Web Design | Wally David" url: "https://wallydavid.com/website-development/" lang: "en-US" type: "page" last_modified: "2026-07-22T13:23:27+00:00" custom_fields: nectar-metabox-portfolio-display: "all" nectar-metabox-portfolio-display-sortable: "off" --- # Website Development Services | Custom WordPress & Web Design | Wally David [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "SEO & AIO Services" url: "https://wallydavid.com/seo/" lang: "en-US" type: "page" last_modified: "2026-07-22T16:21:15+00:00" custom_fields: nectar-metabox-portfolio-display: "all" nectar-metabox-portfolio-display-sortable: "off" --- # SEO & AIO Services [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "Got To Get That EST" url: "https://wallydavid.com/got-to-get-that-est/" lang: "en-US" type: "post" description: "DateTime::getTimestamp() returns unix timestamp. That number is always UTC. What you want is format the date according to your time zone. Use this if you have multiple time zones and don't want to fiddle with the server time settings. $dt" last_modified: "2026-04-17T14:31:39+00:00" categories: [Articles] tags: [cPanel, Hacking, PHP, Tips, Web Development] custom_fields: nectar_blog_post_view_count: 254 --- # Got To Get That EST [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 DateTime::getTimestamp() returns unix timestamp. That number is always UTC. What you want is format the date according to your time zone. Use this if you have multiple time zones and don’t want to fiddle with the server time settings. $dt = new DateTime("now", new DateTimeZone('America/Detroit')); echo $dt->format('m/d/Y, H:i:s'); echo 'EST'; --- --- title: "Killing the Pattern Menu – Again" url: "https://wallydavid.com/killing-the-pattern-menu-again/" lang: "en-US" type: "post" description: "I do a lot of WordPress dashboard customization—and I still can’t stand the block editor. When tools like Elementor and Visual Composer are powering the vast majority of builds (something like 80–90%), the Customizer along with the Block and Patterns" last_modified: "2026-04-14T20:35:13+00:00" categories: [Articles] custom_fields: pld_like_count: 22 nectar_blog_post_view_count: 253 --- # Killing the Pattern Menu – Again [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 I do a lot of WordPress dashboard customization—and I still can’t stand the block editor. When tools like Elementor and Visual Composer are powering the vast majority of builds (something like 80–90%), the Customizer along with the Block and Patterns menus feel completely out of place in a tailored admin experience. They just sit there, cluttering things up and breaking the flow of an otherwise clean, purpose-built dashboard. And of course, the code to hide them seems to change every other release. So this is basically a note to myself about which workaround actually works this week—another unnecessary bit of trivia I shouldn’t have to keep relearning. function remove_menus_appearance_patterns(){       // Appearance > Patterns       // uses '?p=pattern' in WP versions from 2025+         remove_submenu_page( 'themes.php', 'site-editor.php?p=/pattern' );     // older WP versions may need one of these instead     remove_submenu_page( 'themes.php', 'site-editor.php?path=/patterns' );     remove_submenu_page( 'themes.php', 'edit.php?post_type=wp_block' ); }   add_action('admin_menu', 'remove_menus_appearance_patterns'); --- --- title: "Prevent other Admins from Promoting other Admins" url: "https://wallydavid.com/prevent-other-admins-from-promoting-other-admins/" lang: "en-US" type: "post" description: "Sometimes I hate the things I have to know about WordPress. I shouldn't have to know this. \"Make your client an admin, then use this so they can't make more admins without asking.\" Add this to your functions to make" last_modified: "2026-04-14T20:40:49+00:00" categories: [Articles] custom_fields: pld_like_count: 17 nectar_blog_post_view_count: 257 --- # Prevent other Admins from Promoting other Admins [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Sometimes I hate the things I have to know about WordPress. I shouldn’t have to know this. **“Make your client an admin, then use this so they can’t make more admins without asking.”** Add this to your functions to make it work, then comment it out when you need to actually add a new admin. Or turn it into a plugin so you can activate and deactivate it. // Prevents promoting anyone to admin add_filter( 'editable_roles', function( $roles ) {   unset( $roles['administrator'] );      return $roles; } ); --- --- title: "EmDashCMS.com Would Have Been Awesome 8 Years Ago" url: "https://wallydavid.com/emdashcms-com-would-have-been-awesome-8-years-ago/" lang: "en-US" type: "post" description: "After spending a week experimenting with Cloudflare’s EmDash CMS, here’s where I’ve landed: this feels like the version of WordPress many of us were hoping for about eight years ago—before Gutenberg entered the picture. EmDash brings some genuinely solid ideas" last_modified: "2026-04-10T15:19:02+00:00" categories: [Articles] tags: [EmDash, Logo Development, WordPress Alternatives] custom_fields: pld_like_count: 83 pld_dislike_count: 2 nectar_blog_post_view_count: 274 --- # EmDashCMS.com Would Have Been Awesome 8 Years Ago [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 After spending a week experimenting with [Cloudflare’s EmDash CMS](http://emdashcms.com/), here’s where I’ve landed: this feels like the version of WordPress many of us were hoping for about eight years ago—before Gutenberg entered the picture. [EmDash brings some genuinely solid ideas to the table](https://blog.cloudflare.com/emdash-wordpress/), especially around sandboxing plugins and limiting arbitrary code execution. The interface is clean, polished, and thoughtfully designed—it has that familiar WordPress feel, just more refined. At the same time, it’s hard not to feel like this kind of innovation arrived a bit late. If something like this had launched alongside WordPress 5, there’s a real argument that WordPress might have been joined platforms like Drupal or ExpressionEngine on the “legacy” shelf. The Block Editor still ranks among the most controversial shifts in WordPress history, but EmDash doesn’t offer much in the way of editing either other than a slightly better classic editing experience. That said, the landscape has already shifted. Tools like Elementor, Visual Composer, and even the Block Editor have fundamentally changed how people approach CMS-driven development. EmDash, by contrast, skips visual editing entirely and leans on a more traditional TinyMCE-style experience. For some, that’s refreshing—but it also brings back old frustrations. Formatting quirks persist, and that all-too-familiar moment where bolding a headline unexpectedly affects an entire paragraph is still very much alive. There are also ecosystem gaps. While plugin sandboxing is a smart approach, compatibility with major players like WooCommerce, Yoast, Gravity Forms, and Contact Form 7 just isn’t there yet—not even close. And framing plugins broadly as a “security crisis” feels a bit overstated. Plugins can absolutely introduce risk, but they’re also a core part of what makes platforms like WordPress so powerful when used responsibly. From a technical standpoint, EmDash feels like a well-executed [AI-driven concept](https://github.com/emdash-cms/emdash)—something that could scale nicely—but it raises questions about who it’s really for. The simplicity of spinning up a WordPress site is gone, replaced by a setup that depends on Cloudflare infrastructure or a Node.js environment. That alone shrinks the potential user base dramatically—from the massive portion of the web that can run WordPress to a much smaller, more technically inclined audience. In short: impressive, thoughtful, and full of potential—but also late to the party and facing an uphill climb. ![EmDash CMS by CloudFlare](https://wallydavid.com/wp-content/uploads/2026/04/EnDash-1024x762.avif) --- --- title: "YayMail and other fun ways to die slowly" url: "https://wallydavid.com/yaymail-and-other-fun-ways-to-die-slowly/" lang: "en-US" type: "post" description: "I’m fairly certain there’s a special corner of hell reserved for WordPress plugin developers who built their careers on upselling half-baked “freemium” tools. That said, I’ve never been a fan of the word no—and I like paying for things even" last_modified: "2026-04-10T15:20:05+00:00" categories: [Articles] tags: [Hacking, Logo Development, Rant, Tech Support Help, Tips, Web Development, WordPress] custom_fields: pld_like_count: 12 pld_dislike_count: 2 nectar_blog_post_view_count: 275 --- # YayMail and other fun ways to die slowly [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 I’m fairly certain there’s a special corner of hell reserved for WordPress plugin developers who built their careers on upselling half-baked “freemium” tools. That said, I’ve never been a fan of the word _no_—and I like paying for things even less. Which is exactly why it pays to know how to tear things apart and rebuild them. Channel that development rage into something useful—focused, critical problem-solving. Case in point: **WooCommerce**, the best worst option for running eCommerce on WordPress. This post is mostly a note to my future self so I don’t have to rediscover this nonsense later. **Today’s lesson:**WooCommerce, unsurprisingly, does _not_ provide a shortcode or block for outputting just the product name in email templates. Instead, you get “Order Details,” which—shocking—dumps the full order: pricing, totals, and a clunky table layout. That’s fine until you’re not actually selling anything and are using Woo as a free event registration system, where all you really need is the product name and quantity output in the customer email receipt. I usually rely on YayMail to customize WooCommerce emails. Another freemium plugin I refuse to pay for. But like WooCommerce itself, it’s still constrained by whatever limited output Woo allows. A quick search turns up the same answer everywhere: you can’t do it cleanly—just hack it together by hiding unwanted table elements with CSS. Perfect. Fortunately, WooCommerce spits out some truly awful HTML. So I responded in kind—layering in my own equally questionable HTML and CSS. If there’s one constant in development, it’s this: I will bend things to my will, one way or another. **Let’s turn the left image into the right image.** ![YayMail Display Product Title Only](https://wallydavid.com/wp-content/uploads/2026/04/YayMail-1024x466.avif) Click the gear icon at the top LEFT of the specific email you are editing in YayMail to access the global settings. Enable custom CSS and add this nonsense. .yaymail-product-name::before {   content: 'Event: ';   font-weight: 600; } .yaymail_item_quantity_content::before {   content: 'Quantity: ';   font-weight: 600;   padding-right: 10px; } .yaymail_item_quantity_content {   border-width: 0px !important;   padding: 0px !important;   width: 100% !important;   display: flex; } .yaymail_item_product_content {   border-width: 0px !important;   padding: 0px !important;   width: 100% !important;   display: flex; } .yaymail-order-details-table {   border-width: 0px !important; } .yaymail_item_product_title {   display: none; } .yaymail_item_quantity_title {   display: none; } .yaymail_item_price_title {   display: none; } .yaymail-product-sku {   display: none; } .yaymail-order-detail-row-cart_subtotal {   display: none; } .yaymail-order-detail-row-shipping {   display: none; } .yaymail-order-detail-row-payment_method {   display: none; } .yaymail-order-detail-row-order_total {   display: none; } .yaymail_item_price_content {   display: none; } Add a custom text area to the email template and delete everything. From the menu open code view and insert something like this.
Hi [yaymail_billing_first_name],
You are registered for the whatever Expo. Please print or show this email at the event for entry.

Registration #: [yaymail_order_number]
Registered Attendees: [yaymail_order_product_line_item_count]
Order Date: [yaymail_order_date]
[yaymail_order_details]

--- --- title: "Expressions To Geo Block Individual State Traffic With CloudFlare" url: "https://wallydavid.com/expressions-to-geo-block-individual-state-traffic-with-cloudflare/" lang: "en-US" type: "post" description: "Cloudflare has become the go-to solution for high-traffic websites. If you’re working in web development, understanding traffic distribution and load balancing isn’t optional—and Cloudflare is one of the most powerful (and easiest) platforms to set up and manage, especially for" last_modified: "2026-03-27T13:56:15+00:00" categories: [Articles] custom_fields: pld_like_count: 43 nectar_blog_post_view_count: 312 --- # Expressions To Geo Block Individual State Traffic With CloudFlare [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Cloudflare has become the go-to solution for high-traffic websites. If you’re working in web development, understanding traffic distribution and load balancing isn’t optional—and Cloudflare is one of the most powerful (and easiest) platforms to set up and manage, especially for WordPress. I currently manage two sites I’d consider extremely high traffic: one for a festival and another for a government assistance program. They consistently handle anywhere from 90,000 to 1.5 million hits within a 30-day window. Because I like digging into Web Application Firewall (WAF) rules, I’m constantly tweaking configurations to improve performance and reduce server load. One of the most underrated features in Cloudflare’s WAF is the [Expression Editor](https://developers.cloudflare.com/ruleset-engine/rules-language/expressions/edit-expressions/)—and the [Expression Builder](https://developers.cloudflare.com/ruleset-engine/rules-language/expressions/edit-expressions/#expression-builder) alongside it. There’s a straightforward country-blocking feature built into the WAF, along with solid analytics that show where traffic originates globally (the U.S., in my case). What’s less obvious is how to block traffic at the state level. The reason for this comes down to how internet infrastructure works in the United States. Unlike countries that often have clearly defined IP ranges, U.S. traffic is routed through a large network of shared nodes—roughly 250 nodes and thousands of data centers distributed across regions. Because states don’t have cleanly separated IP pools, state-by-state blocking isn’t something you’ll typically find as a default firewall feature. So how do you block traffic from places like California, Texas, or Florida on a Michigan-only assistance site? After a conversation with a technician from GRR-IX and DET-IX, I learned that while nodes share IP space, they can still perform a level of geolocation. Even if a node in Grand Rapids is serving traffic across Michigan, Wisconsin, and Ohio, it can still make educated guesses about origin. This is where Cloudflare’s expression-based rules come in. It’s not perfect—expect roughly 90% accuracy—but it’s effective in many scenarios. For example, blocking traffic from California or Texas while serving Michigan users generally works well, since those regions don’t typically share infrastructure. However, trying to block neighboring states like Wisconsin, Indiana, or Ohio can backfire, as shared nodes may result in legitimate Michigan users getting caught in the filter. Sound a little messy? It is—but it works. Now, let’s get into how to actually block states using expressions. **(1) Start by adding a new CUSTOM Rule:** ![CloudFlare Custom Rules](https://wallydavid.com/wp-content/uploads/2026/03/Screenshot-2026-03-26-at-11.21.04-AM.jpg) **(2) Name your rule the click the EDIT EXPRESSION link:** ![CloudFlare Edit Expression URL](https://wallydavid.com/wp-content/uploads/2026/03/Screenshot-2026-03-26-at-11.21.36-AM.jpg) **(3) Copy and paste the following code into the editor and add the state abbreviations that you want to block traffic from.** ip.src.region_code in {"FL" "LA" "CA" "TX" "AK" "GA" "TN" "WI" "OH" "Ny" "WA"'} ![CloudFlare WAF State Blocking Expression](https://wallydavid.com/wp-content/uploads/2026/03/Screenshot-2026-03-27-at-8.47.14-AM.jpg) Additional Queries: ip.src.country eq “US” and “FL” “LA” “CA” “TX” The [full list](https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/) of Expression fields can be [found here for reference](https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/). --- --- title: "Pay Invoice" url: "https://wallydavid.com/digital-solutions/pay-invoice/" lang: "en-US" type: "product" description: "Pay your invoice quickly and securely online using a credit card. Simply enter your invoice details and payment information through our secure checkout (Square) to complete your transaction in just a few moments. Online payments are processed safely, providing a fast and convenient way to keep your accounts up to date.\n\n Secure checkout by Square Payments" last_modified: "2026-03-05T03:58:57+00:00" price: "<span class="from">From: </span><span class="woocommerce-Price-amount amount"><bdi><span class="woocommerce-Price-currencySymbol" translate="no">$</span>0.00</bdi></span>" sku: "" in_stock: true --- # Pay Invoice [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 **Terms & Conditions** All invoices issued for web development, marketing services, consulting, design work, digital products, or related services are considered final and non-refundable once payment has been made. By submitting payment, the client acknowledges and agrees that the sale is complete and the project or service has officially commenced or been reserved. The sale is considered closed once payment is received, and no refunds, chargebacks, or cancellations will be permitted for any reason, including but not limited to change of mind, project scope adjustments, business decisions, or unused services. Due to the nature of digital services, time allocation, project scheduling, and intellectual work involved in web development and marketing, all payments secure dedicated time, resources, and expertise. As such, all completed payments represent compensation for reserved labor, planning, and professional services. Any additional work requested beyond the original agreement may require a separate invoice and approval. By paying the invoice, the client confirms they have reviewed and agreed to these terms. --- --- title: "12 Month Managed Client Hosting" url: "https://wallydavid.com/digital-solutions/12-month-managed-hosting/" lang: "en-US" type: "product" description: "Single Site Installation\n 1CPU / 2GB Ram / 25gb Storage\n Fully Managed Hosting\n Plugins & Themes\n Speed Optimization\n Enhanced Security\n Free Malware Removal\n Cloud Backups\n Spam Prevention\n Status Monitoring\n Plugin/Theme/WP Updates" last_modified: "2026-03-05T04:08:59+00:00" price: "<span class="woocommerce-Price-amount amount"><bdi><span class="woocommerce-Price-currencySymbol" translate="no">$</span>299.88</bdi></span>" sku: "12 Month Managed Hosting ($24.99 x 12mo.)" in_stock: true custom_fields: enter_your_website_url: "xzxgadfg" --- # 12 Month Managed Client Hosting [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "My account" url: "https://wallydavid.com/my-account/" lang: "en-US" type: "page" last_modified: "2026-03-05T00:20:27+00:00" --- # My account [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 ## Login Username or email address *Required Password *Required Remember me Log in [Lost your password?](https://wallydavid.com/my-account/lost-password/) --- --- title: "Digital Solutions" url: "https://wallydavid.com/digital-solutions/" lang: "en-US" type: "page" last_modified: "2026-03-05T00:29:10+00:00" custom_fields: nectar-metabox-portfolio-display: "all" nectar-metabox-portfolio-display-sortable: "off" --- # Digital Solutions [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "Checkout" url: "https://wallydavid.com/checkout/" lang: "en-US" type: "page" last_modified: "2026-03-05T00:20:27+00:00" --- # Checkout [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "Cart" url: "https://wallydavid.com/cart/" lang: "en-US" type: "page" description: "  You may be interested in…                     Your cart is currently empty!" last_modified: "2026-03-05T15:18:58+00:00" custom_fields: nectar-metabox-portfolio-display: "all" nectar-metabox-portfolio-display-sortable: "off" --- # Cart [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0                       ## Your cart is currently empty! - [ ![Wallys Video Converter App Freeware Video Converter for Web, MP4, OGV, WEBM](https://wallydavid.com/wp-content/uploads/2026/08/wallysvc-300x300.avif) Wallys Video Converter ](https://wallydavid.com/digital-solutions/wallys-video-converter/) $4.99 [Add to cart](/llms-full.txt/?add-to-cart=1983) - [ ![Wally David Invoice Icon Graphic](https://wallydavid.com/wp-content/uploads/2026/03/invoice_.webp) Pay Invoice ](https://wallydavid.com/digital-solutions/pay-invoice/) From: $0.00 [Add to cart](https://wallydavid.com/digital-solutions/pay-invoice/) - [ ![Wally David Website Hosting Graphic](https://wallydavid.com/wp-content/uploads/2026/03/hosting_.jpg-300x300.avif) 12 Month Managed Client Hosting ](https://wallydavid.com/digital-solutions/12-month-managed-hosting/) $299.88 [Select options](https://wallydavid.com/digital-solutions/12-month-managed-hosting/) --- --- title: "Basic WordPress Security For Self Hosted Sites" url: "https://wallydavid.com/basic-wordpress-security-for-self-hosted-sites/" lang: "en-US" type: "post" description: "If you’re Googling something like “why are my WordPress server processes and RAM maxed out?” and landed here, here’s the quick version. XML-RPC (xmlrpc.php in WordPress) is a legacy protocol that allows remote procedure calls — basically, it lets external" last_modified: "2026-03-03T18:19:55+00:00" categories: [Articles] custom_fields: pld_like_count: 62 nectar_blog_post_view_count: 300 --- # Basic WordPress Security For Self Hosted Sites [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 If you’re Googling something like “why are my WordPress server processes and RAM maxed out?” and landed here, here’s the quick version. **XML-RPC** (xmlrpc.php in WordPress) is a legacy protocol that allows remote procedure calls — basically, it lets external applications communicate with your WordPress site. It blows my mind that this is still around in 2026 — and even more that it’s still enabled by default, especially after the core team removed the easy toggle to disable it a few years back. Here’s the problem: **XML-RPC is one of the most abused attack vectors in WordPress.** It’s a favorite for: - Brute-force attacks (testing thousands of passwords in a single request) - Amplified DDoS attacks - Resource exhaustion that leads to maxed-out CPU, PHP workers, and RAM If you’re seeing “server processes maxed” errors, xmlrpc.php is often one of the first things to check. For most sites, there’s absolutely no reason to leave it exposed. The only real use cases are the WordPress mobile app or certain legacy integrations like Jetpack — and even then, you should seriously reconsider. The WordPress REST API has largely replaced XML-RPC and is significantly more modern and secure. Block it. Disable it at the server level. Move on. And while you’re tightening things up, install a reputable security plugin like Wordfence. Add to your .htaccess # Block WordPress xmlrpc.php requests order deny,allow deny from all allow from xxx.xxx.xxx.xxx Add to your functions.php add_filter('xmlrpc_enabled', '__return_false'); Add to your wp-config.php define('XMLRPC_REQUEST', false); After this, install a fresh copy of WordPress and your theme to make sure nothing was remotely modified or hacked. Also, check your comments. Usually these attacked insert thousands of spam comments into your database. Install a plugin like “disable comments” and bulk delete them all. --- --- title: "Add A Confetti JavaScript To Your Site For No Reason" url: "https://wallydavid.com/add-a-confetti-javascript-to-your-site-for-no-reason/" lang: "en-US" type: "post" description: "Add this JavaScript to the footer of your website to create a fun confetti effect. This one is free and you can just copy and paste. Change the DURATION to set it to run longer or shorter." last_modified: "2026-01-10T23:18:44+00:00" categories: [Articles] tags: [Code, Free Script, JavaScript] custom_fields: pld_like_count: 49 nectar_blog_post_view_count: 399 --- # Add A Confetti JavaScript To Your Site For No Reason [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Add this JavaScript to the footer of your website to create a fun confetti effect. This one is free and you can just copy and paste. Change the DURATION to set it to run longer or shorter. --- --- title: "Reorder Constant Contact Forms Fields With CSS" url: "https://wallydavid.com/reorder-constant-contact-forms-fields-with-css/" lang: "en-US" type: "post" description: "Sometimes you inherit web things that you don't have access to. Today's instance is a Constant Contact account form, which usually always sets the EMAIL field first. Luckily Constant Contacts embedded forms have nice output code with clear ID's and" last_modified: "2025-12-11T16:39:13+00:00" categories: [Articles] custom_fields: pld_like_count: 24 nectar_blog_post_view_count: 461 --- # Reorder Constant Contact Forms Fields With CSS [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Sometimes you inherit web things that you don’t have access to. Today’s instance is a Constant Contact account form, which usually always sets the EMAIL field first. Luckily Constant Contacts embedded forms have nice output code with clear ID’s and CLASSES. Here is a simple way with pure CSS to re-order the fields. /* Form DIV ID */ #ctct_form_0 { display: flex; flex-direction: column; } /* Each Field ID */ #first_name_field_0 { order: 1; } #last_name_field_0 { order: 2; } #email_address_field_0 { order: 3; } #company_field_0 { order: 4; } #phone_field_0 { order: 5; } #gdpr_text { order: 6; } /* Button Class */ .ctct-form-button { order: 7; } --- --- title: "Code Purists, Amateur WordPress Developers Other Ways to Die" url: "https://wallydavid.com/code-purists-amateur-wordpress-developers-other-ways-to-die/" lang: "en-US" type: "post" last_modified: "2026-03-16T20:49:41+00:00" categories: [Articles] custom_fields: pld_like_count: 276 pld_dislike_count: 8 nectar_blog_post_view_count: 396 --- # Code Purists, Amateur WordPress Developers Other Ways to Die [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "AI Tech Is Tanking, Welcome To The Next DOT COM Bubble" url: "https://wallydavid.com/ai-tech-is-tanking-welcome-to-the-next-dot-com-bubble/" lang: "en-US" type: "post" last_modified: "2026-01-10T23:13:33+00:00" categories: [Articles] custom_fields: pld_like_count: 107 pld_dislike_count: 3 nectar_blog_post_view_count: 541 --- # AI Tech Is Tanking, Welcome To The Next DOT COM Bubble [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "Useful Mac Apps" url: "https://wallydavid.com/useful-mac-apps/" lang: "en-US" type: "post" last_modified: "2025-11-07T02:59:32+00:00" categories: [Articles] custom_fields: pld_like_count: 33 nectar_blog_post_view_count: 586 --- # Useful Mac Apps [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "ChatGPT Is massively overhyped and tanking your SEO readability score. Calm down." url: "https://wallydavid.com/chatgpt-is-massively-overhyped-and-tanking-your-seo-readability-score-calm-down/" lang: "en-US" type: "post" description: "What does Google, AltaVista, DuckDuck Go, Yandex, and Yahoo roughly index according to Yoast and SemRush. A single natural key phrase (key words are dead) The 150 character meta description Roughly the first four sentences under 22 characters or 150 words." last_modified: "2025-08-18T19:32:52+00:00" categories: [Articles] custom_fields: pld_like_count: 83 pld_dislike_count: 1 nectar_blog_post_view_count: 681 --- # ChatGPT Is massively overhyped and tanking your SEO readability score. Calm down. [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 What does Google, AltaVista, DuckDuck Go, Yandex, and Yahoo _**roughly**_ index according to [Yoast](https://yoast.com/yoast-seo-readability-analysis/) and [SemRush.](https://www.semrush.com/kb/542-site-audit-issues-list) - A single natural key phrase ([key words are dead](https://research.google/blog/muvera-making-multi-vector-retrieval-as-fast-as-single-vector-search/)) - The 150 character meta description - Roughly the first four sentences under 22 characters or 150 words. - H1, H2, H3 tags - Any structured list containing natural phrasing (containing no stuffed keywords) - Page content containing at least (1) internal and (1) external link - Any image alt tags and image descriptions **That’s it.** Why? [MUVERA](https://research.google/blog/muvera-making-multi-vector-retrieval-as-fast-as-single-vector-search/).. (the Google one, not the arthritis medicine one.) Any copy on the page more than what is listed above is for your own reading, personal preference in writing style, or a futile exercise in over thinking a specific subject matter. Mainly because [“overwriting tanks readability scores”,](https://yoast.com/the-sentence-length-check/) and ChatGPT, is a pro at overwriting at a college reading level and Googles new [MUVERA will ignore you](https://research.google/blog/muvera-making-multi-vector-retrieval-as-fast-as-single-vector-search/). **Forgot about readability eh? ** I get it, tools like ChatGPT and OpenAI are easy. You don’t have to think and it vomits something nice onto a page and you can copy and paste it into your blog right? Wrong. The problem is that all these AI tools over-write massively [ABOVE the maximum readability index score ](https://www.explorationpub.com/Journals/edht/Article/101132)and tank your SEO. **Guess what?** Anything written over a six grade US education level or can’t be quickly skimmed in 10 seconds or less lowers your page readability ranking results. Taking you from the top of page one search results, down the results page and possibly to the dreaded page two or beyond. While a lower readability score doesn’t directly impact website _indexing_, it can [directly affects how Google ranks your site by impacting user engagement and bounce rates.](https://devstephen.medium.com/what-is-readability-and-why-does-it-matter-7773d018e4b9) Google prioritizes providing users with a good experience, and too much content or content that’s [hard to read can lead to higher bounce rates](https://readable.com/readability/flesch-reading-ease-flesch-kincaid-grade-level/) and less time spent on your site, which can negatively affect your rankings. Head over to Google Analytics and check your “Average engagement time” metric for your site. Go to “**Reports**” > “**Life cycle**” > “**Engagement**” > “**Overview**. If you’ve been using ChatGPT a lot and your lighthouse readability score is tanking, this is where you’re going to figure it out. For all you AI copy and paste sheep, ChatGPT is massively overhyped – your SEO called and told me to tell you to **calm down**. --- --- title: "Disable WooCommerce Product Image Zoom" url: "https://wallydavid.com/disable-woocommerce-product-image-zoom/" lang: "en-US" type: "post" description: "I hate WooCommerce. It's the best most horrible e-commerce option in the world. Reminder: how to disable product image zoom on single posts: function custom_single_product_image_html( $html, $post_id ) { $post_thumbnail_id = get_post_thumbnail_id( $post_id ); return get_the_post_thumbnail( $post_thumbnail_id, apply_filters( 'single_product_large_thumbnail_size', 'shop_single'" last_modified: "2025-05-24T02:09:05+00:00" categories: [Articles] custom_fields: pld_like_count: 1 nectar_blog_post_view_count: 650 --- # Disable WooCommerce Product Image Zoom [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 I hate WooCommerce. It’s the best most horrible e-commerce option in the world. Reminder: how to disable product image zoom on single posts: function custom_single_product_image_html( $html, $post_id ) {     $post_thumbnail_id = get_post_thumbnail_id( $post_id );     return get_the_post_thumbnail( $post_thumbnail_id, apply_filters( 'single_product_large_thumbnail_size', 'shop_single' ) ); } add_filter('woocommerce_single_product_image_thumbnail_html', 'custom_single_product_image_html', 10, 2); --- --- title: "Website Maintenance" url: "https://wallydavid.com/website-maintenance/" lang: "en-US" type: "page" last_modified: "2026-07-22T16:02:17+00:00" custom_fields: nectar-metabox-portfolio-display: "all" nectar-metabox-portfolio-display-sortable: "off" --- # Website Maintenance [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 [divider line_type=”No Line” custom_height=”35″][divider line_type=”No Line” custom_height=”50″][divider line_type=”No Line” custom_height=”35″][divider line_type=”No Line” custom_height=”35″] --- --- title: "Windows prevented Vortex from loading files necessary to complete the installation." url: "https://wallydavid.com/windows-prevented-vortex-from-loading-files-necessary-to-complete-the-installation/" lang: "en-US" type: "post" last_modified: "2025-05-12T16:41:23+00:00" categories: [Articles] custom_fields: nectar_blog_post_view_count: 1048 --- # Windows prevented Vortex from loading files necessary to complete the installation. [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "Load Dashicons in Front End" url: "https://wallydavid.com/load-dashicons-in-front-end/" lang: "en-US" type: "post" last_modified: "2025-05-02T12:50:45+00:00" categories: [Articles] custom_fields: pld_like_count: 44 nectar_blog_post_view_count: 754 --- # Load Dashicons in Front End [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "WooCommerce Modify Billing To Match Drivers License" url: "https://wallydavid.com/woocommerce-modify-billing-to-match-drivers-license/" lang: "en-US" type: "post" description: "Sometimes you need to ask users to be specific about WooCommerce billing details. Especially when registering for say, a CPL or a medical or government billing form. Here is a quick plugin to edit the \"Billing Details\" text on the" last_modified: "2025-04-18T15:50:19+00:00" categories: [Articles] tags: [Hacking, Tips, WooCommerce, Wordpress Functions] custom_fields: pld_like_count: 42 nectar_blog_post_view_count: 637 --- # WooCommerce Modify Billing To Match Drivers License [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Sometimes you need to ask users to be specific about WooCommerce billing details. Especially when registering for say, a CPL or a medical or government billing form. Here is a quick plugin to edit the “Billing Details” text on the check out page to direct BOB to fill out the form as ROBERT, or however it appears on their drivers license. I would also suggest a free plugin like [Checkout Field Editor](https://wordpress.org/plugins/woo-checkout-field-editor-pro/) to add MIDDLE NAME and SUFFIX too. --- --- title: "What’s Causing Maxed Processes and 100% Ram Usage in cPanel with WordPress" url: "https://wallydavid.com/whats-causing-maxed-processes-and-100-ram-usage-in-cpanel-with-wordpress/" lang: "en-US" type: "post" description: "This is one of the most irritating things to troubleshoot in cPanel, WHM, or whatever Linux hosting you're using. What the heck is using all the processing bandwidth and ram. Your server is running along just fine, then just like" last_modified: "2025-04-18T15:48:11+00:00" categories: [Articles] tags: [cPanel, Maxed Processes, Tech Support Help, Terminal, WHM] custom_fields: pld_like_count: 253 nectar_blog_post_view_count: 821 --- # What’s Causing Maxed Processes and 100% Ram Usage in cPanel with WordPress [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 This is one of the most irritating things to troubleshoot in cPanel, WHM, or whatever Linux hosting you’re using. What the heck is using all the processing bandwidth and ram. Your server is running along just fine, then just like that, everything is maxed and nothing loads. #### Here are a few tips. Obviously, make sure the theme and plugins are up-to-date. Old stuff causes issues with PHP updates and server software. Sometime you won’t see an update, but then if you update to a newer version of PHP, mysql, Imagick or something they are suddenly they are there. So Keep an eye on them. Once that’s done, open your cPanel and look for the terminal. Open it up and type top -c. This is your best friend in figuring our what is using resources. It will spit out a realtime list with a server path to whats being called. Usually you’ll see something hitting a /index.php or /wp-cron.php in a specific folder over and over again. top -c ![](https://wallydavid.com/wp-content/uploads/2025/02/process-1024x364.jpg) #### wp-cron.php If you’re seeing a bunch of stuff like: public_html/wordpress/cron or public_html/wordpress/wp-cron.php, you’ve got something rouge phoning home, or something remote trying to reach your server over and over again. Open up the cPanel file editor and navigate to your home directory and find the wp-config.php file. Add this to disable plugins and WordPress from sending communication from your site. You’d be surprised how many plugins send usage analytics back home. And not surprising either is how easy it is to abuse and hack those features. define('DISABLE_WP_CRON', true) ; #### xmlrpc.php XML-RPC is a core WordPress API that has been enabled by default since WordPress 3.5 was released in 2012. It allows developers to remotely use XML and HTTPS protocols to connect to and interact with your WordPress website. Yeah, turn that off. In your WordPress directory look for .htaccess (make sure hidden files are visible), and add this to turn that off. # Block WordPress xmlrpc.php requests order deny,allow deny from all #### index.php This one sucks. More than likely it’s a rouge bot(s) indexing your site or attacking the index file over and over again. Rouge bots are any bot that hit your website at no benefit to you. These bots consume server resources especially if they hit your website or wp-login page excessively. Blocking them can put less stress on your server and potentially save you bandwidth, hosting costs, and speed up your site. This can also prevent bad bots from appearing in your Google Analytics data. A couple of solutions: Use [CloudFlare as your DNS provider](https://www.cloudflare.com/plans/), Install Sucuri or WordFence or some other Firewall Plugin with excessive IP blocking, [Install Blackhole for Bad Bots](https://wordpress.org/plugins/blackhole-bad-bots/). --- --- title: "Adding a Service fee in WooCommerce for Free" url: "https://wallydavid.com/adding-a-service-fee-in-woocommerce-for-free/" lang: "en-US" type: "post" description: "Automatic is systematically buying up every plugin for WooCommerce and making it a paid plugin that you have to add and manage through a WordPress.com account. I can't even express my dislike for WooCommerce enough. Anyways, don't buy an $80" last_modified: "2025-02-17T18:48:06+00:00" categories: [Articles] tags: [Hacking, WooCommerce, Wordpress Functions, WordPress Plugin] custom_fields: pld_like_count: 23 pld_dislike_count: 2 nectar_blog_post_view_count: 703 --- # Adding a Service fee in WooCommerce for Free [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Automatic is systematically buying up every plugin for WooCommerce and making it a paid plugin that you have to add and manage through a WordPress.com account. I can’t even express my dislike for WooCommerce enough. Anyways, don’t buy an $80 plugin from them just to add a service fee to products on checkout. Here’s how to cover those services on checkout. Currently this is set to “3.5%” and the line item is set to “Service Fee”. function custom_woocommerce_cart_calculate_fees( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) { return; } $service_fee_percentage = 3.5; // Set the service fee percentage $cart_subtotal = $cart->get_subtotal(); $service_fee = ( $cart_subtotal * $service_fee_percentage ) / 100; $cart->add_fee( __( 'Service Fee', 'woocommerce' ), $service_fee, false ); // Set the line item name } add_action( 'woocommerce_cart_calculate_fees', 'custom_woocommerce_cart_calculate_fees' ); --- --- title: "GoDaddy SSL/TLS Status Not Issuing an SSL Fix" url: "https://wallydavid.com/godaddy-ssl-tls-status-not-issuing-an-ssl-fix/" lang: "en-US" type: "post" description: "If you have a lot of domains in your GoDaddy cPanel, and your hosting will not issue an SSL thorough the SSL/TLS Status screen for one of your domains, this means you have an invalid add-on domain somewhere in your" last_modified: "2025-05-19T18:17:20+00:00" categories: [Articles] tags: [AutoSSL, cPanel, GoDaddy, Hacking, SSL Certificate, Tech Support Help, WHM] custom_fields: pld_like_count: 211 nectar_blog_post_view_count: 2429 --- # GoDaddy SSL/TLS Status Not Issuing an SSL Fix [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 If you have a lot of domains in your GoDaddy cPanel, and your hosting will not issue an SSL thorough the SSL/TLS Status screen for one of your domains, this means you have an invalid add-on domain somewhere in your domain list. Meaning, check out add-on domains and make sure that they are actually pointed to a folder on your server and are resolving. If you have say, 8 add-on domains, and the 4th one in the list is either not pointed correctly or resolving, the AutoSSL will FAIL AND STOP and not continue to validate domains 5-8. Example - Start AutoSSL 1 Resolves - somedomain1.com - SSL Issued 2 Resolves - somedomain2.com - SSL Issued 3 Resolves - somedomain3.com - SSL Issued 4 *****BAD - somedomain4.com - SSL FAILED 5 Resolves - somedomain5.com - IGNORED 6 Resolves - somedomain6.com - IGNORED 7 Resolves - somedomain7.com - IGNORED 8 Resolves - somedomain8.com - IGNORED In this example, you would simply fixed domain 4 so it resolves, or delete it if it’s not used, and re-run the AutoSSL to issue SSL certificates for domains 5 through 8. --- --- title: "Useful wp-config.php Tweaks" url: "https://wallydavid.com/wp-config-php-tweaks/" lang: "en-US" type: "post" description: "Here's another note to myself. Add this to be able to upload SVGs, fonts and whatever file type you want. Careful with this one, uploading anything means uploading anything, so there could be security risks here to be aware of." last_modified: "2025-04-18T15:56:18+00:00" categories: [Articles] custom_fields: pld_like_count: 65 pld_dislike_count: 0 nectar_blog_post_view_count: 668 --- # Useful wp-config.php Tweaks [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Here’s another note to myself. Add this to be able to upload SVGs, fonts and whatever file type you want. Careful with this one, uploading anything means uploading anything, so there could be security risks here to be aware of. define( ‘ALLOW_UNFILTERED_UPLOADS’, true ); Set a default theme: define('WP_DEFAULT_THEME', 'your-theme-folder-name'); Two fold, you get debugging, but instead of spitting it out on the screen, errors get thrown into a log in the WordPress directory. A very useful hack for troubleshooting issues on live sites. define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', false ); Keep your database lean, especially on sites with lots of users, pages and posts. Your database can blow up quickly and slow down your site significantly with all the revisions being written and saved to your database. define('WP_POST_REVISIONS', 5); or disable them: define('WP_POST_REVISIONS', false); I use this a lot because WordPress releases are never straight forward and break stuff. When added, it disables all automatic updates in WordPress. This includes updates for the WordPress core, plugins, themes, and translations. It’s especially useful for website managers who prefer to handle updates manually, ensuring that they have full control over any changes to their site. define( 'AUTOMATIC_UPDATER_DISABLED', true ); For security reasons, you may want to disable the file editor inside the WordPress dashboard. This constant disables the theme and plugin editor. define('DISALLOW_FILE_EDIT', true); You can also disable installing any plugins too: define( 'DISALLOW_FILE_MODS', true ); I don’t like this one, because I like to manually delete pages and posts from the trash, but here it is anyways. define('EMPTY_TRASH_DAYS', 7); If you think your database may be corrupted or not running optimally, you can add this to force an automatic repair. define('WP_ALLOW_REPAIR', true); Normally, you can set your WordPress and Site URLs from Settings » General page. However, you may not be able to do that if you don’t have access to your WordPress site, seeing redirect errors, or have just moved your site. In that case, you can change your site and WordPress URLs via wp-config.php file by adding the following lines: define('WP_HOME', 'https://www.example.com'); define('WP_SITEURL', 'https://www.example.com'); WordPress allows you to override file permissions define('FS_CHMOD_FILE', 0644); define('FS_CHMOD_DIR', 0755); --- --- title: "Tips For Speeding Up WordPress" url: "https://wallydavid.com/tips-for-speeding-up-wordpress/" lang: "en-US" type: "post" description: "Set Post Revisions Before you even begin your development project, add this little gem to the wp-config file. Nothing blows a database up like a couple hundred revisions. If you've already launched your site and have a zillion revisions on" last_modified: "2025-02-27T19:05:36+00:00" categories: [Articles] custom_fields: pld_like_count: 48 nectar_blog_post_view_count: 665 --- # Tips For Speeding Up WordPress [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 #### Set Post Revisions Before you even begin your development project, add this little gem to the wp-config file. Nothing blows a database up like a couple hundred revisions. If you’ve already launched your site and have a zillion revisions on your pages and posts, check out this [plugin called Simple Revisions Delete](https://wordpress.org/plugins/simple-revisions-delete/). It will let you delete your posts revisions individually or all at once (purge or bulk action). define( 'WP_POST_REVISIONS', 10 ); or disable them altogether: define( 'WP_POST_REVISIONS', false ); #### Set Expires Cache Resolve Caching issues for files served directly from your website by adding this piece of code to your .htaccess file. # START EXPIRES CACHE ExpiresActive On ExpiresByType text/css "access 1 month" ExpiresByType text/html "access 1 month" ExpiresByType image/gif "access 1 year" ExpiresByType image/png "access 1 year" ExpiresByType image/jpg "access 1 year" ExpiresByType image/jpeg "access 1 year" ExpiresByType image/svg "access 1 year" ExpiresByType image/x-icon "access 1 year" ExpiresByType application/pdf "access 1 month" ExpiresByType application/xhtml-xml "access 1 month" ExpiresByType application/javascript "access 1 month" ExpiresByType text/x-javascript "access 1 month" ExpiresByType application/x-shockwave-flash "access 1 month" ExpiresDefault "access 1 month" # END EXPIRES CACHE #### Add Cache-Control Headers Cache-control is an HTTP header used to specify browser caching policies in both client requests and server responses. Policies include how a resource is cached, where it’s cached and its maximum age before expiring (i.e., time to live). Also add to your .htaccess file. # BEGIN Cache-Control Headers Header set Cache-Control "public" Header set Cache-Control "public" Header set Cache-Control "private" Header set Cache-Control "private, must-revalidate" # END Cache-Control Headers #### Turn Off ETags A response header that identifies the version of served content according to a token – a string of characters in quotes, e.g., “123123123-ab34” – that changes after a resource is modified. If a token is unchanged before a request is made, the browser continues to use its local version. Also add to your .htaccess file. # BEGIN Turn ETags Off FileETag None # END Turn ETags Off #### Last Resort Setting the WP_HTTP_BLOCK_EXTERNAL constant to true in your wp-config.php file will stop all outgoing network requests from your site. Meaning, no talking to the WordPress mother ship, or any other external resources that phone home. While this may speed things up, if may mean you need to localize any libraries that are called remotely like google fonts and other scripts. define('WP_HTTP_BLOCK_EXTERNAL', true); #### Disable CRON This basically prevents WordPress from checking for scheduled events on every page load. Add this to the wp-config.php right after the /* That’s all, stop editing! Happy blogging. */ line. define('DISABLE_WP_CRON', true) ; --- --- title: "WooCommerce, the WORST best WordPress Option" url: "https://wallydavid.com/woocommerce-the-worst-best-wordpress-option/" lang: "en-US" type: "post" description: "Just a reminder to myself how to hide WooCommerce menus because I have to google this EVERY time. add_filter( 'woocommerce_admin_features', function( $features ) { /** * Remove Marketing Menu * Filter list of features and remove those not needed *" last_modified: "2025-06-09T15:04:52+00:00" categories: [Articles] custom_fields: pld_like_count: 24 pld_dislike_count: 1 nectar_blog_post_view_count: 640 --- # WooCommerce, the WORST best WordPress Option [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Just a reminder to myself how to hide WooCommerce menus because I have to google this EVERY time. add_filter( 'woocommerce_admin_features', function( $features ) {     /**      * Remove Marketing Menu      * Filter list of features and remove those not needed     *      */     return array_values(         array_filter( $features, function($feature) {             return $feature !== 'marketing';         } )     ); } );     /**      * Remove Suggestions Menu      */     add_filter( 'woocommerce_allow_marketplace_suggestions', '__return_false' );     add_filter('woocommerce_show_marketplace_suggestions', function ($show) { return 'no'; });     /**      * Remove Payments Menu - Doesn't work half the time      */ remove_menu_page( 'admin.php?page=wc-settings&tab=checkout' ); remove_menu_page( 'admin.php?page=wc-admin&path=/wc-pay-welcome-page' ); remove_menu_page( 'admin.php?page=wc-admin&task=payments' ); remove_menu_page( 'admin.php?page=wc-admin&task=woocommerce-payments' ); --- --- title: "500,000+ Open-licensed SVG Vector and Icons" url: "https://wallydavid.com/500-000-open-licensed-svg-vector-and-icons/" lang: "en-US" type: "post" last_modified: "2025-01-13T21:07:16+00:00" categories: [Articles] custom_fields: nectar_blog_post_view_count: 2580 pld_like_count: 31 --- # 500,000+ Open-licensed SVG Vector and Icons [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "Matt Mullenweg is Ruining WordPress for Developers and the Internet" url: "https://wallydavid.com/matt-mullenweg-is-ruining-wordpress-for-developers-and-the-internet/" lang: "en-US" type: "post" description: "NEWS: A Judge handed WP Engine a preliminary win in the legal fight with Automattic - Read more here. Everyone that makes a living from the WordPress open-source eco-system has felt the cringe from Matts actions in the last couple" last_modified: "2024-12-19T04:34:05+00:00" categories: [Articles] custom_fields: pld_like_count: 72 nectar_blog_post_view_count: 761 --- # Matt Mullenweg is Ruining WordPress for Developers and the Internet [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 **NEWS: A Judge handed WP Engine a preliminary win in the legal fight with Automattic – [Read more here.](https://www.theregister.com/2024/12/11/wp_engine_wins_injunction_against/)** Everyone that makes a living from the WordPress open-source eco-system has felt the cringe from Matts actions in the last couple months (years really). This whole WP Engine lawsuit stinks of a kid who’s jealous because someone has a better toy than he does. Which let’s be fair, WP Engine is a better hosting platform by far than WordPress.com. I watched the 2024 State of WordPress in disbelief as Matt publicly talked himself into believing his own Bulls**t in real time, while trying to sell it to everyone else in the room. His I want to be hip like Steve Jobs and tech savvy like Musk or Zuckerberg act kinda fell flat while spewing a delusional rant that ultimately caused major plugin devs to leave WP all together, 10% of his developers to straight up quit, and get Automatic slapped with a massive defamation lawsuit. I guess lots of CEO tech giants fumble, but someone in his PR department _really_ (like in big air quote with my hands) needs to “tell him to shut the f*** up”. Truth be told, WordPress’s culture was fractured way before any of this drama anyways. Ever since Matt divided everyone with the Gutenberg editor _MANY_ devs were looking elsewhere already. ClassicPress was born and suddenly now there’s a world in which clients and business see HubSpot as a real alternative for a corporate website. Also, there are now more installations of Divi and Visual Bakery, than Gutenberg. Not to mention the Classic Editor and Classic Widgets plugin are still one of the top 4 downloaded plugins of ALL TIME. … fractured. Yep, WordPress is a mess, and this (unfortunately) – is just one more nail in the coffin. The stupid thing is, if he (Matt) goes nuclear on the opens-source front because he got his hand slapped by a Judge, this could have serious far reaching impacts for almost all hosting providers. Almost all of them offer some type of WordPress hosting. So will this mean GoDaddy, BlueHost, A2, DreamHost, Host Gator, Liquid Web, Network Solution (The list goes on) all need to pay an extortion fee too to keep offering WordPress hosting and access to the WordPress repository of plugins? Does the WordPress.org go away and it all becomes a pay-to-play model? Who knows anymore. Regardless, Matt needs to be removed as CEO. I doubt that’s even a possibility, because this is America, where our monsters are CEOs. So here’s to a brave new world where other peoples tantrums ruin innovation and good things for the rest of us. --- --- title: "Helpdesk, Contact & Call Plugin" url: "https://wallydavid.com/helpdesk-contact-call-plugin/" lang: "en-US" type: "post" description: "  Contact button \"Click URL\" field notes: You can add any url to this field. However, if you'd like to use this plugin as a help desk pop-up you need to add the following code to the \"Click URL\" field" last_modified: "2024-11-25T17:44:11+00:00" categories: [Articles] tags: [WordPress Plugin] custom_fields: pld_like_count: 92 nectar_blog_post_view_count: 937 enclosure: "https://wallydavid.com/wp-content/uploads/2024/11/Helpdesk-Contact-Call-Plugin.webm\n187050\nvideo/webm" --- # Helpdesk, Contact & Call Plugin [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 [divider line_type=”No Line” custom_height=”15″]   #### Contact button “Click URL” field notes: You can add any url to this field. However, if you’d like to use this plugin as a help desk pop-up you need to add the following code to the “Click URL” field under the “Contact Button” group. Then add your URL to the Helpdesk Popup “Contact Button URL” Field instead. javascript:wd3chatpopup() #### Helpdesk popup form buttons: Under the Helpdesk Popup group of fields, there is a open area called “Adventure Button Area”. Add LIST ITEMS here to create the button links. EXAMPLE: Choose a topic: #### Insert into: Some older themes have the ability to hide/disable the footer and use a visual builder for global sections or widgets to build the footer. This plugin loads in the **wp_footer**. If your theme has this section disabled, try using the **wp_body_open** option instead to load the plugin. #### Will it work with ClassicPress too? Yes, this will work with ClassicPress as well as official WordPress releases. ![](https://wallydavid.com/wp-content/uploads/2024/11/classic-press-1024x648.jpg) --- --- title: "A Few .htaccess Hacks To Speed Up WordPress" url: "https://wallydavid.com/a-few-htaccess-hacks-to-speed-up-wordpress/" lang: "en-US" type: "post" description: "A couple hacks to speed up WordPress Open your .htaccess file on your server for editing. Look for the line that says #END WordPress. All code from this article should go below that line. Set up GZIP By enabling this," last_modified: "2024-11-20T04:21:18+00:00" categories: [Articles] custom_fields: nectar_blog_post_view_count: 980 pld_like_count: 210 --- # A Few .htaccess Hacks To Speed Up WordPress [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 #### A couple hacks to speed up WordPress Open your .htaccess file on your server for editing. Look for the line that says _**#END WordPress**_. All code from this article should go _**below**_ that line. #### Set up GZIP By enabling this, your server can send out smaller, compressed versions of many files, which browsers know how to decompress. This speeds up the data transfer rate. # Compress HTML, CSS, JavaScript, Text, XML and fonts AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/vnd.ms-fontobject AddOutputFilterByType DEFLATE application/x-font AddOutputFilterByType DEFLATE application/x-font-opentype AddOutputFilterByType DEFLATE application/x-font-otf AddOutputFilterByType DEFLATE application/x-font-truetype AddOutputFilterByType DEFLATE application/x-font-ttf AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE font/opentype AddOutputFilterByType DEFLATE font/otf AddOutputFilterByType DEFLATE font/ttf AddOutputFilterByType DEFLATE image/svg+xml AddOutputFilterByType DEFLATE image/x-icon AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/xml # Remove browser bugs (only needed for really old browsers) BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4.0[678] no-gzip BrowserMatch bMSIE !no-gzip !gzip-only-text/html Header append Vary User-Agent #### Add expires headers Expires headers tell a browser whether a resource can be fetched from the browser’s cache or if it must be retrieved from the server. When you set expires headers for certain resources, such as images or CSS files, the browser knows to store those things in its cache. # Enable expirations ExpiresActive On # Default directive ExpiresDefault "access plus 1 month" # My favicon ExpiresByType image/x-icon "access plus 1 year" # Images ExpiresByType image/gif "access plus 1 month" ExpiresByType image/png "access plus 1 month" ExpiresByType image/jpg "access plus 1 month" ExpiresByType image/jpeg "access plus 1 month" # CSS ExpiresByType text/css "access plus 1 month" # Javascript ExpiresByType application/javascript "access plus 1 year" #### Configure ETags The ETag, or entity tag, is related to the caching of objects. It’s one of the most commonly reported speed fixes needed for websites. While ETags do have some advantages, such as better caching and lower bandwidth usage, they can also cause slower load speed and result in the same object ending up cached multiple times. So a preferred route for getting rid of this problem on a WordPress site is to simply turn them off. #Disable Etags Header unset Etag Header set Connection keep-alive FileETag None [Find the original article here](https://www.godaddy.com/resources/in/stories/how-to-speed-up-wordpress) --- --- title: "The Benefits of Minimalism in Web Design" url: "https://wallydavid.com/the-benefits-of-minimalism-in-web-design/" lang: "en-US" type: "post" last_modified: "2024-11-20T03:02:24+00:00" categories: [Articles] custom_fields: nectar_blog_post_view_count: 859 pld_like_count: 102 pld_dislike_count: 1 --- # The Benefits of Minimalism in Web Design [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "Basic SEO Guide In A Nutshell" url: "https://wallydavid.com/basic-seo-guide-in-a-nutshell/" lang: "en-US" type: "post" description: "1.) Start by finding out what keywords people use to find your website and use them in your content and ad copy. Then pick a page, say your home page. Pick the beset keyword that describes your page. Lets use:" last_modified: "2024-11-13T05:09:50+00:00" categories: [Articles] tags: [SEO, Web Development] custom_fields: nectar_blog_post_view_count: 719 pld_like_count: 115 pld_dislike_count: 2 --- # Basic SEO Guide In A Nutshell [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 #### 1.) Start by finding out what keywords people use to find your website and use them in your content and ad copy. Then pick a page, say your home page. Pick the beset keyword that describes your page. Lets use: **Lorem ipsum.** That Keyword density in your on page copy should be 1-2%, meaning that the (1) single primary keyword should appear once or twice every 100 words. EXAMPLE: “**Lorem ipsum**” dolor sit amet, consectetur adipiscing elit sed porttit. Sor non justo nec finibus. Phasellus nec ante in mi malesuada eleifend ut ac nibh. Nullam leo magna, efficitur nec justo sed, efficitur tempus est. Interdum et malesuada fames ac ante ipsum primis in faucibus. Suspendisse potenti. Curabitur hendrerit bibendum sodales. Duis vitae cursus ante, vel semper dui. Morbi eu “**Lorem ipsum**“, et vestibulum eros. Nunc sit amet odio nec massa hendrerit ultrices eu vitae magna. Etiam pharetra sollicitudin orci id tincidunt. Nunc rhoncus gravida enim nec pharetra. In vulputate, odio a tempor facilisis, libero massa interdum tortor, euismod semper est. This is all the copy you need, about two paragraphs. Source: [Link](https://blog.hubspot.com/marketing/keyword-density#:~:text=What%20is%20good%20keyword%20density?%20While%20there,factors%20in%20to%20about%201%2D2%%20keyword%20density.) [Link](https://www.outranking.io/on-page-seo-keyword-density/#:~:text=However%2C%20overusing%20keywords%20can%20result,for%20on%2Dpage%20SEO%20purposes.) However… #### 2.) A minimum 70 characters on page, plus matching the keyword, is fully acceptable. **_Minimalism is ok_**. Copywriters might get paid by the word, but sometimes less is more, and the minimalist style is the current design trend amongst developers at the moment. No, you don’t need novels of copy for the SEO ranking algorithm to work. However, you do need to support the meta SEO description, so it’s suggested to use at least 70 to 300 characters if you can. Also, it always good to remember  that SEO is more than great copy on a page. You still need to make sure your images are tagged, your h1 through h6 tags are properly used, as well as your accessibility markers in place. You can always try using a “read more” toggle to reveal additional copy to keep you main statements short and on point. **Remember, sites with a combination of both high backlinks and high domain authority can rank #1 with literally no on page copy**. EXAMPLE: “**Lorem ipsum**” dolor sit amet, consectetur adipiscing elit sed porttit. #### 3.) The maximum for the on page meta description is 155 characters. This is your search snippet copy that appears in a search result. It should be short and to the point and reflect exactly what your page is about. Yoast and many other SEO plugins are great for configuring this because they give you a visual indicator of how close you’ve matched your chosen keyword with free readability and SEO analysis tools. EXAMPLE: “**Lorem ipsum**” dolor sit amet, consectetur adipiscing elit sed porttit.or non justo nec finibus. Phasellus nec ante in mi malesuada eleifend ut ac nibh. #### 5.) Optimize you website. The simplest thing is sometimes over-looked. Simply “**optimize everything**” to improve your SEO ranking. Optimize your caching at the software and server level, increase ram for better processer response time, compress your images and media files, always use properly formatted modern code, and defer those large ugly JavaScript and CSS files. I also suggest using more than Googles PageSpeed insights to check for on page speed. Google is the Galactic Empire and only cares about Google, not Bing, Yahoo, or any other browsers like Safari, Edge or FireFox. Check your sites speed here: [PageSpeed Insights](https://pagespeed.web.dev) [gtmetrix.com](https://gtmetrix.com) [DeBugBear SpeedTest – Outside USA](https://www.debugbear.com/test/website-speed) #### 5.) Finally, explore these WordPress plugins: [Yoast SEO](https://wordpress.org/plugins/wordpress-seo/), **[The SEO Framework](https://wordpress.org/plugins/autodescription/), [Rank Math](https://wordpress.org/plugins/seo-by-rank-math/), [All in One SEO Pack](https://wordpress.org/plugins/all-in-one-seo-pack/)** --- --- title: "Linux Doesn’t Suck, It’s Developers Do" url: "https://wallydavid.com/linux-doesnt-suck-its-developers-do/" lang: "en-US" type: "post" description: "First, let's define a NORMAL USER: ie: a non-developer. a home or office user. a non-IT professional. a business employee or production worker. someone who just wants their technology to work without understanding the technical details. It's Simple The whole" last_modified: "2024-11-20T04:08:06+00:00" categories: [Articles] custom_fields: nectar_blog_post_view_count: 839 pld_dislike_count: 7 pld_like_count: 161 --- # Linux Doesn’t Suck, It’s Developers Do [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 #### First, let’s define a NORMAL USER: ie: _a non-developer. a home or office user. a non-IT professional. a business employee or production worker. someone who just wants their technology to work without understanding the technical details._ #### It’s Simple The whole Linux sucks debate from a NORMAL users standpoint is “everything revolves around how files are managed on beautiful but absolutely unusable Linux desktop space”. _I wholeheartedly agree._ Normal users don’t care about Wayland, Plasma, Gnome, or whichever Glibc or library is broken this week. Those are Linux developer problems. Most users don’t even care if they use KDE or Gnome either. They just want to turn it on, do a job and occasionally print things. More to the point, the development work on files managers since KDE 4 and Gnome 3.28+ has been horrible since 2016-17ish. It’s just a jarring experience coming from a Windows or macOS desktop. Linux developers decided that you could only put files and folders in the documents folder and not on the desktop. 50+ years of proven human usable desktop input functionality thrown out the window. #### And thats it — That’s the whole Linux sucks debate in a nutshell. That single difference from Windows and macOS makes NORMAL users think Linux suck. It just doesn’t work right. It feels like more steps (to open an app or file) that could just live on the desktop. My theory about this (unproven) has always been the graphics stack had sucked for so long it was way easier to render the desktop without having to render extra folders and file previews too. Ignoring that every office and home user in the world was (and still is) used to being able to use the desktop to quickly access and open files and folders, in roughly 2017 with no community input or real world testing, they decided to be different. No matter how far KDE and Gnome go to make a beautiful and functional workspace, the 99% will never use it because it doesn’t work for day to day office and production environment workflows. Working in the IT, advertising & marketing, and large format printing space for years before getting into web development taught me that people use their desktop spaces. Not a buried folder on the sidebar of a file manager. Case in point is that Windows and MacOS have included a documents folder almost since the very beginning for their inception. And no one used them. Especially for people who use network drives to store files. **Example 1:** _Large images are dragged to the desktop, modified and corrected and are re-uploaded to a network share to be printed. The file is dragged to the trash. I have production designers that probably do that a hundred times a day. Visually dragging files from one side of the desktop to the other after they complete them. This would never work on linux. It doesn’t matter how great any image editing software that was written for Linux was, no one would use it._ **Example 2:** _A CNC operator needs to cut a bunch of different files on a large machine every day. There are 6 files in the top right corner of the desktop that he drags to a print que 30 times a day. In the bottom right hand corner is a folder with new custom files, and in the top left are quick links to his email and CNC program. This guy needs to visually see these things, not go digging through a documents folder. They need to live on the desktop because “thats the real world”._ Linux devs just don’t live in the real working world apparently. Windows and macOS at least give us a choice to use the desktop in our workflow. Linux does not. **Just spitballing a few more:** - Folders for in-progress, proofing and to-backup files being sorted before being moved to a network share or backup drive - Shortcuts to network drives and online shared documents - Folders with A/B testing versions for print files - Network shares for RIP Ques for print files or CNC files or large format printers - Quick links to company documents - Quick links to frequently used apps or pdf documents that need to be emailed frequently - A easy to access trash bin icon These are just a few examples, but this behavior of actually using (and expecting to use) the desktop will never change, no matter what Linux developers think. Users can do the same things on Windows as they can on macOS. ie: Arranging a their desktop spaces to suit their production needs. It’s just not possible on Linux at the moment without some janky advanced hacking. In the 45 years Linux has been around, a less than 5% desktop market share kinda sucks. Almost 3% of that was in the last two years mainly because Valve decided to use Linux for the Steam Deck gaming console a few years ago. Valve will probably save Linux for gaming, but KDE and Gnome will kill the desktop for the mainstream. So it’ll still probably be a wash for a while. **Again, thats it. And Linux devs just can’t wrap their heads around being wrong, or believe that this is the issue for larger adoption. It sure is the reason I don’t use it on the daily, and I can’t be alone.** **Joke:** _“Linux desktop computing. No, it’s document folder computing.”_ Extra: If you’d like to get super pissed off, [watch this video](https://www.youtube.com/watch?v=KvgrGkapCHg). This is why linux has no market share in a nutshell. --- --- title: "macOS Isn’t Magical Or Fun Anymore" url: "https://wallydavid.com/macos-isnt-magical-or-fun-anymore/" lang: "en-US" type: "post" description: "I learned the terminal, how to code, write internal company apps, write games and a whole slew of other things in the first few years of OSX. Most of what I could do then, I can't do now, because Apple" last_modified: "2025-07-28T20:55:22+00:00" categories: [Articles] custom_fields: nectar_blog_post_view_count: 764 pld_like_count: 88 pld_dislike_count: 5 --- # macOS Isn’t Magical Or Fun Anymore [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 I learned the terminal, how to code, write internal company apps, write games and a whole slew of other things in the first few years of OSX. Most of what I could do then, I can’t do now, because Apple has locked their machines down, made the process impossible, or put things behind a developer account pay-to-play paywall. Now macOS 15.1, requires the complete disabling of “Gatekeeper”, the system which verifies downloads to run non-signed applications, just to write your own unsigned apps. (There are tons of real-world cases for unsigned software). Remember, Apple hates you and thinks you’re stupid. With that, “sideloading” unsigned macOS software is now completely disabled. Not even the right-click trick to run apps works now. And signing software, of course, requires an Apple Developer Connection subscription. Which, for most people, is just too costly. Looks, like users are probably gonna have to rely on the European Union to remedy this. In the mean time, this still works. Open your terminal, paste this command, enter your password, and you’re back in business. sudo spctl --master-disable **Unsigned Apps that are awesome:** https://github.com/waydabber/BetterDisplay https://github.com/insidegui/DarkModeBuddy https://alt-tab-macos.netlify.app https://freemacsoft.net/appcleaner/ https://www.caffeine-app.net https://www.macbartender.com/Bartender5/ https://matthewpalmer.net/vanilla/#vanilla-pro --- --- title: "PayPal REALLY Wants Pay Later Messaging On Your WooCommerce Store" url: "https://wallydavid.com/paypal-really-wants-pay-later-messaging-on-your-woocommerce-store/" lang: "en-US" type: "post" description: "The last few versions of the PayPal gateway for WooCommerce are mysteriously broke. Turning the Pay Later toggles to off does nothing. The Settings will not save and the Pay Later or Pay in Installments ads on the cart and" last_modified: "2024-11-21T01:39:32+00:00" categories: [Articles] custom_fields: nectar_blog_post_view_count: 1096 pld_like_count: 99 --- # PayPal REALLY Wants Pay Later Messaging On Your WooCommerce Store [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 The last few versions of the PayPal gateway for WooCommerce are mysteriously broke. Turning the Pay Later toggles to off does nothing. The Settings will not save and the **Pay Later** or **Pay in Installments** ads on the cart and checkout pages to not go away. Joke: This is a feature, not a bug. Anyways, I had to find the Github for the PayPal plugin source code to find any information on this issue, as it’s not listed on either WooCommerce’s or PayPal’s help and support documentation. Here is the documentation from the Git pages that SHOULD be on the plugin support page: **Programmatically disable Pay Later** Open your themes functions and add these filters to disable the Pay Later button & messaging on the single product pages and the rest of the site: add_filter('woocommerce_paypal_payments_product_buttons_paylater_disabled', '__return_true'); add_filter('woocommerce_paypal_payments_buttons_paylater_disabled', '__return_true'); **Disable Pay Later messaging:** [Learn more here.](https://github.com/woocommerce/woocommerce-paypal-payments/wiki/Actions-and-Filters#disable-pay-later-messaging-configurator-in-260) --- --- title: "Disable ACF Unsafe HTML Rendering" url: "https://wallydavid.com/disable-acf-unsafe-html-rendering/" lang: "en-US" type: "post" description: "ACF now automatically escapes unsafe HTML (Vague Term) when rendered by the_field or the ACF shortcode. It throws a message at the top of posts and pages where it's detected issues that says, \"We’ve detected the output of some of" last_modified: "2024-10-23T14:59:31+00:00" categories: [Articles] tags: [Hacking, Web Development, Wordpress Functions] custom_fields: nectar_blog_post_view_count: 1098 pld_like_count: 72 pld_dislike_count: 1 --- # Disable ACF Unsafe HTML Rendering [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 ACF now automatically escapes unsafe HTML (Vague Term) when rendered by the_field or the ACF shortcode. It throws a message at the top of posts and pages where it’s detected issues that says, “We’ve detected the output of some of your fields has been modified by this change, but this may not be a breaking change. Learn more. Show details.” This has let to quite a bit of 911 madness for developers using automatic updates who woke up to broken website not rendering output data correctly, and confusing messages for developers and agency clients. **Here’s the quick fix:** This will disable the notice: add_filter( 'acf/admin/prevent_escaped_html_notice', '__return_true' ); This will ALLOW unsafe HTML to be rendered. add_filter( 'acf/the_field/allow_unsafe_html', function( $allowed, $selector ) {     return true;     return $allowed; }, 10, 2); Note: There are actually real world cases for rendering “unsafe” HTML. Unsafe basically includes non-standard HTML entities. If thats the case, then this works. But you should always check to make sure you’re not rendering potential bad actors like iframes or scripts. --- --- title: "Set ALL Posts In The Loop To Alphabetical Order" url: "https://wallydavid.com/set-all-posts-in-the-loop-to-alphabetical-order/" lang: "en-US" type: "post" description: "By default, WordPress will display published posts in reverse chronological order. This can be changed by adding a snippet of code to the functions.php file in the WordPress core configuration. Useful when using the blog post roll as an index" last_modified: "2024-10-29T19:33:38+00:00" categories: [Articles] tags: [Hacking, Web Development, WordPress, Wordpress Functions] custom_fields: nectar_blog_post_view_count: 675 pld_like_count: 63 --- # Set ALL Posts In The Loop To Alphabetical Order [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 By default, WordPress will display published posts in reverse chronological order. This can be changed by adding a snippet of code to the functions.php file in the WordPress core configuration. Useful when using the blog post roll as an index of items vs an actual blog. function foo_modify_query_order( $query ) { if ( $query->is_home() && $query->is_main_query() ) { $query->set( 'orderby', 'title' ); $query->set( 'order', 'ASC' ); } } add_action( 'pre_get_posts', 'foo_modify_query_order' ); --- --- title: "Quick WP Admin Dashboard Notice Everywhere" url: "https://wallydavid.com/quick-wp-admin-dashboard-notice-everywhere/" lang: "en-US" type: "post" last_modified: "2024-11-20T19:52:11+00:00" categories: [Articles] tags: [WooCommerce, WordPress Plugin] custom_fields: nectar_blog_post_view_count: 757 pld_like_count: 92 --- # Quick WP Admin Dashboard Notice Everywhere [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 [divider line_type=”No Line” custom_height=”25″][divider line_type=”No Line” custom_height=”25″] --- --- title: "Using The Terminal To Bulk Edit Website File Permissions" url: "https://wallydavid.com/using-the-terminal-to-bulk-edit-website-file-permissions/" lang: "en-US" type: "post" last_modified: "2024-10-16T04:31:02+00:00" categories: [Articles] tags: [Hacking, Terminal] custom_fields: nectar_blog_post_view_count: 853 kia_subtitle: "3.5k Views" pld_like_count: 42 --- # Using The Terminal To Bulk Edit Website File Permissions [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "WooCommerce Character Limit Stupidity" url: "https://wallydavid.com/woocommerce-character-limit-stupidity/" lang: "en-US" type: "post" last_modified: "2026-08-11T19:04:23+00:00" categories: [Articles] custom_fields: nectar_blog_post_view_count: 754 pld_like_count: 26 --- # WooCommerce Character Limit Stupidity [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "WordPress.org bans WP Engine, blocks it from accessing its resources" url: "https://wallydavid.com/wordpress-org-bans-wp-engine-blocks-it-from-accessing-its-resources/" lang: "en-US" type: "post" description: "Automatic's Matt Mullenweg should forcibly removed as CEO and be federally investigated for profiteering from a non-for profit platform. He should also PERSONALLY be responsible for all the monetary damages he's caused to the sites hosting at WP Engine. He" last_modified: "2024-10-02T18:39:13+00:00" categories: [Articles] custom_fields: nectar_blog_post_view_count: 798 pld_dislike_count: 19 pld_like_count: 142 --- # WordPress.org bans WP Engine, blocks it from accessing its resources [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Automatic’s Matt Mullenweg should forcibly removed as CEO and be federally investigated for profiteering from a non-for profit platform. He should also PERSONALLY be responsible for all the monetary damages he’s caused to the sites hosting at WP Engine. He needs to figure out if they are going to be an open source company or a for profit company. Or where the line in the sand is between the IP’s his company owns. He hates that people HATE Gutenburg. He HATES that someone built a better management and plugin theme delivery architecture. But it’s OPEN SOURCE, we should be able to do what I want with it, even fork it like [ClassicPress](https://www.classicpress.net). I don’t use WP Engine, but I hope they win their law suit. As a developer I am fully aware that WP Engine is not affiliated with Automatic. I guess we need to shut down [WP Tavern](https://wptavern.com), [WP Beginner](https://www.wpbeginner.com), [WP Lift](https://wplift.com), [WP Shout](https://wpshout.com), “[WP Factory](https://wpfactory.com)“, and everyone else with WP in the name. I guess that the two letters [_**W & P**_](https://www.collinsdictionary.com/us/dictionary/english/wp#google_vignette) can only be used for_ WordPress_ and the social slang for “_[Well Played](https://www.urbandictionary.com/define.php?term=WP)“, _ “_[Wrong Person](https://www.urbandictionary.com/define.php?term=WP)“_ , “[Weather Permitting](https://www.collinsdictionary.com/us/dictionary/english/wp#google_vignette)“, and “[Word Processing](https://www.collinsdictionary.com/us/dictionary/english/wp#google_vignette)“,  have no bearing on Matts reality distortion. Read the full drama here. [https://techcrunch.com/2024/09/25/wordpress-org-bans-wp-engine-blocks-it-from-accessing-its-resources/](https://techcrunch.com/2024/09/25/wordpress-org-bans-wp-engine-blocks-it-from-accessing-its-resources/) [https://www.fastcompany.com/91198361/the-chaos-at-wordpress-revolves-around-a-clash-of-egos](https://www.fastcompany.com/91198361/the-chaos-at-wordpress-revolves-around-a-clash-of-egos) [https://techcrunch.com/2024/09/26/wordpress-vs-wp-engine-drama-explained/](https://techcrunch.com/2024/09/26/wordpress-vs-wp-engine-drama-explained/) Also, more light reading is the googled meaning or WP. ![](https://wallydavid.com/wp-content/uploads/2024/09/Screenshot-2024-10-02-at-1.52.46 PM.jpg) ![](https://wallydavid.com/wp-content/uploads/2024/09/Screenshot-2024-10-02-at-1.57.37 PM.jpg) --- --- title: "Protected: Work" url: "https://wallydavid.com/portfolio/" lang: "en-US" type: "page" last_modified: "2026-04-03T18:58:28+00:00" custom_fields: nectar-metabox-portfolio-display: "all" nectar-metabox-portfolio-display-sortable: "off" --- # Protected: Work [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 [/tab][tab icon_family=”none” title=”Logo Development” id=”1772738329134-7″ tab_id=”1772738329135-5″][/tab][tab icon_family=”none” title=”Email & Digital marketing” id=”1772738329429-6″ tab_id=”1772738329429-4″][/tab][/tabbed_section] --- --- title: "Replace Howdy in WordPress 6.6.2+" url: "https://wallydavid.com/replace-howdy-in-wordpress-6-6-2/" lang: "en-US" type: "post" description: "Hey, it's different now for no dumb reason. Just change the filter priority from 25 to 9992 to make the exact code work again. /** ============================================================= * replace WordPress Howdy in Admin Bar with Hi in WordPress 6.6+ * or" last_modified: "2024-09-16T19:41:53+00:00" categories: [Articles] custom_fields: nectar_blog_post_view_count: 881 pld_like_count: 98 --- # Replace Howdy in WordPress 6.6.2+ [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Hey, it’s different now for no dumb reason. Just change the filter priority from 25 to 9992 to make the exact code work again. /** ============================================================= * replace WordPress Howdy in Admin Bar with Hi in WordPress 6.6+ * or remove howdy (replace with nothing) */ function replace_howdy( $wp_admin_bar ) {     $my_account = $wp_admin_bar->get_node('my-account');     if ( isset( $my_account->title ) ) {         $newtitle = str_replace( 'Howdy,', '', $my_account->title );         $wp_admin_bar->add_node( array(             'id' => 'my-account',             'title' => $newtitle,         ) );     } }; add_filter( 'admin_bar_menu', 'replace_howdy', 9992 ); // change the 25 to 9992 --- --- title: "WooCommerce Hacking The Price Field With get_sku()" url: "https://wallydavid.com/woocommerce-hacking-the-price-field-with-get_sku/" lang: "en-US" type: "post" description: "This is actually really handy for when you have variable options and WooCommerce just echos out a $0 dollar amount on the product page until something is selected as an option in the product itself. This way you can set" last_modified: "2024-09-05T05:24:16+00:00" categories: [Articles] custom_fields: nectar_blog_post_view_count: 920 pld_like_count: 67 --- # WooCommerce Hacking The Price Field With get_sku() [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 This is actually really handy for when you have variable options and WooCommerce just echos out a $0 dollar amount on the product page until something is selected as an option in the product itself. This way you can set a default starting price that doesn’t affect the cart math. ![MCC Cart Math](https://wallydavid.com/wp-content/uploads/2024/09/Screenshot-2024-09-05-at-1.21.01 AM.jpg) add_filter( 'woocommerce_get_price_html', 'wally_price_free_empty', 9999, 2 );    function wally_price_free_empty( $price, $product ){     if ( '' === $product->get_sku() || 6100 == $product->get_sku() ) {         $price = 'Starting at $34.00';     }       return $price; } add_filter( 'woocommerce_get_price_html', 'wally_price_free_empty2', 9999, 2 ); function wally_price_free_empty2( $price, $product ){     if ( '' === $product->get_sku() || 61002 == $product->get_sku() ) {         $price = 'Starting at $34.00';     }       return $price; } add_filter( 'woocommerce_get_price_html', 'wally_price_free_empty3', 9999, 2 ); function wally_price_free_empty3( $price, $product ){     if ( '' === $product->get_sku() || 6001 == $product->get_sku() ) {         $price = 'Starting at $20.00';     }       return $price; } add_filter( 'woocommerce_get_price_html', 'wally_price_free_empty4', 9999, 2 ); function wally_price_free_empty4( $price, $product ){     if ( '' === $product->get_sku() || 60012 == $product->get_sku() ) {         $price = 'Starting at $20.00';     }       return $price; } add_filter( 'woocommerce_get_price_html', 'wally_price_free_empty5', 9999, 2 ); function wally_price_free_empty5( $price, $product ){     if ( '' === $product->get_sku() || 106 == $product->get_sku() ) {         $price = 'Starting at $20.00';     }       return $price; } add_filter( 'woocommerce_get_price_html', 'wally_price_free_empty6', 9999, 2 ); function wally_price_free_empty6( $price, $product ){     if ( '' === $product->get_sku() || 1062 == $product->get_sku() ) {         $price = 'Starting at $20.00';     }       return $price; } --- --- title: "FTC Passes Rule Banning Noncompetes In The US Overriding All States Existing Laws." url: "https://wallydavid.com/ftc-passes-rule-banning-noncompetes-in-the-us-overriding-all-states-existing-laws/" lang: "en-US" type: "post" last_modified: "2024-10-06T21:51:19+00:00" categories: [Articles] custom_fields: nectar_blog_post_view_count: 737 pld_like_count: 116 --- # FTC Passes Rule Banning Noncompetes In The US Overriding All States Existing Laws. [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 [divider line_type=”No Line” custom_height=”20″] --- --- title: "Captains Log: Part 3" url: "https://wallydavid.com/captains-log-part-3/" lang: "en-US" type: "post" last_modified: "2024-09-27T15:28:36+00:00" categories: [Articles] tags: [Sailing, Videos] custom_fields: nectar_blog_post_view_count: 785 pld_like_count: 167 --- # Captains Log: Part 3 [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "Privacy & Terms" url: "https://wallydavid.com/privacy-policy/" lang: "en-US" type: "page" last_modified: "2026-06-24T16:56:32+00:00" custom_fields: nectar-metabox-portfolio-display: "all" nectar-metabox-portfolio-display-sortable: "off" --- # Privacy & Terms [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 [divider line_type=”Full Width Line” line_thickness=”1″ divider_color=”default” custom_height=”100″] --- --- title: "Harden Your WordPress Hosting With A Default PHP.INI Config File" url: "https://wallydavid.com/harden-your-wordpress-hosting-with-a-default-php-ini-config-file/" lang: "en-US" type: "post" description: "Here is a basic set of PHP.ini directives for any cPanel type hosting to help secure and harden your hosted WordPress websites. Sometime your servers are in another state or country and in the wrong time zone. This can mess" last_modified: "2024-08-30T20:02:54+00:00" categories: [Articles] tags: [Hacking, WordPress] custom_fields: nectar_blog_post_view_count: 1031 pld_like_count: 92 --- # Harden Your WordPress Hosting With A Default PHP.INI Config File [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Here is a basic set of PHP.ini directives for any cPanel type hosting to help secure and harden your hosted WordPress websites. Sometime your servers are in another state or country and in the wrong time zone. This can mess up some date and time plugins – this is how you fix it. ;force new time zone - date.timezone = "America/Detroit" Lots of bad thing hide in encrypted code and Base64 is the garbage of the internet. This will block any Base64 code from even running. Protecting you from a world of hidden virus and back door payloads. As an added bonus, lots of the themes in the WordPress theme gallery chooser are full of encrypted footers with author links, logos and nags to buy something. This will weed out those crap themes because they won’t work at all. ; turn base64 garbage off base64_decode = Off Hide your PHP code from being viewed from a browser or scraped from a bot. ; hide php code and version expose_php = Off Sometimes is nice to know when you have an error with php during development or scheduled updates, but you don’t need to let a hacker know where they are by displaying the error. ; Disable displaying errors to screen display_errors = off If your going to use the previous one to hide the errors, you still need to know if they are happening. With this code you can write any errors to the apache log files on the server to see whats going on. ; Enable writing errors to server logs log_errors = on If your WordPress site is basically brochure-ware sitting out on the web that is rarely used for uploading any files, you can use this to disable uploads all together. I suggest using this in a .user.ini file for specific sites and not using this in the root php.ini. You could accidentally disable uploads to all your sites. Although, of you suspect a server hack, you could quickly disable uploading on all your sites using this too. ; allows wordpress uploads file_uploads = On Sets your global PHP upload size. This can be over-ridden on a directory by directory basis using the same code in a .user.ini file also. ; MB user can upload via php upload_max_filesize = 2M post_max_size = 2M max_execution_time = 300 Some PHP can retrieve information and data from other servers. A lot of WordPress plugins are famous for this and eat a lot of bandwidth and resources and you would probably never know it. This will stop that. ; disables retrieving data from remote locations using php ftp or http protocols. allow_url_fopen = on Disables attaching files to urls that can be written back into a database. ; disables attaching files to urls that can be written back into the database allow_url_include = Off If an attacker somehow manages to inject Javascript code for stealing user’s current cookies – the document.cookie string – the HttpOnly cookie you’ve set won’t show up in the list. ; Javascript Cookie Protection session.cookie_httponly = off Kills processes that are stuck or taking longer than 30 seconds to complete. Adjust this to fit your needs. Uploading video or audio can sometimes take longer that 30 seconds. ; resource control set in seconds ; max_execution_time = 30 ; max_input_time = 30 ; memory_limit = 40M Disable these most vulnerable to attack server functions that are rarely used: ; disabling dangerous PHP functions disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source --- --- title: "Pre-Colored Fonts Hit The Mainstream Font Repos (Like a Digital Virus)" url: "https://wallydavid.com/pre-colored-fonts-hit-the-mainstream-font-repos-like-a-digital-virus/" lang: "en-US" type: "post" description: "What are colored fonts? Well this is how myfonts.com puts it: MyFonts.com Excerpt: \"You can think of color fonts like, say, emojis: these fonts come with preset color schemes, so when a user typesets with them, some colors appear incorporated" last_modified: "2024-08-31T02:22:34+00:00" categories: [Articles] custom_fields: nectar_blog_post_view_count: 1090 pld_dislike_count: 52 pld_like_count: 23 --- # Pre-Colored Fonts Hit The Mainstream Font Repos (Like a Digital Virus) [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 ![](https://wallydavid.com/wp-content/uploads/2024/08/header_.jpg) **What are colored fonts? Well this is how myfonts.com puts it:** > MyFonts.com Excerpt: “You can think of color fonts like, say, emojis: these fonts come with preset color schemes, so when a user typesets with them, some colors appear incorporated in them, determined by the font’s designer. Altering the colors is possible, but with some limitations. Some popular programs, like the latest Adobe Illustrator, allow for the user to make easy color changes to artwork, but the fonts must be converted to outlines first. **What I think colored fonts are:** A horrible idea and underlines the reason why you should provide every client with a font, logo and color style guide. Any professional designer is going to use a Pantone color to match a clients colors from a style guide of some sort. I can see this creating all kinds of problems for professional production artists, when inexperienced designers are using these fonts and inadvertently create separation and color matching nightmares out of their production files. Im not entirely sure about the need for this. MyFonts.com interviewed a font designer who seemed to think that it was a burden for a graphic designer to have to look at a bare black and white font and try to come up with colors and possibly design a logo. **This is what they said: ** > MyFonts.com Excerpt: “Graphic designers color fonts all the time, especially in display situations like logos or headlines, ads and packaging. Traditionally fonts came bare, without color at all, which puts the onus on the user’s imagination, training and color sense to produce the best results as far as color is concerned. The idea with color fonts is to make things simpler for the user by providing a cue, a point of inspiration, or a way to focus the imagination.” In my opinion, graphic designers are pretty great at coming up with inspiration all on their own. That’s kind of their job and what they do well. My fear is that some clients with loose reins on their employees will start using these fonts on their social media, internal stationary, and signage because of the way they look. The perceived ease of use may eventually become an agency nightmare to fix, as they find themselves off brand down the road. **Tech or Trash?** Colored fonts are new, and I think this is something to keep an eye on. It’s too early to call this any sort of emerging technology for professional designers, especially with the fragility of brand integrity- but time will tell if these are a fad or are actually valuable. Currently there are mainstream version of Trajon, Times and some others that are colored with effects that are available for Mac and Windows. As an added minefield, some of the fonts available on dafont, typekit and myfonts include colored version too. So be mindful and make sure your clients have a font, logo and color style guide at all times. --- --- title: "Why I Love Googles Readability Score – It’s Killing Corporate Jargon" url: "https://wallydavid.com/why-i-love-googles-readability-score-its-killing-corporate-jargon/" lang: "en-US" type: "post" description: "“Readability” measures how easy it is for people to recognize words, sentences, and phrases. When your site’s readability is high, users will be able to efficiently scan your site and take in the information in the text without much effort." last_modified: "2024-08-30T19:48:26+00:00" categories: [Articles] tags: [Google, Tips] custom_fields: nectar_blog_post_view_count: 821 pld_like_count: 107 pld_dislike_count: 1 --- # Why I Love Googles Readability Score – It’s Killing Corporate Jargon [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 ![](https://wallydavid.com/wp-content/uploads/2024/08/jargon_thumb.jpg) “**Readability**” measures how easy it is for people to recognize words, sentences, and phrases. When your site’s readability is high, users will be able to efficiently scan your site and take in the information in the text without much effort. In plain words, overly technical, or overly complex, writing can be a big turn-off for readers. All that corporate jargon is an easy way to tune people out, and Google knows it. All those buzz words that make peoples eyes roll can have a huge impact on your business insights. And this is why I love the readability scoring – I can’t stand corporate jargon. If I visit a website site or see a post written with overly stuffed corporate buzz words I immediately leave, and this is a trend that even Google is aware of. I’m not talking about stop words here, I’m talking about readability, and this is an important difference. The point isn’t to dumb down your content in an inauthentic manner. It’s your company or brand and if you’re smart, and want to sound smart, you should! The real importance of readability scores is reader engagement. Can you engage your audience—and get them to understand what you’re trying to communicate in a simpler way? Because if they’re zoning out or skimming over your big, fancy, scientific words, then you’ve lost that battle. ### Flesch-Kincaid Readability Scoring Developed by Rudolf Flesch and J. Peter Kincaid, the Flesch-Kincaid readability scores are the most widely used measures of readability. And they are used by the United States military to evaluate the readability of their manuals. The first number, Flesch-Kincaid reading ease, is based on a ranking scale of 0-100, and the higher your score, the better. Low scores indicate text that is complicated to understand. So if your website receives a low Flesch-Kincaid reading ease score, you will likely need to simplify your text. For most business writing, a score of 65 is a good target, and scores between 60 and 80 should generally be understood by 12 to 15 year olds. [TEST YOUR WEBSITE HERE](https://www.webpagefx.com/tools/read-able/) ### Some Best-Practices for Writing for the Web If your website isn’t scoring between 65-80 then here are a few tips: - You should use white space. Keep paragraphs short, no more than six lines, and ensure there is clear white space between each. - Use shorter words and sentences, depending on your target audience. - Use language that is easy to understand for the target audience, jargon might be necessary, but usually isn’t. ### I do not think it means what you think it means anymore… Just because you’ve been using a phrase or writing a certain way since the early 80’s doesn’t mean any normal person your trying to pitch your brand or services to knows what it means in this day and age. Most millennial’s will make a decision not to buy or even use your services within a few minutes of the face to face corporate jargon pitch. 80% of visitors to your site will leave within a few minutes of reading too corporate sounding or confusing copy. So your not only dealing with taking a a hit on Google insights, but annoying your potential client base too. ### Here’s a funny list of flagged words and phrases to avoid: Grow the business, Multi-Channel, Content is king, Actionable, Above-board, Baked in, Touch base offline, It’s on my radar, Gain traction, Low-hanging fruit, Ninth inning, Upshot, Bandwidth, Think outside the box, Buy-in, Core competencies, Deliverable, Guesstimate, Valued partner, Value-added, Utilize, Unpack, Traction, Push the envelope, Proactive, Pain point, Vertical Market, Out of pocket, Optimize, Move the needle, Mission-critical, Methodology, Maximize, Leverage, Level playing field, Key takeaways, Incentivize, Impact, Ideation, Pivot, Synergy… and so many more. --- --- title: "11 Steps To A Great Website" url: "https://wallydavid.com/11-steps-to-a-great-website/" lang: "en-US" type: "post" description: "#1 START WITH CONTENT Everything ever built well started with a well crafted plan. Content for your website is like the glue and mortar that builds the site map and determines the structure. Starting with images and dummy content and" last_modified: "2024-08-30T19:46:35+00:00" categories: [Articles] tags: [Tips, Web Development] custom_fields: nectar_blog_post_view_count: 901 pld_like_count: 45 --- # 11 Steps To A Great Website [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 ### #1 START WITH CONTENT Everything ever built well started with a well crafted plan. Content for your website is like the glue and mortar that builds the site map and determines the structure. Starting with images and dummy content and building out a site is like building a roof before you’ve even laid the foundation. Starting with writing the content first eliminates many unknowns and confusion, while allowing for creative freedom when it’s time to design and build the actual site. ### #2: MOBILE/TABLET FRIENDLY Typically, a site’s breakdown of user traffic is split 50/50 between desktop and mobile. Tablet users account for 5–10% of that traffic. Not only will you deter users if your site is not formatted to work well on mobile devices but you’ll also be strongly penalized by Google. The solution? It isn’t necessarily responsive design. Sometimes, pages need to be reformatted specifically for mobile. It’s important to choose the right approach. ### #3: COMPELLING CALL’S TO ACTION Make visitors want to engage with your business through inviting calls to action by presenting them with interesting content that keeps them informed and attentive along the way. We will create a plan of hierarchy for CTA’s that fit with your web strategy, so your CTA’s will engage visitors in a way that feels exciting, but still true to your brand. ### #4: ZERO BUGS Bugs are the fastest way to deter users, and they can pop out of nowhere, even if you haven’t made any changes to your site. Browser and operating system updates, new phones, server upgrades, hackers—they can all trigger bugs. It’s important to have someone monitoring and fixing bugs as soon as they appear. ### #5: EASY NAVIGATION Users should always be able to find what they’re looking for—or have a way to get it. Nothing frustrates users more than not being able to find what they need, which is why proper navigation is so important to customer engagement and conversions [LINK: UI and UX design]. Give users easy access (and multiple ways to get there) to things like contact information, signup forms, key documents and impactful content. ### #6: CROSS BROWSER COMPLIANCE Most developers only test sites on a single browser, but there are several browsers that are widely used, including Internet Explorer, Google Chrome, Safari and Microsoft Edge. In order to cover all users, your site needs to work on all of them, which requires periodic review to account for browser updates. What may have worked at launch may not work a few months out. (IE 6-9 are all over 11 years old at this point, they don’t count.) ### #7: FAST LOAD TIMES Great websites move at great speeds. People don’t have the patience to put in work to browse, so sites have to be fast in order to retain users. Studies show that every additional second it takes a site to load will cause a loss of roughly 4% of users. In other words, if your site takes 10 additional seconds to load, you’ll lose 40% of users. ### #8: GOOD LOOKS A site has to look great graphically on desktop and mobile devices. If it doesn’t look up to modern standards, people will discount it out of hand without even looking at the content. Enhance your site design (and engage users) with features like video, animations, pop-ups and sliders, but remember: Not only does your site have to look good but it also has to align with your brand. ### #9: EFFECTIVE SEO SEO is always evolving—and it’s a critical tool. SEO assists in moving your site higher up on natural search engines (e.g., Google and Bing). Proper SEO can increase traffic to your site while reducing marketing costs. However, SEO isn’t a one-shot deal. The way search engines score sites changes over time, and there are continually new rules to optimize by. Keeping keywords fresh, site maps up to date and flat links intact are just a few parts of the optimization puzzle. ### #10: USE ANALYTICS TOOLS The proper analytics and user analytics tools will help you stay on top of optimization. At a bare minimum, Google Analytics will monitWeor your site and identify problem areas. Take it a step further with tools like Hotjar, which allows you to watch users as they navigate your site. Programs like Moz and SEMrush will recommend modifications to make to improve your SEO positioning. ### #11: A PLAN TO DRIVE TRAFFIC One of the biggest mistakes is assuming that if you build it, they will come. Just because you create a great website doesn’t mean you’ll instantly have a stampede of visitors. It’s important to have a plan to get people there or else you’ll waste one of your greatest assets. The sooner this plan is in place, the better your site can be tailored to a promotion strategy, which should include a mix of paid ads , social campaigns, emails, videos and traditional marketing and advertising. We can help you leverage your site and create a strategy that will increase your ROI. --- --- title: "The Cult of the Complex" url: "https://wallydavid.com/the-cult-of-the-complex/" lang: "en-US" type: "post" description: "I'm reposting this article. It's worth a read. I couldn't have said it better myself. by Jeffrey Zeldman May 31, 2018 ’Tis a gift to be simple. Increasingly, in our line of work, ’tis a rare gift indeed. In an" last_modified: "2024-08-30T19:45:11+00:00" categories: [Articles] tags: [Rant] custom_fields: nectar_blog_post_view_count: 867 pld_like_count: 32 --- # The Cult of the Complex [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 I’m [reposting this article](https://alistapart.com/article/cult-of-the-complex). It’s worth a read. I couldn’t have said it better myself. by [Jeffrey Zeldman](https://alistapart.com/author/zeldman) May 31, 2018 _**’Tis a gift to be simple. Increasingly, in our line of work, ’tis a rare gift indeed.**_ In an industry that extols innovation over customer satisfaction, and prefers algorithm to human judgement (forgetting that every algorithm has human bias in its DNA), perhaps it should not surprise us that toolchains have replaced know-how. Likewise, in a field where young straight white dudes take an overwhelming majority of the jobs (including most of the management jobs) it’s perhaps to be expected that web making has lately become something of a dick measuring competition. [Read full article at alistapart.com](https://alistapart.com/article/cult-of-the-complex)   --- --- title: "Download Every Google Font From Git As TTF’s" url: "https://wallydavid.com/download-every-google-font-from-git-as-ttfs/" lang: "en-US" type: "post" description: "Did you know you can download EVERY Google font for use on your local computer right from GIT? With the main stream acceptance and use of Googles amazing font repository, I've pretty much tried to ditch all the other paid" last_modified: "2024-08-30T19:48:40+00:00" categories: [Articles] tags: [Fonts, Google, Hacking, Web Development] custom_fields: nectar_blog_post_view_count: 1885 pld_like_count: 96 --- # Download Every Google Font From Git As TTF’s [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 _ Did you know you can download EVERY Google font for use on your local computer right from GIT? With the main stream acceptance and use of Googles amazing font repository, I’ve pretty much tried to ditch all the other paid type foundries and use Google fonts for all my creative work in web and print. Even better is that every few months Google seems to be adding new and better font faces, so I’ve yet find a font-face that didn’t meet a projects needs. Plus, being open-source I don’t have any of the legal worries about using any of the fonts for private, commercial or public projects. And as an added bonus these work with Mac, Windows and Linux while keeping me within my goal of not paying a subscription for any software I use (including fonts). It’s a hefty download over a gig in size, but totally worth it for a freebie. Grab the latest archive here: [DOWNLOAD AT GITHUB_](https://github.com/google/fonts) ![](https://wallydavid.com/wp-content/uploads/2024/08/Screen-Shot-2018-08-10-at-11.41.11-AM.jpg) --- --- title: "Effective Storytelling And Why It Matters To Your Brand" url: "https://wallydavid.com/effective-storytelling-and-why-it-matters-to-your-brand/" lang: "en-US" type: "post" description: "Every culture has stories – stories engage us, help up relate, empathize, and often make us feel part of them. Stories are everywhere. They’re a key part of what helps us to identify with each other and make sense of" last_modified: "2024-08-30T19:39:56+00:00" categories: [Articles] tags: [Story Telling, Web Development] custom_fields: nectar_blog_post_view_count: 997 pld_like_count: 56 --- # Effective Storytelling And Why It Matters To Your Brand [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 ![](https://wallydavid.com/wp-content/uploads/2024/08/memorable_.jpg) Every culture has stories – stories engage us, help up relate, empathize, and often make us feel part of them. Stories are everywhere. They’re a key part of what helps us to identify with each other and make sense of the world around us. Emotionally they grab us, they make us want to be part of something. As children, stories form a key part of how we learn to understand the people and the world around us, and also work out which communities that we want to engage with. It’s no different as we grow older. Storytelling is as the heart of any good communication strategy and is a key part of how we learn to both connect with the people around us, and also to escape into someone else’s story when we want to relax or be inspired. The film industry is worth billions, and it’s all based on good stories. So too is marketing. Brands have used stories in their marketing to not only encourage people to buy from them, but to be supporters of their brand – a loyal customer who will return again, because they have identified with the underlying brand story. In-turn, they also know that their customer’s stories can be a powerful tool in their marketing kit to shout their brand and products from their own platforms and social groups. [Apple](https://apple.com) is the underdog story of our generation, who fought against all odds to become the worlds most valued company. Or John Lee Cronin, a young man with Down Syndrome, who is breaking the stereotype mold by selling millions of dollars of custom socks out of his house that competes with the likes of Amazon ([https://johnscrazysocks.com](https://johnscrazysocks.com)). These stories are out there and they inspire us, and our brand loyalty. It’s the power of stories that can change someone from a passive by-stander to a participant and there are many reasons why stories are seen as a powerful tool by many for: marketing, campaigning, engaging and growing awareness and audience. > “Tell someone how and they’ll learn. Tell someone the truth and they’ll believe. But tell someone a story and it will live in their heart forever” – Ancient proverb We’re all storytellers, whether we realize it or not. So if your brand has a story – tell it – because embracing your brands story can seriously grow your audience. --- --- title: "Snippets – WooCommerce Add Insurance On Checkout" url: "https://wallydavid.com/snippets-woocommerce-add-insurance-on-checkout/" lang: "en-US" type: "post" description: "You can use this for anything really, but I use it for setting a shipping insurance fee on checkout. Pretty simple really. (1) Add a hidden product with the value (dollar amount) (2) Save the hidden product and get the" last_modified: "2024-08-30T19:32:57+00:00" categories: [Articles] tags: [Hacking, WooCommerce] custom_fields: nectar_blog_post_view_count: 839 pld_dislike_count: 10 pld_like_count: 97 --- # Snippets – WooCommerce Add Insurance On Checkout [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 You can use this for anything really, but I use it for setting a shipping insurance fee on checkout. Pretty simple really. (1) Add a hidden product with the value (dollar amount) (2) Save the hidden product and get the product ID (3) Change ID and Costs in the code below. (4) Add all this to your functions file or create a stand alone plugin. add_action('woocommerce_cart_totals_after_shipping', 'wc_shipping_insurance_note_after_cart'); function wc_shipping_insurance_note_after_cart() { global $woocommerce;     $product_id = 1963;  // Change ID foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {     $_product = $values['data'];     if ( $_product->id == $product_id )         $found = true;     }     // if product not found, add it if ( ! $found ): ?>                                                   $25      get_price() || 0 == $product->get_price() ) {         $price = 'FREE';     }       return $price; } // SEE DETAILS --------------------------------- add_filter( 'woocommerce_get_price_html', 'wally_price_details', 9999, 2 );    function wally_price_details( $price, $product ){     if ( '' === $product->get_price() || 99999 == $product->get_price() ) {         $price = 'SEE DETAILS';     }       return $price; } // CANCELLED --------------------------------- add_filter( 'woocommerce_get_price_html', 'wally_price_cancelled', 9999, 2 );    function wally_price_cancelled( $price, $product ){     if ( '' === $product->get_price() || 99998 == $product->get_price() ) {         $price = 'CANCELLED';     }       return $price; } // REGISTRATION --------------------------------- add_filter( 'woocommerce_get_price_html', 'wally_price_registration', 9999, 2 ); function wally_price_registration( $price, $product ){     if ( '' === $product->get_price() || 99997 == $product->get_price() ) {         $price = 'REGISTRATION';     }       return $price; } --- --- title: "WooCommerce Add Insurance On Checkout" url: "https://wallydavid.com/woocommerce-add-insurance-on-checkout/" lang: "en-US" type: "post" description: "Random little issue I had to solve. Create a way to add insurance to an order. Basically create a dummy product not in the store for a set amount. Change the to the ID of your product that is the" last_modified: "2024-08-30T19:30:01+00:00" categories: [Articles] tags: [Hacking, WooCommerce] custom_fields: nectar_blog_post_view_count: 1003 pld_like_count: 35 --- # WooCommerce Add Insurance On Checkout [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Random little issue I had to solve. Create a way to add insurance to an order. Basically create a dummy product not in the store for a set amount. Change the [add-to_cart_url id=””?????] to the ID of your product that is the amount of insurance you want to add to the order. Then change the button text to match the price. Pretty simple and commented below. add_action('woocommerce_cart_totals_after_shipping', 'wc_shipping_insurance_note_after_cart'); function wc_shipping_insurance_note_after_cart() { global $woocommerce;     $product_id = 1963;  // Change ID foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {     $_product = $values['data'];     if ( $_product->id == $product_id )         $found = true;     }     // if product not found, add it if ( ! $found ): ?>                                                   $25      The cornerstone features of reliability and productive stability that propelled the [WordPress](https://wordpress.org) platform to success, have been completely eroded by the misguided direction of trying to compete with Wix and SquareSpace while ignoring enduser developer concerns. I do understand the reasoning for [Gutenberg](https://wallydavid.com/wordpress-5-gutenberg-disable-it-and-use-the-classic-editor/) to some extent for the WordPress.com platform. Wix and SquareSpace tout their easy editor and how easy it makes designing a website. So it’s only logical that [WordPress.com](https://wordpress.com) would have one eventually too so they could market the same feature. The problem with this argument is, anyone who’s ever actually used Wix or SquareSpace will tell you how horrible and limiting the experience using those editors are. **Making all of this worse was the decision to bake this in to the WordPress.org version that developers use too**. So in yet another #metoo movement, [Automatic](https://automattic.com) created their own version of a horrible online editor, when in-fact what they had was actually, in my opinion, one of it’s biggest draws to the platform. All while there where obvious, proven, and better visual editing solutions already available to the general public that they could have incorporated. Developers and web historians will probably look back at this for years about the bad decisions [Automatic](https://automattic.com) made while trying to create a solution to a problem that didn’t exist. More, the forked user base that’s been created will be thrown to the winds of uncertainty now that this door has been opened. I’m sure everyone will be wondering about the future of theme and plug-in compatibility going forward. My final thoughts are that there is a massive online push by the community to keep the editor as a plugin and not bake it in to the core. A [petition is to ask the WordPress team to keep Gutenberg out of the core of WordPress](https://www.change.org/p/petition-to-wordpress-no-gutenberg-in-wordpress-core) has been gaining massive support by top developers and community leaders. ([But it’s been made clear that will never happen](https://dev.to/scottybo/gutenberg-is-coming-and-nothing-you-do-will-stop-it-4844).) Maybe this will be the wake up call that brings the entire WordPress leadership team back to it’s senses and listening to it’s users again. Maybe they’ll get the project back upright again, but I doubt it. I’m getting behind ClassicPress and will support it as much as possible. We’ll have to see what happens this year and how many plugin developers support it going forward. [Discover ClassicPress Here__](https://www.classicpress.net) --- --- title: "Alexa, Solitair and Digital Toilets" url: "https://wallydavid.com/alexa-solitair-and-digital-toilets/" lang: "en-US" type: "post" last_modified: "2024-12-05T03:46:43+00:00" categories: [Articles] tags: [Rant] custom_fields: nectar_blog_post_view_count: 751 pld_like_count: 46 --- # Alexa, Solitair and Digital Toilets [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "Disable Deactivation For Specific Must-Use WordPress Plugins" url: "https://wallydavid.com/disable-deactivation-for-specific-must-use-wordpress-plugins/" lang: "en-US" type: "post" description: "Disable plugin deactivation from the plugin.php page for custom plugins or plugins that are specified as \"must use\". add_filter( 'plugin_action_links', 'disable_plugin_deactivation', 10, 4 ); function disable_plugin_deactivation( $actions, $plugin_file, $plugin_data, $context ) { if ( array_key_exists( 'deactivate', $actions ) && in_array(" last_modified: "2024-08-30T18:58:04+00:00" categories: [Articles] tags: [Hacking, WordPress Plugin] custom_fields: nectar_blog_post_view_count: 813 pld_like_count: 68 --- # Disable Deactivation For Specific Must-Use WordPress Plugins [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Disable plugin deactivation from the plugin.php page for custom plugins or plugins that are specified as “must use”. add_filter( 'plugin_action_links', 'disable_plugin_deactivation', 10, 4 ); function disable_plugin_deactivation( $actions, $plugin_file, $plugin_data, $context ) {     if ( array_key_exists( 'deactivate', $actions ) && in_array( $plugin_file, array(         'add-the/url-to/your-plugin-here.php',     )))         unset( $actions['deactivate'] );     return $actions; } --- --- title: "Delivering Office 365 or Exchange Server Mail Using Godaddy" url: "https://wallydavid.com/delivering-office-365-or-exchange-server-mail-using-godaddy/" lang: "en-US" type: "post" description: "Email deliverability is the single bane of my existence. If your using your own Office 365 (Not the GoDaddy Version) or an own exchange server that's getting mail from contact forms or send mail services, add these records to your" last_modified: "2024-08-30T18:58:12+00:00" categories: [Articles] tags: [Hacking] custom_fields: nectar_blog_post_view_count: 860 pld_dislike_count: 6 pld_like_count: 40 --- # Delivering Office 365 or Exchange Server Mail Using Godaddy [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Email deliverability is the single bane of my existence. If your using your own Office 365 (Not the GoDaddy Version) or an own exchange server that’s getting mail from contact forms or send mail services, add these records to your DNS as TXT to make sure they work. **Note to self:** TXT | v=spf1 mx include:secureserver.net -all TXT | v=spf1 a mx ptr include:secureserver.net ~all TXT | Email: v=spf1 include:spf.protection.outlook.com -all --- --- title: "A Nice Client Website End of Life Support Update Letter" url: "https://wallydavid.com/a-nice-client-website-end-of-life-support-update-letter/" lang: "en-US" type: "post" description: "Hello XXXXX, It was brought to my attention by our web team that your website is now reaching XX years since its original deployment. This means that several parts of your site’s original development are out of date, and after" last_modified: "2024-08-30T18:58:21+00:00" categories: [Articles] tags: [Tips] custom_fields: nectar_blog_post_view_count: 786 pld_like_count: 37 --- # A Nice Client Website End of Life Support Update Letter [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Hello XXXXX, It was brought to my attention by our web team that your website is now reaching XX years since its original deployment. This means that several parts of your site’s original development are out of date, and after XXXXX, will no longer be supported in our current hosting environment. As your site continues to age, this also leaves it vulnerable to hacking, data loss, and a degraded user experience, especially on mobile devices. Don’t worry! We have time to figure this out. Rest assured your site will continue to run just fine past this date, but it does increase the risk of failing due to incompatibilities or security holes. As a solution, we would like to propose a rebuild of your site. This will help to ensure that you won’t encounter any of these unwanted situations, and will let you take advantage of the mobile-first practices that Google and other search engines place a premium on. In almost all cases, it improves the ease of content updates, speed, reduction in form spam, and eliminates browser security warnings. Additionally, there are many ways to approach this upgrade. If you are happy with the content and functionality of your existing site, we will simply migrate that to the new build of your site. If you would rather take this opportunity to also expand upon or change the content and/or features or functionality of your site, it’s a great time to do that too. Let us know if you would like to set up a meeting or a conference call to go over our recommendations in more detail. Thank you, XXXXXXX XXXXXX --- --- title: "Customizing the Media Uploads Page In WordPress for Clients in Two Ways" url: "https://wallydavid.com/customizing-the-media-uploads-page-in-wordpress-for-clients-in-two-ways/" lang: "en-US" type: "post" description: "Something that is a constant battle with clients is explaining over and over on a weekly basis why you can't take a 25MB HD image of your dog from your iPhone and upload it as a hero image to your" last_modified: "2026-07-22T15:36:31+00:00" categories: [Articles] tags: [Hacking, WordPress Plugin] custom_fields: nectar_blog_post_view_count: 732 pld_dislike_count: 1 pld_like_count: 49 --- # Customizing the Media Uploads Page In WordPress for Clients in Two Ways [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Something that is a constant battle with clients is explaining over and over on a weekly basis why you can’t take a 25MB HD image of your dog from your iPhone and upload it as a hero image to your blog post. You can fiddle the php.ini and install all kinds of image compression plugins, but at the end of the day average people just aren’t as technical as developers. If you give them a 2MB upload limit — they will kill their bandwidth and blogroll with a ton of 2MB images. Even though all of them could have been under 200kb probably. What I’ve found is that little helpful reminders of conversations or tips & tricks links at the top of pages really help. Here are two ways to nudge clients into doing image uploads right. ### INLINE MESSAGE directly in the **uploads.php** file. I’ll say upfront that this is not the best way to do this. However, the reason I do this sometimes is because I use a function to disable plugin and theme cross-selling and advertising nags globally in WordPress. I also hide all the WordPress notification cruft that clients don’t need to see in the back end. So rather than inserting this notice using a function, I just edit the **upload.php** file. This is an easier – but dirtier hack. The downside to this being, if you **update WordPress**, the **uploads.php gets written over** along with your code. To start – Head to the **wp-admin** folder in your installation directory and open the **upload.php** file. **Head to line 96** and look for the space right before **
**. Paste something like this:
Reminder: Image sizes for SLIDERS need to be no wider than 1900px.
All images should be under 500kb max. Try Pixlr to resize images. Import image > Choose Save > Quality MED.
Save the file and preview the media uploads section now. Edit the messages to say whatever you want. ![](https://wallydavid.com/wp-content/uploads/2024/08/Screen-Shot-2020-09-22-at-2.01.29-PM.jpg)Screenshot ### AS a PLUGIN Here is the second and (probably) the correct way. Using a function to select the page then echo out the messages as WordPress notices. You can update your WordPress installation and not write over the uploads.php file this way. The only draw back to this is, you can’t hide the mind boggling amount of upsell-nags from themes and plugins using a site wide function to disable all nags and warning because you’ll disable these messages to your client too.             

Reminder: Image sizes for SLIDERS need to be no wider than 1900px.

         ';          echo '
            

All images should be under 500kb max. Try Pixlr to resize images. Import image > Choose Save > Quality MED.

        
';     } } add_action('admin_notices', 'general_admin_notice'); ?> ![](https://wallydavid.com/wp-content/uploads/2024/08/Screen-Shot-2020-09-22-at-3.08.12-PM.jpg)Screenshot --- --- title: "Whitelist or Blacklist WordPress User Registrations By Domain Function" url: "https://wallydavid.com/whitelist-or-blacklist-wordpress-user-registrations-by-domain-function/" lang: "en-US" type: "post" description: "Interesting WordPress security concepts here. You can either whitelist specific domains essentially guaranteeing only registered users have the same email as the domain of the website, or you can play wack-a-mole by constantly manually adding bad actors to a black" last_modified: "2024-08-30T18:58:48+00:00" categories: [Articles] tags: [Hacking] custom_fields: nectar_blog_post_view_count: 706 pld_dislike_count: 4 pld_like_count: 46 --- # Whitelist or Blacklist WordPress User Registrations By Domain Function [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 ![](https://wallydavid.com/wp-content/uploads/2024/08/image-2.jpeg) Interesting WordPress security concepts here. You can either whitelist specific domains essentially guaranteeing only registered users have the same email as the domain of the website, or you can play wack-a-mole by constantly manually adding bad actors to a black list. Both ways have pros and cons. ### Blacklist a list of domains in an array I find real world uses for this all the time. Especially for collecting user data for digital marketing downloads. Like B-to-B users filling out a form to access a pricing, pdfs or marketing materials. They shouldn’t be spoofing the registration with a disposable yahoo or hotmail email address just to get to a downloadable file. // blacklist specific domains in an array function wd_blacklist_domains( $field_id, $field_submit, $form_data ) {     $domain          = substr( strrchr( $field_submit, "@" ), 1 ); // blocked domains     $blacklist       = array( 'yahoo.com', 'hotmail.com' );     if( in_array( $domain, $blacklist ) ) {         wpforms()->process->errors[ $form_data['id'] ][ $field_id ] = esc_html__( 'We apologize for any inconvenience, we are unable to accept emails from this domain.', 'wpforms' );         return;     } } add_action('wpforms_process_validate_email', 'wd_blacklist_domains', 10, 3 ); ### Whitelist a list of domains in an array Limiting user registration to only registrants with an email address from the site domain seems like a more sustainable endeavor and the better security option to lock down a client website from unauthorized registrations. Also, if you just add the site domain and your development domain, you can weed out other competitors that talk your client into snooping around. // whitelist specific domains in an array function wd_is_valid_email_domain($login, $email, $errors ){ $valid_email_domains = array("@domain.com","@domain.co.uk");// allowed domains $valid = false; // sets default validation to false foreach( $valid_email_domains as $d ){   $d_length = strlen( $d );   $current_email_domain = strtolower( substr( $email, -($d_length), $d_length)); if( $current_email_domain == strtolower($d) ){   $valid = true;   break; } } // Return error message for invalid domains if( $valid === false ){ $errors->add('domain_whitelist_error',__( 'ERROR: Registration is only allowed from selected approved domains. If you think you are seeing this in error, please contact the system administrator.' )); } } add_action('register_post', 'wd_is_valid_email_domain',10,3 ); ### Blacklist a list a single domain with error message/no array Here’s an extra credit function. You can specifically target a single specific domain and block anyone from registering from that domain. The example below uses @gmail.com. Real world use for this would be, say you’ve changed your company name and url and you wanted to prevent people from registering with their old email address. You could prompt them that their email address is no longer valid and to use their new email with the correct domain. // prevent user registration in wordpress from specific domain function wd_disable_email_domain ( $errors, $sanitized_user_login, $user_email ) {     list( $email_user, $email_domain ) = explode( '@', $user_email );     if ( $email_domain == 'gmail.com' ) {         $errors->add( 'email_error', __( 'ERROR: Gmail addresses are not allowed.', 'my_domain' ) );     }     return $errors; } add_filter( 'registration_errors', 'wd_disable_email_domain', 10, 3 ); --- --- title: "Wallys WooCommerce Zero-Cost Text Changer" url: "https://wallydavid.com/wallys-woocommerce-zero-cost-text-changer/" lang: "en-US" type: "post" last_modified: "2024-11-21T01:32:16+00:00" categories: [Articles] tags: [WordPress Plugin] custom_fields: nectar_blog_post_view_count: 804 pld_like_count: 56 pld_dislike_count: 1 --- # Wallys WooCommerce Zero-Cost Text Changer [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "Change “Billing Details” Text To “Shipping Details” on WooCommerce Checkout Page" url: "https://wallydavid.com/change-billing-details-text-to-shipping-details-on-woocommerce-checkout-page/" lang: "en-US" type: "post" last_modified: "2024-08-30T18:59:16+00:00" categories: [Articles] tags: [Hacking, WooCommerce] custom_fields: nectar_blog_post_view_count: 859 pld_like_count: 67 --- # Change “Billing Details” Text To “Shipping Details” on WooCommerce Checkout Page [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 [divider line_type=”No Line” custom_height=”35″] --- --- title: "Enabling the WordPress Media Trash Feature" url: "https://wallydavid.com/enabling-the-wordpress-media-trash-feature/" lang: "en-US" type: "post" last_modified: "2024-08-30T18:59:46+00:00" categories: [Articles] tags: [Tips, WordPress] custom_fields: nectar_blog_post_view_count: 879 pld_like_count: 95 --- # Enabling the WordPress Media Trash Feature [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 --- --- title: "Blocking Spam Google Referring Traffic Links With HTACCESS" url: "https://wallydavid.com/blocking-spam-google-referring-traffic-links-with-htaccess/" lang: "en-US" type: "post" description: "I have clients that get a lot of form spam directly from google ads. Basically, someone highjacks a legitimate Google Ads link for say, a car dealer or a dental practice, and does their own ad in a foreign country" last_modified: "2024-08-30T18:59:55+00:00" categories: [Articles] tags: [Hacking] custom_fields: nectar_blog_post_view_count: 794 pld_like_count: 83 --- # Blocking Spam Google Referring Traffic Links With HTACCESS [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 I have clients that get a lot of form spam directly from google ads. Basically, someone highjacks a legitimate Google Ads link for say, a car dealer or a dental practice, and does their own ad in a foreign country for “make $25-$50 dollars working remote for a company in the US” and reuses the same random form (yours). They get a click, and we get a random REAL form fill from non-english speaking people thinking they are filling out a job application or to get something sent to them for free. It’s super annoying, and google is aware of it. Because it’s also REAL traffic and REAL form fills, it’s hard to block with re-captcha and other security measures. Luckily, in Google analytics, SharpSpring, and HubSpot you can pretty much see all the referring sites. **Below is a little snippet of code to throw in your .htaccess file to block that referring spam ad traffic.** Note: This is not a set it and forget it. You’d have to revisit this file every 30 days and adjust for a bit until the form fill traffic drops off. You’re still going to get the referring traffic reported in Google Analytics so you” have to filter reports with a [Referral Exclusion List](https://support.google.com/analytics/answer/10327750?hl=en). A good [example on how to do that is here](https://infotrust.com/articles/referral-exclusion-google-analytics-4/). TLDR; Add your spam referral traffic links below and add this module to your .htaccess file. RewriteEngine On RewriteBase / # block spammers - duplicate a line if you need more RewriteCond %{HTTP_REFERER} store.sample-link.com [NC,OR] RewriteCond %{HTTP_REFERER} link.sample-link [NC,OR] RewriteCond %{HTTP_REFERER} static.sample-link.website [NC,OR] # This needs to stay RewriteRule .* - [F] --- --- title: "Replace WooCommerce Breadcrumb Home Link URL" url: "https://wallydavid.com/replace-woocommerce-breadcrumb-home-link-url/" lang: "en-US" type: "post" description: "The Default WooCommerce HOME link on any Woo breadcrumbs brings you to the website's home page. I think this is stupid. Especially if your store lives at a different URL than the HOME page. The HOME breadcrumb link should always" last_modified: "2024-08-30T19:00:08+00:00" categories: [Articles] tags: [Hacking, WooCommerce] custom_fields: nectar_blog_post_view_count: 887 pld_like_count: 71 --- # Replace WooCommerce Breadcrumb Home Link URL [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 The Default WooCommerce HOME link on any Woo breadcrumbs brings you to the website’s home page. I think this is stupid. Especially if your store lives at a different URL than the HOME page. The HOME breadcrumb link should always bring you to your stores HOME page not your websites home page. This snippet lets you point the HOME breadcrumb url where ever you want. add_filter( 'woocommerce_breadcrumb_home_url', 'woo_custom_breadrumb_home_url' ); function woo_custom_breadrumb_home_url() {     return 'https://www.yoursite.com/store-home/'; } [Credit Here](https://wordpress.org/support/topic/how-to-change-woocommerce-breadcrumb-home/) --- --- title: "Automatically Delete WooCommerce Images After Deleting a Product" url: "https://wallydavid.com/automatically-delete-woocommerce-images-after-deleting-a-product/" lang: "en-US" type: "post" description: "I have an WooCommerce installation that I'm using as a dealer inventory feed that syncs twice a day though an API feed using WebToffee's Import/Export Pro. To prevent the media gallery from blowing up to a crazy size, I use" last_modified: "2024-08-30T19:00:21+00:00" categories: [Articles] tags: [Hacking, WooCommerce] custom_fields: nectar_blog_post_view_count: 1133 pld_like_count: 116 --- # Automatically Delete WooCommerce Images After Deleting a Product [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 I have an WooCommerce installation that I’m using as a dealer inventory feed that syncs twice a day though an API feed using WebToffee’s Import/Export Pro. To prevent the media gallery from blowing up to a crazy size, I use this little snippet to delete the product and the products images when the product is no longer in the product csv import. Handy. add_action( 'before_delete_post', 'delete_product_images', 10, 1 ); function delete_product_images( $post_id ) {     $product = wc_get_product( $post_id );     if ( !$product ) {         return;     }     $featured_image_id = $product->get_image_id();     $image_galleries_id = $product->get_gallery_image_ids();     if( !empty( $featured_image_id ) ) {         wp_delete_post( $featured_image_id );     }     if( !empty( $image_galleries_id ) ) {         foreach( $image_galleries_id as $single_image_id ) {             wp_delete_post( $single_image_id );         }     } } --- --- title: "Change the Default WooCommerce Product Placeholder Permanently" url: "https://wallydavid.com/change-the-default-woocommerce-placeholder-permanently/" lang: "en-US" type: "post" description: "Just a reminder that this can be set programatically. Once this is set, clients can’t change this in the WooCommerce settings either. This is a permanent solution for preventing someone or an update, from modifying the settings. I recommend adding" last_modified: "2024-11-15T14:50:48+00:00" categories: [Articles] tags: [Hacking, WooCommerce] custom_fields: nectar_blog_post_view_count: 844 pld_like_count: 86 --- # Change the Default WooCommerce Product Placeholder Permanently [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 Just a reminder that this can be set programatically. Once this is set, clients can’t change this in the WooCommerce settings either. This is a permanent solution for preventing someone or an update, from modifying the settings. I recommend adding this as a plugin and not the the functions.php, as it will get overwritten with every theme update. /* * Plugin Name:       WooPlaceholder * Description:       WooPlaceholder * Version:           1.00 * Requires PHP:      7.4 * Author:            Wally David * Text Domain:       wc-woo-placeholder-default */ add_filter(‘woocommerce_placeholder_img_src’, ‘custom_woocommerce_placeholder_img_src’); function custom_woocommerce_placeholder_img_src( $src ) { $upload_dir = wp_upload_dir(); $uploads = untrailingslashit( $upload_dir[‘baseurl’] ); // replace with path to your image $src = $uploads . ‘/2012/07/thumb1.jpg’; return $src; } Source “[WooCommerce](https://woocommerce.com/document/change-the-placeholder-image/)“ --- --- title: "Using a Hook to Change the Default Ordering in WooCommerce" url: "https://wallydavid.com/using-a-hook-to-change-the-default-ordering-in-woocommerce/" lang: "en-US" type: "post" description: "As simple as inserting the below code into your current theme functions.php file. add_filter( 'woocommerce_default_catalog_orderby', 'misha_default_catalog_orderby' ); function misha_default_catalog_orderby( $sort_by ) { return 'date'; } Possible values are: menu_order (Default) – by the custom order first, then by product name" last_modified: "2024-08-30T19:03:01+00:00" categories: [Articles] tags: [Hacking, WooCommerce] custom_fields: nectar_blog_post_view_count: 700 pld_like_count: 42 --- # Using a Hook to Change the Default Ordering in WooCommerce [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 As simple as inserting the below code into your current theme functions.php file. add_filter( 'woocommerce_default_catalog_orderby', 'misha_default_catalog_orderby' ); function misha_default_catalog_orderby( $sort_by ) {   return 'date'; } Possible values are: - **menu_order** (Default) – by the custom order first, then by product name - **popularity** – by the number of sales - **rating** – by the average rating - **date** – recently added products will be displayed first - **price** – cheapest products will be displayed first - **price-desc** – the most expensive first - **rand** – in a random order (read also how to retain pagination in this case) --- --- title: "Plugin for Calculating Anniversaries or Mile Stone Dates with Code!" url: "https://wallydavid.com/plugin-for-calculating-anniversaries-or-mile-stone-dates-with-code/" lang: "en-US" type: "post" description: "Here's a simple WordPress function and short code for calculating things like employee anniversaries, years in business, birthdays or anything that needs to calculate a year based on a starting date." last_modified: "2024-11-21T01:28:50+00:00" categories: [Articles] tags: [WordPress Plugin] custom_fields: nectar_blog_post_view_count: 872 pld_like_count: 102 --- # Plugin for Calculating Anniversaries or Mile Stone Dates with Code! [ __ ](javascript:void(0)) 26 [ __ ](javascript:void(0)) 0 [divider line_type=”No Line” custom_height=”35″][divider line_type=”No Line” custom_height=”10″][divider line_type=”No Line” custom_height=”35″][divider line_type=”No Line” custom_height=”10″][divider line_type=”No Line” custom_height=”35″][divider line_type=”No Line” custom_height=”10″] ---