Author: SiteSelf

  • How to fix a WordPress website white screen

    Key takeaways

    • The scope of the blank page is diagnostic. Site-wide, admin-only, front-end-only, one template or the editor each point at a different set of suspects, and noting it costs nothing.
    • Since WordPress 5.2 a fatal error triggers recovery mode: an email to the administration address with a link that pauses the offending plugin or theme so you can log in. It pauses, it does not fix.
    • Add WP_DEBUG and WP_DEBUG_LOG to wp-config.php with WP_DEBUG_DISPLAY set to false. The fatal error line in wp-content/debug.log names the file, and the path under wp-content/plugins/ or wp-content/themes/ is the answer.
    • With no admin access, rename the suspect folder over SFTP: wp-content/plugins/slug to slug-off, or the active theme folder to force a default theme. Record what you renamed before you start.
    • Raise WP_MEMORY_LIMIT only when the log actually says ‘Allowed memory size … exhausted’, and remember the value cannot exceed the host’s own PHP ceiling.

    A white screen is a page that returned nothing. The server answered, the browser has a document, and the document is empty. No theme, no error, sometimes not even a login form.

    That silence is the problem. WordPress suppresses PHP error output in production, so when a plugin, a theme or your own code throws a fatal error, execution stops before any HTML is printed. You get a blank page instead of the line that names the file. WordPress’s Advanced Administration Handbook lists the White Screen of Death first among common WordPress errors, which tells you how routine this is.

    On modern installs you will often see “There has been a critical error on this website” instead of pure white. Same condition, friendlier wording. The recovery sequence below is identical, and it overlaps heavily with fixing plugins that stopped working.

    What the scope of the blank page already tells you

    Before you rename anything, work out exactly where the white screen appears and where it does not. This is free information and it removes most of the suspect list.

    What is blankLook here first
    Front end and admin, everywhereCode that loads on every request: a plugin, the theme’s functions.php, an mu-plugin, an edit to wp-config.php, memory exhaustion, a PHP version change
    Admin blank, front end fineAdmin-only plugins: security suites, capability and role managers, admin UI customisers, page builders. Also memory pressure on heavy admin screens
    Front end blank, admin fineTheme templates, or a cache layer serving a stored blank response to logged-out visitors while you bypass it
    One page or one templateThat template file (front-page.php, home.php), a broken shortcode, or a builder, SEO or cache plugin acting on that content
    One admin screen onlyThe plugin that owns that screen. A role-management plugin white-screening the Users page is a real reported case
    The block editor onlyAn editor integration. Open the browser network tab and look for failing /wp-json/ requests
    Only for logged-out users or only on mobileCaching plugin, host cache, CDN or reverse proxy

    Write one line before you touch anything: what is blank, when it started, what changed immediately before. “Front end loads, /wp-admin is white since the plugin auto-update last night” is a diagnosis. “Site is broken” is not.

    Check for the recovery mode email first

    Since WordPress 5.2, a fatal error puts the site into recovery mode instead of leaving you locked out. WordPress emails the administration address with a link that pauses the plugin or theme that failed and lets you into wp-admin for that session. The subject looks like “[your site name] Your Site is Experiencing a Technical Issue”, and the message usually names the extension. Core’s fatal error recovery mode announcement describes this as the answer to exactly the case where the backend would otherwise be unreachable.

    Most people never see it. The address in Settings then General is an old inbox, the site’s outbound mail is broken, or it landed in spam. Check spam, check the address, and set RECOVERY_MODE_EMAIL in wp-config.php to something someone reads before you need it.

    WordPress recovery mode notice after a white screen fatal error
    Upon entering recovery mode, WordPress clearly indicates that plugins have failed to load, allowing administrators to regain access and address the issue. · Source: www.wpbeginner.com

    One thing to hold on to: recovery mode pauses, it does not fix. Reactivating the same broken version puts the white screen straight back.

    Turn on logging before you change anything

    This is the step people skip, and it is the one that ends the outage fastest. Edit wp-config.php over SFTP or the host’s file manager, above the line that says “That’s all, stop editing”, and set:

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', true );
    define( 'WP_DEBUG_DISPLAY', false );

    WordPress’s debugging handbook documents this combination: errors go to wp-content/debug.log rather than to the page, which matters because visitors should not be reading your file paths. If a WP_DEBUG line already exists set to false, change that line rather than adding a second one.

    Reload the blank page to reproduce the error, then open debug.log and read the end of it. Also open the host’s own PHP error log in cPanel, Plesk or the hosting dashboard and search near the bottom for “fatal error”. WordPress’s log does not capture everything: PHP-FPM failures, permission problems and server-level errors only show up there.

    Two cautions. Editing wp-config.php in a plain text editor with a missing semicolon creates a second fatal error on top of the first, so keep an untouched copy of the original. And turn these lines off once you are done.

    wp-config.php open in an editor with WP_DEBUG lines added to diagnose a WordPress white screen
    Configure WP_DEBUG_LOG in wp-config.php to direct fatal errors to a log file, ensuring visitors never see them. · Source: instawp.com

    The file path in the error is the answer

    Fatal errors are ugly but specific. What you are looking for is the path, not the wording:

    PHP Fatal error: Uncaught Error: Call to undefined function ... in /wp-content/plugins/plugin-name/...
    PHP Parse error: syntax error, unexpected ... in /wp-content/themes/theme-name/functions.php
    PHP Fatal error: Uncaught Error: Class '...' not found
    require(): Failed opening required '...' in /wp-content/mu-plugins/...
    Fatal error: Allowed memory size of 134217728 bytes exhausted

    A path under /wp-content/plugins/ names the plugin. A path under /wp-content/themes/ points at the theme or child theme, usually at code someone added to functions.php. A path under /wp-content/mu-plugins/ is a must-use plugin failing to load, which happens before normal plugins load and confuses people who have already deactivated everything. A path in wp-config.php is your own edit. And 134217728 bytes is 128M, so that last line is a resource limit, not a bug in the file it names.

    Plugins: the most reported cause, and how to isolate one

    Practitioner consensus across support forums and agency runbooks puts plugins first by a wide margin, usually within minutes of an update or a new activation. There is no measured dataset behind that ranking, but every source type reports the same order.

    If the log named a plugin, act on that one. If you have no usable log and no admin access, isolate at the filesystem level over SFTP or the file manager:

    1. Write down the currently active plugins if you can, or run wp plugin list over SSH. You need to be able to put the site back the way it was.
    2. Rename the single suspect folder, for example wp-content/plugins/plugin-slug to plugin-slug-off. WordPress deactivates a plugin whose files have gone.
    3. No obvious suspect? Rename wp-content/plugins to plugins.old, create an empty plugins folder, and move the plugins back one at a time, reloading the site after each.
    4. When the white screen returns, the plugin you just moved back is the one.

    With SSH available, wp plugin deactivate <slug> does the same thing without leaving renamed directories behind, and it is the cleaner option for an admin-only white screen.

    Two traps. Deleting a plugin instead of renaming its folder can take its settings with it. And on a WooCommerce site, deactivating WooCommerce itself clears the white screen while breaking cart, checkout and account pages, so isolate the extensions around it, payment gateways and shipping plugins first, rather than the store.

    The wp-content/plugins folder in an SFTP client, used to isolate a WordPress white screen
    When the dashboard is unreachable, directly renaming a plugin’s folder within `wp-content/plugins` via SFTP effectively deactivates it. · Source: www.paidmembershipspro.com

    Once you know which plugin, the fix is a version decision: update it if a newer release fixes the fatal, roll it back to the previous version if the update caused it, or replace it if it has been abandoned. Leaving it paused is not a fix.

    Themes: a syntax error in functions.php takes the whole site

    Themes are the second most reported cause, and a hand-edited functions.php is the usual route. One missing semicolon typed into the built-in Theme File Editor on a live site produces a site-wide blank page and, because the editor is inside wp-admin, locks you out of the tool you used to break it.

    Rename the active theme folder in wp-content/themes/. WordPress falls back to a default theme such as Twenty Twenty-Five, provided one is actually installed. If it is not, you will trade the white screen for a “theme directory does not exist” error, so check first. If the site returns on the default theme, the fault is in your theme files: revert the recent edit, restore from a backup of that file, or reinstall the theme. Keeping changes in a child theme and out of the live editor is what stops the repeat, and the same discipline applies when you are editing WordPress themes without losing work.

    Memory exhaustion: a real cause and an over-applied fix

    “Allowed memory size of X bytes exhausted” is the one white screen that tells you its own cause, when logging is on. The process died before printing anything, which is why it is often a pure blank rather than a critical error page. Typical triggers are imports, backups and restores, security scans, image processing and heavy page builders.

    The fix in wp-config.php:

    define( 'WP_MEMORY_LIMIT', '256M' );

    Three things people get wrong here. The M matters: '512' without it is not 512 megabytes. WP_MEMORY_LIMIT cannot exceed the host’s global PHP limit, so setting 512M on a plan capped at 128M changes nothing and you will wrongly conclude memory was not the issue. And raising the limit without finding out what consumed the memory just moves the failure to the next import. Community advice is consistent that 256MB is enough for an ordinary WordPress site, so a site that needs more has a specific consumer worth identifying.

    PHP version changes, .htaccess and leftover update files

    If the blank page appeared the day the host moved you from PHP 7.4 to 8.x, the code stopped being compatible, not the server. The fast recovery is rolling PHP back in the hosting control panel. The actual fix is updating core, plugins and themes for compatibility, testing on staging, then upgrading PHP again. Sitting on an old PHP version indefinitely trades one outage for a worse one later.

    Where the white screen followed a migration, a restore or an interrupted update, look at files rather than code:

    • A leftover .maintenance file in the WordPress root keeps the site in update mode. Delete it and reload.
    • A broken .htaccess can stop requests reaching WordPress. Rename it to .htaccess-old, test, and if that fixed it regenerate the rules by opening Settings then Permalinks and saving once admin access is back. Do not rewrite custom rules you do not understand; stores and membership plugins depend on them.
    • A failed core update can leave mismatched files. Re-uploading fresh core files from WordPress.org, excluding wp-content and wp-config.php, resolves that. Do this when there is evidence of corruption, not as a first move.

    Fixed it and still seeing white? Clear every cache layer

    A broken response gets cached like any other. The fix ships, you see the site, and visitors still get a blank page. Purge in this order: the caching plugin, the host’s page cache, the object cache, the CDN, then the browser. Clearing only your browser cache is the classic false negative.

    On WooCommerce, caching the cart, checkout and account pages produces partial white screens and stale data even when nothing else is wrong. Confirm those exclusions are in place.

    When to stop and get help

    Escalate rather than keep testing when:

    • You cannot get error output from either WordPress or the server.
    • Renaming the whole plugins directory did not bring the site back, which points at core, the theme, an mu-plugin or the environment.
    • The trigger was outside WordPress: a PHP upgrade, a database change, a host migration, altered file ownership.
    • The same white screen returns after you reverse the change you believed caused it.
    • The site earns money and you have a clean backup. Restoring and diagnosing afterwards on a copy beats a long live investigation.

    Hand over the useful evidence: the scope line, the last confirmed change, what you already tested, and the first fatal error line from the log. If you would rather not work through folders and logs yourself, SiteSelf can run the same sequence on a connected site and report what it changed and what it checked, which is what getting a broken WordPress site working again looks like when you ask for it in chat; file-level and code work needs hosting access, not just the connector plugin.

    What keeps it from coming back

    Most repeat white screens come from the habits that produced the first one. Update risky extensions one at a time so the timeline stays readable. Take a backup before updates and check it restores. Point RECOVERY_MODE_EMAIL at a monitored inbox. Keep PHP edits out of the built-in Theme and Plugin File Editors on live sites. Replace plugins that have not been updated in six months rather than hoping. And know your host’s real PHP memory ceiling before the day you need it.

    Frequently asked questions

    Is a white screen a sign my site was hacked?

    Usually not. Plugin conflicts, theme code, memory limits, failed updates and PHP version changes account for the overwhelming majority of reported cases. Malware is worth scanning for when the white screen keeps returning after a clean fix or when you find files you did not put there, but diagnose the ordinary causes first.

    Why is only /wp-admin white while the front end works?

    Something that runs only on admin requests is failing: a security plugin, a capability or role manager, an admin UI customiser, or a page builder’s backend. It can also be memory pressure on a heavy admin screen. Isolate from SFTP or WP-CLI, since you cannot reach the Plugins screen to do it in the dashboard.

    Does a white screen damage my search rankings?

    No data quantifies the impact, and short outages are not the same as a site disappearing. What you can do is check what Googlebot actually received: run the live test in Search Console’s URL Inspection tool on an affected URL once the site is back, and confirm it renders content rather than an empty page.

    Do I need to reinstall WordPress?

    Only when you have evidence of corrupted core files, such as a fatal error pointing at a file inside wp-includes or a core update that failed partway. Re-uploading fresh core files excluding wp-content and wp-config.php is safe, but it is not a diagnosis and it will not fix a plugin fatal.

    The white screen appeared right after a core update. What now?

    Treat it as a compatibility problem between the new core version and one extension, not as a broken update. Caching plugins are a recurring culprit in support threads after core releases. Isolate plugins as above, then check whether the vendor has shipped a compatible version before you roll anything back.

    Can I just deactivate everything and be done?

    It restores the site, and it costs you the information. Renaming the whole plugins directory tells you “a plugin did it” without telling you which one, and it leaves plugins the site depends on switched off. Record the active list, then re-enable one at a time until the screen goes white again.

  • WordPress Multisite installation, step by step

    Key takeaways

    • The install itself is five steps. Almost every reported failure is four layers disagreeing: DNS, web server config, wp-config.php constants, and rewrite rules.
    • Subdomain or subdirectory is a launch decision. Subdomains need a wildcard DNS record and a server that answers wildcard hostnames; switching afterwards is a migration, not a config edit.
    • Replace the entire WordPress block in .htaccess with the generated one. Merging old single-site rules with the new network rules is the classic reason every subsite 404s while the main site works.
    • If a broken subsite shows your host’s branded 404 instead of your theme’s 404 page, the request never reached WordPress. Fix DNS and server routing before touching constants.
    • In a network, only the Network Administrator installs plugins, and network activation is a different state from per-site activation. A plugin written for single-site can fatal every subsite at once.

    Enabling Multisite is one line in wp-config.php, one form in Tools, and two blocks of generated code. Most people get through it in ten minutes. Then the second subsite returns a 404, the admin loops back to the login screen, and the same ten-minute job turns into a day.

    That gap is the whole subject. Multisite spans four layers that have to agree with each other: DNS, web server configuration, WordPress constants, and plugin behaviour. Nearly every reported failure is a disagreement between two of them, not a bug in WordPress.

    It multiplies ordinary problems, too. One network-activated plugin that was never written for a network takes every subsite down at once, so the routine for a plugin that is not working applies across the whole install rather than one site. That is worth knowing before you enable anything.

    Decide whether you need a network before you edit a file

    WordPress’s own Advanced Administration Handbook opens its multisite preparation page with the question “Do you really need a network?” before it gets to any requirements. That order is deliberate.

    Multisite fits sites that belong to the same organisation and share a stack: franchise locations, university departments, regional or language variants of one brand, an internal publishing group, a set of microsites built from the same base theme. One codebase, one update cycle, one hosting bill, shared users where you want them shared.

    It fits badly when the sites are unrelated. The most common regret in practitioner threads is an agency that put a portfolio of unconnected client sites into one network for the convenience of a single dashboard. Shared convenience is shared fate: one compromise, one bad update, one runaway cron job, and everything is affected. Per-site experimentation gets awkward, and offboarding a client means extracting a subsite from the network, which is possible but not quick.

    Two alternatives come up repeatedly and both are reasonable. Separate installs with a management tool across them gives you most of the single-dashboard benefit without coupling anything at the database level. Multi-tenant setups, where one codebase serves isolated sites without WordPress’s network tables, are a different answer to the same cost problem. Neither is Multisite, and neither carries its lock-in.

    A short filter: if the sites will share users, themes and governance for years, Multisite earns its place. If any one site must be able to fail, move host or leave on its own, use separate installs.

    What your host has to support before you touch wp-config.php

    Most failed installs are host capability problems that surface halfway through. Check these first, because finding out afterwards means unwinding a half-configured network.

    • Pretty permalinks already work on the single site. If they do not work now, they will not work network-wide.
    • Rewrite support. On Apache, mod_rewrite has to be enabled or the .htaccess rules are ignored silently. On nginx there is no .htaccess at all and the rules belong in the server block, which means you need either server access or a host that applies them for you.
    • Writable wp-config.php and .htaccess. If the files cannot be saved, the network looks installed and keeps behaving like a single site.
    • Writable uploads tree. Each subsite gets its own directory under wp-content/uploads/sites/. Wrong ownership produces “Could not create directory” on the first media upload.
    • Wildcard DNS, if you are going with subdomains, plus a virtual host or app mapping that accepts wildcard hostnames. Add the record and let it propagate before onboarding sites, or you will misdiagnose intermittent resolution as a WordPress bug.
    • Headroom. A currently supported PHP version, a supported MySQL or MariaDB release, and enough memory and process allowance that network-wide operations do not fail at random.
    • A full backup of files and database, taken and verified before you start.

    Budget shared hosting is where this list gets expensive. Some plans do not expose wildcard subdomains, some do not let you touch rewrite configuration, and a few managed hosts either do not support Multisite or support it with limits on domain mapping. If your host treats server rewrites or wildcard DNS as a special case, that is the answer about whether Multisite is a first-class workload there.

    Subdomains or subdirectories, decided once

    Network Setup asks you to choose, and the choice is not cosmetic. It determines routing, cookie handling, certificate coverage and how domain mapping will work later. You cannot flip it afterwards with a config edit: changing structure after launch breaks URLs and internal links, and the honest path is a controlled migration.

    Subdirectories (example.com/paris/) are the lower-friction option. No wildcard DNS, cookies are simpler to reason about, and your existing certificate covers everything. They suit sites that are genuinely one brand: regional sections, departments, campaign hubs.

    Subdomains (paris.example.com) suit sites that need visible separation or will eventually run on their own domains. They need a *.example.com record pointing at the server, a web server configured to answer wildcard hostnames, and a wildcard certificate, which usually means DNS-based validation rather than the click-through flow you used on the single site. Trying to fake subdomain routing with rewrite tricks instead of fixing DNS is a reliable way to lose a day.

    One thing that surprises people testing locally: if the site runs on localhost, on an IP address, or on a URL that already contains a path, Network Setup only offers subdirectories.

    Running the installation

    The handbook’s Create A Network article walks the same sequence every host guide repeats, from Step 0 “Before You Begin” through Step 6 “Administration”. Here it is with the parts that actually bite.

    1. Back up files and database, and keep a copy of wp-config.php and .htaccess outside the site.
    2. Deactivate plugins. All of them, on an existing site. Security plugins, redirect managers and cache layers interfere with Network Setup often enough that you end up debugging the wrong thing. Reactivate one at a time afterwards.
    3. Add the constant to wp-config.php, above the /* That's all, stop editing! Happy publishing. */ line and not inside any if block or function:
      define( 'WP_ALLOW_MULTISITE', true );
      If that comment does not exist in your file, put it above the first require or include. Placed below it, or inside a conditional, Tools > Network Setup never appears.
    4. Reload the admin and open Tools > Network Setup. Choose the structure you already decided on, check the network title and admin email, and submit.
    5. Paste the two generated blocks exactly as shown, into wp-config.php and .htaccess. Do not tidy them, do not adapt a version from a tutorial, and do not merge the .htaccess block with your old rules.
    6. Log out and log back in. Network Admin appears under My Sites only after a fresh login. “The install finished but there is no Network Admin” is almost always this.
    WordPress Network Setup screen during a multisite installation
    The WordPress Network Setup screen provides the crucial choice between sub-domains and sub-directories, dictating how your network sites will be structured. · Source: www.ionos.co.uk

    On a subdirectory network the generated constants look like this, with your own domain in place:

    define( 'MULTISITE', true );
    define( 'SUBDOMAIN_INSTALL', false );
    define( 'DOMAIN_CURRENT_SITE', 'example.com' );
    define( 'PATH_CURRENT_SITE', '/' );
    define( 'SITE_ID_CURRENT_SITE', 1 );
    define( 'BLOG_ID_CURRENT_SITE', 1 );

    A subdomain network gets the same constants with SUBDOMAIN_INSTALL set to true. DOMAIN_CURRENT_SITE has to match the primary site URL exactly, with no trailing slash and with www. present or absent exactly as the site runs. If you see COOKIE_DOMAIN suggested in a tutorial, leave it out unless you have a tested reason; copied cookie settings cause a lot of avoidable login trouble.

    The Apache block for a subdirectory network replaces the entire existing WordPress section of .htaccess:

    RewriteEngine On
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^ - [L]
    RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
    RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
    RewriteRule . index.php [L]

    What a correct result looks like

    Before you create real sites, confirm all of this:

    • Network Admin is reachable from My Sites in the admin bar.
    • Settings > Permalinks saves without error on the main site.
    • A throwaway test subsite loads its own front page, not the main site’s, and its admin does not loop at login.
    • A media upload on that test subsite succeeds and lands in wp-content/uploads/sites/2/.
    • Reactivated plugins still behave on both the main site and the test subsite.
    Network Admin sites list in a WordPress multisite installation
    With the Network Admin Sites list now visible under My Sites, your WordPress Multisite network is successfully installed and ready for comprehensive management. · Source: easywebdesigntutorials.com

    If something looks off, do not re-run Network Setup repeatedly hoping for a different outcome. By then WordPress has written constants and database records; re-running on top of a partly configured install adds duplicates to untangle.

    If it did not work, check the layers in order

    The single most useful habit here is changing one layer at a time, from the outside in. Practitioners converge on the same order, for the same reason: each step’s result is then readable.

    1. DNS and host routing. Wildcard record present and propagated, server configured to answer wildcard hosts, mapped domains pointing at the right place.
    2. Server modules and permissions. mod_rewrite or the nginx equivalent, writable config files, PHP version and memory.
    3. The constants from Network Setup, SUBDOMAIN_INSTALL in particular.
    4. Rewrite rules, then Settings > Permalinks > Save Changes on each affected subsite to flush them.
    5. Plugins, deactivated network-wide and re-enabled one by one.
    6. The database, last.

    Two symptoms tell you which layer you are in without any guessing. If a broken subsite shows your host’s branded 404 page, the request never reached WordPress, so the problem is DNS or server routing. If it shows your theme’s 404 page, WordPress answered and the problem is rewrite rules or constants.

    The failures that account for most of it

    Every subsite 404s, the main site is fine. Rewrite rules. Usually someone merged the new network block into the old single-site rules instead of replacing the WordPress section outright. Re-copy the block from Tools > Network Setup, replace the whole section, flush permalinks.

    Subsites load the main site’s content, or core assets 404 with a subdirectory in the path like /site1/wp-includes/js/jquery.js. Constants. Check DOMAIN_CURRENT_SITE and PATH_CURRENT_SITE against the real primary URL, confirm SUBDOMAIN_INSTALL matches the structure the rewrite rules describe, delete any duplicate definitions, then flush permalinks.

    White screen or a 500 straight after saving wp-config.php. PHP syntax, almost always: a missing semicolon or smart quotes from a copy and paste. Nothing renders and the error is in the log, not on screen.

    Network Setup never appeared. The constant is below the stop-editing comment, inside a conditional, or the file never saved because the host would not write it.

    Subdomains do not resolve at all. Missing wildcard DNS, a server that is not configured for wildcard hosts, or a certificate that covers the apex domain and nothing else.

    Network problems are unusually good at pointing at the wrong cause, and the fix often sits in files you reach over SSH rather than in the dashboard. If you would rather hand that over, SiteSelf fixes WordPress errors on request: you describe the symptom in chat, the agent works on the live site, and it reports what it changed and what it checked.

    Plugins, themes and code in a network

    In Multisite, only the Network Administrator installs plugins and themes. A beginner on r/WordPress who selected Multisite during setup by mistake reported the giveaway clearly: there was no Add Plugin button on the site they were working in. They removed the network and reinstalled.

    Installation and activation are separate. A plugin is installed once at network level, then either network-activated across every site or made available for per-site activation. Those are different states, and several plugins built for networks, including WP Multi Network by John James Jacoby, which turns one Multisite installation into several networks, only work correctly when they are network-activated. Activating them per site produces partial behaviour that is hard to read.

    Network Activate link on the Network Admin plugins screen in WordPress multisite
    The Network Admin plugins screen shows distinct ‘Network Activate’ and ‘Network Deactivate’ links, illustrating the unique management states for plugins across a multisite installation. · Source: codex.wordpress.org

    Keep network activation for things every site genuinely needs. Themes work the same way: Network Admin decides what is available, each subsite picks from that list, and the shared stack is the point. Note that the Theme File Editor is restricted in a network by default, which changes how you edit theme files safely.

    If you write custom code for the network, two habits save later pain. Guard multisite-only calls such as switch_to_blog() with is_multisite() so the code does not fatal if it ever runs on a single site. And use home_url() or site_url() in templates rather than hard-coded domains, so mapped domains and per-site URLs resolve correctly.

    Three things people expect to be built in and are not: cross-subsite user access (adding a user to the network does not give them access to every site), search across all sites in the network, and pulling one subsite out into its own install. All three need plugins or custom work.

    Moving a network later

    A Multisite moves as one piece. Site-by-site migration is where these projects die, because shared user tables, per-site media directories, network-level plugins and domain values stored in both the database and the config files all have to land together. When you fix URLs after a move, WP-CLI’s wp search-replace searches through all rows in a selection of tables and replaces the first string with the second. Run it with the network flag so it covers every subsite, and skip the guid column, because rewriting GUIDs causes more trouble than it solves. If tables come out corrupted, wp db repair first, restore from backup if errors persist, and check wp_blogs and wp_site for duplicate entries.

    Frequently asked questions

    Can I switch from subdirectories to subdomains later?

    Not by editing constants. Flipping SUBDOMAIN_INSTALL and the rewrite rules on a live network breaks URLs, routing and internal links. Treat it as a planned migration with search-replace and redirects, and decide the structure deliberately before launch instead.

    Do users automatically get access to every site in the network?

    No. Super Admins see everything; a normal user added to the network still needs a role on each site they should reach. Granting broader access across subsites generally takes a role and capability plugin or custom logic, which catches people out when they assume shared users means shared access.

    Can I run several WooCommerce stores on one network?

    Yes. Each subsite gets its own storefront, products and orders while sharing one codebase and one update cycle. The caveats are host support for Multisite and domain mapping, extensions that are network-aware, and resource use, since checkout traffic on one store shares the server with every other site.

    Can I undo Multisite or pull one site out?

    A network can be reverted to a single site, and extracting one subsite into its own install is possible: export the content, migrate the relevant tables, fix URLs. Neither is quick, and both are easier if you planned the exit before you built the network.

    Does Multisite use more memory because I have thirty idle sites?

    Idle subsites do not each consume the memory of a standalone install. It is one codebase, and a request loads one site. What does cost you is network-activated plugins running everywhere and a database that carries per-site tables for every subsite you create.

    Is Multisite slower than separate installs?

    It depends on the stack more than on Multisite. With persistent object caching, page caching and a plugin set chosen with care, the difference is small. Dozens of subsites with heavy plugin stacks on an underpowered server is a different story, and that is where most complaints come from.

  • What a wp list plugin is and how to pick one

    Key takeaways

    • The command is wp plugin list, not wp list plugin. WP-CLI’s docs describe it as showing the plugins installed on the site with activation status and whether an update is available.
    • Most wp plugin list failures are environmental: you are in the wrong directory or passing the wrong –path, WP-CLI cannot reach the database, or the shell user cannot read wp-content/plugins.
    • Front-end list plugins usually fail for configuration reasons, not bugs: wrong folder, not activated, a parameter that does not match a real slug or ID, nothing to list, or a cached page.
    • Core handles more list jobs than people expect. The Query Loop block displays posts by specified parameters, and wp_list_categories() outputs a category list without a plugin.
    • If the Plugins screen fatals right after a core update, one known cause is an invalid recently_activated row in wp_options. Delete the row rather than editing it, and check your real table prefix first.

    “wp list plugin” is not the name of a plugin. It is what people type when they want one of four different things, and those four have almost nothing to do with each other.

    • An inventory of the plugins installed on a site, usually from the command line.
    • A list of content on the front end: posts in a category, a team page built from users, a table of contents from headings.
    • A table of structured data that is maintained by hand, like a price list or a spec sheet.
    • The WordPress admin Plugins screen, specifically when it stops opening after an update.

    Search results mix all four, which is why the first search rarely helps. The fix is to name the object you are listing and who reads the list. A heading list for readers, a post query for a resources page, and a CSV of active plugins for your own records need three different tools. This article separates them, gives the command or the setting for each, and covers the failure modes that follow. If the reason you are looking is that something already broke, start with the guide to plugins that are not working and come back here for the inventory part.

    Listing the plugins you have: wp plugin list

    WP-CLI puts the noun before the verb, so the real command is wp plugin list. There is no wp list plugin alias. WordPress’s developer documentation describes the command as displaying the plugins installed on the site with activation status and whether an update is available.

    wp plugin list
    wp plugin list --status=active
    wp plugin list --update=available
    wp plugin list --fields=name,version,update
    wp plugin list --format=csv > plugins-inventory.csv

    Those last two are the ones that earn their keep. --update=available answers “what needs updating right now” in one line, across one site or fifty. The CSV export answers “what was active before I started touching things”, which is the record you want when a conflict hunt goes sideways and you need to put the site back the way it was.

    Terminal output of the wp plugin list WP-CLI command showing plugin status and version columns
    The `wp plugin list` command provides a concise table detailing each installed plugin’s name, status, update state, and version. · Source: www.wpexplorer.com

    No shell access? The same inventory is on the admin Plugins screen at wp-admin/plugins.php, filtered by Active, Inactive and Update Available. It is slower to read and harder to keep a copy of, but it is the same data. Must-use plugins are the exception: they live in wp-content/mu-plugins, load unconditionally, and cannot be deactivated from that screen, so an audit that ignores them is incomplete.

    Why wp plugin list fails or shows the wrong plugins

    Ranked by how often it actually happens:

    1. Wrong working directory or wrong --path. WP-CLI needs to run inside the WordPress install or be told where it is: cd /var/www/mysite, or wp plugin list --path=/var/www/html/wordpress. Pointing --path at the document root when WordPress lives in a subdirectory means wp-config.php is never found. The worse version of this mistake is pointing it at a staging install: you get a clean, plausible list that describes the wrong site.
    2. WordPress or the database cannot be loaded. WP-CLI reads the same wp-config.php the site does, so bad credentials or a down database server break every command that boots WordPress. Repair the credentials rather than experimenting in that file: a stray character in wp-config.php takes the site down along with the CLI.
    3. Filesystem permissions. The shell user needs read access to wp-content/plugins. Wrong ownership produces read errors or a short list. Fix the ownership. Do not chmod 777 the plugin directories to make the error go away, because that trades a listing problem for a security problem and many hosts will flag it.

    Listing content on the front end: match the tool to the object

    This is the job most people mean when they want a plugin. The selection error that costs the most time is choosing by layout (“I want cards”) instead of by object (“I am listing posts from one category”). Plugins are not interchangeable across object types.

    What you are listingStart with
    Posts, pages or a custom post type, on a block themeThe core Query Loop block, which WordPress’s documentation describes as displaying posts based on specified parameters
    Categories or terms as a simple indexCore’s wp_list_categories(), which displays or returns the HTML list of categories
    Posts from one or more categories, inside classic contentList Category Posts, which lists posts by category using the [catlist] shortcode
    Hand-maintained tabular data such as a price list or spec sheetTablePress, which creates and manages data tables without writing code
    A clickable list of the headings inside one articleEasy Table of Contents, which inserts a table of contents generated from the page content into posts, pages and custom post types

    Try core before you install anything. A Query Loop block and a category list cover a surprising share of “I need a list plugin” requests, and they carry no update burden of their own. Reach for a plugin when the list needs something core does not do: grouping posts under year or author headings, a searchable catalog table, filtering by custom fields.

    Check the plugin page before you install, not after. WordPress.org shows a compatibility warning on plugins that have not been tested with the latest three major releases, and the Display Posts plugin page carried that warning when we checked it in September 2023. That notice is not a verdict, but on a plugin whose whole purpose is rendering a list on a public page, it is a reason to look at the support forum before committing a client site to it.

    WordPress admin Plugins screen listing installed plugins with active and inactive filters
    The WordPress Plugins screen offers quick filters to manage installed plugins by their status, mirroring the detailed inventory available through other tools. · Source: wordpress.org

    Why the shortcode outputs nothing

    Almost every “this plugin is broken” report for a list plugin turns out to be one of five configuration problems. Work down the list before you open a support ticket or swap plugins.

    1. Wrong directory. The plugin folder belongs in wp-content/plugins/<slug>/. Uploads that land in mu-plugins or one level too high look installed and behave like nothing.
    2. Uploaded but never activated. A shortcode for an inactive plugin prints as plain text or prints nothing at all.
    3. Parameter mismatch. The three classics: using a category label where the slug is required, pasting the documentation’s example ID instead of your own list ID, and using a plugin’s display name where its WordPress.org slug is wanted, such as “Akismet Anti-Spam” instead of akismet.
    4. Nothing to list. An empty taxonomy, no items created yet, or users hidden by a visibility setting in their profile. The plugin is working; the query is empty.
    5. Stale cache. A page cached before activation keeps serving the old HTML. Purge the page cache and any CDN cache before concluding anything.

    When the Plugins screen itself will not open

    You need the Plugins screen precisely when you are doing updates, and that is when it tends to break. The symptom is “There has been a critical error on this website” on wp-admin/plugins.php only, often immediately after a core update.

    Triage before you touch the database. Write down the exact error text, the screen it appears on, and the last change made. Then read wp-content/debug.log or the host error log and look at the file path in the fatal: a path under wp-content/plugins/ makes a plugin the first suspect, a path under wp-content/themes/ points at the theme or child theme, and “Allowed memory size” is a resource limit rather than a broken screen. If wp-admin is unreachable entirely, renaming a plugin folder over SFTP forces that plugin to deactivate, and renaming the active theme folder forces a fallback to a default theme.

    One cause is specific to this screen and worth knowing. WordPress keeps a recently_activated row in wp_options, and if that value ends up as something other than a valid array, rendering the Plugins list throws a fatal error. The fix is to open the database in phpMyAdmin or Adminer, find the recently_activated row in the options table, and delete it. WordPress recreates it and the screen loads again.

    phpMyAdmin showing the WordPress wp_options table where the recently_activated row is stored
    To locate the recently_activated row and other critical settings, navigate to the wp_options table in phpMyAdmin and examine the option_name column. · Source: cyberpanel.net

    Three ways people make this worse. They delete the wrong row, and removing active_plugins deactivates every plugin on the site. They search wp_options on a site with a custom prefix such as wp123_options, find nothing, and conclude the diagnosis was wrong. Or they try to repair the serialized value by hand and leave it malformed in a new way. Delete the row, do not edit it.

    If wp-admin is completely inaccessible, the same normalization can be done from a must-use plugin at wp-content/mu-plugins/fix-recent.php that filters option_recently_activated and returns an empty array when the stored value is not an array. Files in mu-plugins load early and unconditionally, which is the point. Get the <?php tag and the braces right, because a syntax error there fires before your filter can help. A PHP version downgrade in the hosting panel sometimes restores access, but treat it as a way to buy an hour, not a fix: the bad data is still there, and other plugins may not run on the older version. If none of that is a comfortable afternoon, this is the point to have the error diagnosed for you rather than experimenting on a live site.

    What changes when an agent does the listing work

    The listing question is small. The process around it usually is not: someone decides what the list should show, someone else knows which plugin the site already has, and the change waits for whoever has database or SFTP access. That is the part worth removing.

    Example request: “Our /resources page should list every post in the Guides category, newest first, with excerpts and a thumbnail. Use core blocks if the theme supports it. Only add a plugin if there is no other way, and tell me which one and why.”

    SiteSelf reads the theme and the page first, builds the list with a Query Loop block where the theme is a block theme, and falls back to a shortcode from a plugin the site already runs before proposing a new one. Before making the change it says what is about to change and whether it can be undone. Afterwards it fetches the page and reports in plain language what it sees: how many posts rendered, whether the excerpts are there, whether the query returned nothing. Content and settings work needs the SiteSelf Connector plugin from the WordPress.org directory; editing a template file or functions.php needs hosting access over SSH.

    The limits are worth stating plainly. If /resources is owned by Elementor, Divi or Beaver Builder, the agent refuses at the moment of work and tells you why. Verification is a fetch of the changed page and a report, not a screenshot and not a device test, so a list that renders correctly can still need your eyes on a phone. Work happens on request, so nothing is being watched between requests. The same request shape covers the inventory side of this topic, which is where plugin maintenance handled in chat fits: ask what is installed, what is inactive, what has an update waiting, and what can be removed.

    Frequently asked questions

    Is there a WordPress plugin actually called “WP List Plugin”?

    No plugin by that exact name shows up in the WordPress.org directory as a widely used tool. The closest literal matches are unrelated: “WP-list” is a marketplace cross-listing connector for eBay, and the rest of the results are plugins with “list” in the name that do very different jobs. Most people searching the phrase want the wp plugin list command or a content list on a page.

    How do I export a list of all my plugins to a spreadsheet?

    Run wp plugin list --format=csv > plugins-inventory.csv from the WordPress install directory. Add --fields=name,version,update to narrow the columns, or --field=name for names only. Always export CSV rather than parsing the default table output, which is formatted for reading and not for scripts.

    Why does wp post list not show my pages?

    WP-CLI’s documentation for wp post list notes that it shows only the ‘post’ post type by default. Pass --post_type=page for pages, or your own post type slug for a custom post type. Add --post_status=draft or --post_status=trash when the posts you expect are not published.

    Do I need a plugin just to list categories?

    Not if you are comfortable with a small amount of PHP. wp_list_categories() is core, it displays or returns the HTML list of categories, and its hide_empty argument drops categories with no posts. Wrapping it in a shortcode registered in your child theme’s functions.php means editors can place it without touching templates. A mistake in that file breaks the theme, so make the edit over SFTP where you can undo it, or use a plugin instead.

    Will a list plugin survive the next WordPress core update?

    Check the “Tested up to” value on the plugin’s directory page before a major core upgrade, and give extra attention to any plugin that adds custom columns, bulk actions or filters to admin list screens, because those hook into core internals that change more often than the public APIs. Test on staging first. Removing plugins you no longer use is the cheapest way to shrink the surface that can break.

    What should I record before I start deactivating plugins?

    The list of what was active, saved somewhere outside the site: wp plugin list --status=active --format=csv, or a screenshot of the Plugins screen filtered to Active. Conflict hunting means deactivating everything and reactivating one at a time, and without that record you will not know which plugins were meant to be off.

  • How to edit the footer in WordPress safely

    Key takeaways

    • Open the Appearance menu first: an Editor item means a block theme and a Footer template part, while Customize and Widgets point at a classic theme’s footer panels and widget areas.
    • On block themes the footer sits under Patterns or Template Parts depending on the theme, so check both before concluding it is missing.
    • If no dashboard screen changes the text, it is hard-coded in footer.php or printed by a theme credit hook, and the update-safe fix is a child theme copy, not an edit to the parent.
    • Leave <?php wp_footer(); ?> in place immediately before </body>. Delete it and analytics, pixels and plugin scripts stop printing while the page still looks fine.
    • Tracking code belongs in a header and footer snippet plugin such as WPCode, so it survives theme updates and theme switches.

    Most footer edits are one line of text: a stale copyright year, a missing privacy link, a phone number that changed. The edit takes ten seconds once you are in the right screen. Getting to the right screen is the whole job, because WordPress has four systems that can each own the bottom of the page.

    A block theme keeps the footer as a template part in the Site Editor. A classic theme keeps it in Customizer panels, widget areas, or baked into footer.php. A page builder may hold its own footer template. Editing the wrong one is why people say the site “did not save” when it saved perfectly, just somewhere that does not render. The same routing problem shows up whenever you edit themes in WordPress, and the fix is the same: diagnose the layer, then edit.

    How to tell which layer owns your footer

    Log in and look at the Appearance menu. That one menu answers the question in a few seconds.

    • Appearance has an Editor item: a block theme is active. The footer is a template part inside the Site Editor. WordPress.org’s documentation says the Site Editor is only available when a block theme is installed and active, so its presence is a reliable signal.
    • Appearance has Customize and Widgets but no Editor: a classic theme is active. The footer lives in a theme panel in the Customizer, in footer widget areas, or in the theme’s own options screen.
    • A page builder runs the site’s templates: check the builder’s own template or theme-builder area too. Builders sometimes take over the footer and sometimes leave it with the theme, and which one is true decides where you edit.
    • None of those screens contain the text you can see on the front end: the footer is hard-coded in a theme file or printed by a theme credit hook. Skip to the child theme section below.
    WordPress Appearance menu showing the Editor item used to identify a block theme
    The WordPress Appearance menu provides direct access to tools like Customize and Theme File Editor, essential for determining footer ownership. · Source: www.wpzoom.com

    One more check before you start. Look at what you are about to edit and ask whether it is global. A footer template part changes every template that includes it. A widget in Footer 1 changes every page with that sidebar. A block you added to the bottom of a single page template changes that view only. Almost every “it only changed on one page” report is that last case.

    Block themes: edit the Footer template part, not the bottom of a template

    Go to Appearance, then Editor. From there, themes differ in where they file the footer, which is the single most common reason people decide it is missing:

    1. Try Patterns, then look for a Footer entry, often grouped under a heading such as Template Parts or All template parts.
    2. If your version shows Template Parts as its own item, look there instead.
    3. Failing both, open Templates, pick any template such as Index or Single, scroll to the bottom of the canvas and click into the footer area. The block toolbar will name it as a template part, and the three-dot menu gives you an edit option that takes you into the part itself.
    4. From the front end, the admin bar’s Edit Site link drops you into the same editor. Scroll to the footer, hover, and click the edit control that appears.

    Inside the part, edit blocks as you would anywhere else: paragraph text for the copyright line, a Navigation block for footer menus, Social Icons, Site Logo, columns for a multi-column layout. Then save. The save dialog lists what is being written, and for a footer edit it should name the Footer template part. If it lists a template such as Single or Page instead, you edited the template, not the part, and the change will not follow you across the site.

    Spacing and padding are block settings, not footer settings

    There is no “footer padding” control, which sends people hunting for a setting that does not exist. Select the Group block that wraps the footer content, open block settings, and set Styles, then Dimensions, then Padding. Check the mobile preview before saving, because a footer that looks balanced at desktop width often collapses badly at 375 pixels. If the footer is built from nested Columns inside Columns, flattening it to one Group with a few child blocks makes the spacing predictable and easier to debug later.

    Classic themes: the Customizer panel, widget areas, or neither

    Open Appearance, then Customize, and look for a panel with any of these names: Footer, Footer Bar, Bottom Bar, Footer Builder, Site Identity, Theme Options, Site Info or Copyright Text. Theme authors name the same thing a dozen ways. Inside, you are usually looking for a field called Footer Text, Copyright Text or Footer Credits.

    Two things trip people here. First, Customizer changes stay in preview until you click Publish. A change that looks applied in the preview pane and absent on the live site is usually just unpublished. Second, some themes accept shortcodes in that field, commonly [current_year] and [site_title], which means the year updates itself every January instead of going stale.

    For widget-based footers, go to Appearance, then Widgets, and look for areas named Footer, Footer 1, Footer 2, Footer Column or Footer Bottom. Edit the Text or Custom HTML widget that holds your content, or add a Navigation Menu widget for legal links. If the footer area lists no widgets and offers nowhere to add them, the theme does not support footer widgets, and more hunting will not produce one. That is the moment to switch strategy rather than keep clicking.

    If there are several text widgets in the same footer area, make sure you have the right one. Widget IDs such as text-4 and text-5 look identical in the list. Change a word in one, watch the preview, and you will know which instance renders where.

    WordPress Widgets screen showing footer widget areas on a classic theme
    Classic themes often expose footer columns as widget areas, allowing users to easily add and configure content like a Products list directly within the WordPress Customizer. · Source: kinsta.com

    When no screen in the dashboard changes the footer text

    Then it is in the theme’s code. Classic themes keep the closing markup in footer.php, which WordPress’s theme handbook treats as a template partial that other template files pull in. Some themes print credits through an action hook of their own, along the lines of do_action( 'theme_name_credits' ), so the text is not in the file you are reading either.

    Editing the parent theme’s footer.php works right up until the next theme update overwrites it. Use a child theme instead. WordPress’s handbook describes child themes as a way to modify an existing theme without editing that theme’s code, and a copied footer.php in the child folder takes priority over the parent’s.

    1. Take a backup, or make sure your host’s restore point is recent, before you open any PHP file.
    2. Create or activate the child theme.
    3. Copy footer.php from the parent theme folder into the child theme folder, keeping the same filename.
    4. Edit only the human-readable text and HTML. Leave PHP functions, tags and structure as they are.
    5. Upload, then reload the front end.

    The one line you must not remove is the footer hook. WordPress’s function reference describes wp_footer() as firing the action that prints scripts and data before the closing body tag, and plugins rely on it:

    <footer id="site-footer">
        <p>&copy; <?php echo esc_html( date( 'Y' ) ); ?> <?php bloginfo( 'name' ); ?></p>
    </footer>
    <?php wp_footer(); ?>
    </body>

    Delete or relocate that call and the page still renders, which is what makes it nasty. What stops is analytics, tracking pixels, chat widgets and any script a plugin enqueues in the footer. People then spend an afternoon debugging the plugin that is working fine.

    Two failure signatures tell you a PHP edit went wrong: a blank white page, or “There has been a critical error on this website.” With debugging on or in the server error log you will see something like Parse error: syntax error, unexpected ... in wp-content/themes/your-theme/footer.php on line 42. The line number is the fastest route back. Restore your backup, or re-upload the original footer.php from a fresh download of the theme, then redo the change in the child theme.

    If a theme’s footer links are wrapped in eval( base64_decode( '...' ) ), stop. That is a theme hiding its own links from you, and it is a reason to question where the theme came from rather than a puzzle to solve.

    Adding tracking code to the footer without touching the theme

    Scripts are a different job from footer design, and they should not go in footer.php at all. A header and footer snippet plugin stores the code outside the theme, so it survives theme updates and theme switches. WPCode’s listing in the WordPress.org plugin directory describes exactly this: inserting header and footer scripts, pixel code and custom snippets. Install it, open Code Snippets, then Header & Footer, paste into the Footer box, and save.

    Two caveats. The footer box still depends on wp_footer() existing in the theme, so a theme with a mangled footer file makes the plugin look broken. And a heavy third-party script in the footer is still a heavy script: test the page after adding it rather than assuming footer placement makes it free.

    WooCommerce stores have two footers

    On a store, “the footer” is ambiguous. The storefront footer is a theme object and follows the rules above: Customizer panels on a classic theme such as Storefront, the Footer template part on a block theme, and Appearance, then Menus, to assign a dedicated footer menu for terms and privacy links. Some block-and-classic hybrid themes ship both a block footer and a classic footer, and only the active mode shows your edit, which is worth checking before you assume nothing saved.

    The email footer is a separate system entirely. WooCommerce’s settings documentation lists an Emails tab under WooCommerce, then Settings, and the footer text used in customer emails is edited there under the email template options, with placeholders such as {site_title} and {site_url}. For structural changes, copy wp-content/plugins/woocommerce/templates/emails/email-footer.php into wp-content/themes/your-child-theme/woocommerce/emails/email-footer.php and edit the copy. Editing the file inside the plugin folder works until the next WooCommerce update replaces it.

    Check the edit before you call it done

    A footer change touches every page, so verify it like one:

    • Load the home page, one blog post and one other page type. A correct template part edit appears on all of them.
    • Clear the site and host cache, then reload in a private window. Managed hosting caches routinely make a saved change look like a failed one, and re-editing on top of a stale page makes the mess worse.
    • Check the mobile width. Footers break there first.
    • Click the links you touched, including the legal ones.
    • Confirm the footer is still a real <footer> element if you rewrote the markup. Replacing it with a plain <div> removes the landmark that screen reader users rely on to jump there.

    Know the way back before you need it. Site Editor template parts have revisions in the sidebar. Widget content can be pasted back from a copy you kept. File edits come back from the backup you took in step one, which is the step people skip.

    When to stop and get help

    Stop if the footer text is not in any dashboard screen and you are not comfortable working in theme files, if the site is already showing a critical error, or if the credits are obfuscated. Stop also if the request is “change this one line” and the answer keeps turning into FTP access and a child theme, because the cost of the workaround has overtaken the cost of the change. Design changes on an existing WordPress site are the kind of work SiteSelf does through chat, using the connector plugin for content and settings and hosting access for anything in theme files, though pages owned by a visual page builder are refused with the reason.

    Frequently asked questions

    I changed the footer text in the dashboard and the site looks the same. Why?

    Four usual causes. You did not click Publish in the Customizer. You edited a template instead of the Footer template part. Your host’s cache is still serving the old page. Or the theme supports both a block footer and a classic footer and you edited the inactive one.

    How do I remove “Proudly powered by WordPress” from the footer?

    Work through it in order: a footer text or site info field in the Customizer, a theme-specific credit setting, a credit-removal plugin built for your theme, and only then a child theme copy of footer.php. If the theme exposes a credit hook, hook into it and output your own markup instead of deleting the hook call, which can take other output with it.

    Will my footer changes survive a theme update?

    Customizer and theme option values survive updates, though a theme switch loses theme-specific options. Child theme file overrides survive. Parent theme footer.php edits do not. Code stored in a snippet plugin survives both updates and theme switches, which is why tracking code belongs there.

    How do I make the copyright year update itself?

    In a theme footer field, try the theme’s shortcode, commonly [current_year]. In a child theme file, use <?php echo esc_html( date( 'Y' ) ); ?>. In a block theme, a small plugin that provides a dynamic year block drops into the Footer template part without any file editing.

    I edited the dashboard footer text and the public site did not change.

    Those are different systems. The admin_footer_text and update_footer filters change what appears at the bottom of wp-admin only. The public footer comes from the theme’s template part or footer.php.

    Should I disable the Theme File Editor?

    On any site where non-developers have admin accounts, yes. Adding define( 'DISALLOW_FILE_EDIT', true ); to wp-config.php removes the in-dashboard file editor, so footer PHP work has to go through FTP or your host’s file manager, where a backup is part of the routine.

  • How to fix WordPress plugins that are not working

    Key takeaways

    • Check Plugins → Installed Plugins first. WordPress pauses a plugin that throws a fatal error and says so on that screen, which names the culprit before you start testing.
    • Clear every cache layer, not just the browser: the caching plugin, the host cache and the CDN, and switch off minification, deferred JS and critical CSS while you debug.
    • Locked out of wp-admin? Rename wp-content/plugins over SFTP or the host file manager to force everything off. WordPress.org documents this. Getting access back is step one, not the fix.
    • Do not delete the plugin before you diagnose it. You lose its settings and the clean rollback path; WP Rollback restores a previous version from WordPress.org instead.
    • A plugin that is active and doing nothing is often a template problem, not a plugin bug. Check the plugin’s output has somewhere to render before you go deeper.

    A plugin that stopped working rarely stopped on its own. Something changed first: the plugin updated, WordPress core updated, the host moved you to a newer PHP version, someone added a caching rule, someone pasted a snippet into a theme file. The plugin is where the failure shows up. It is often not where the failure started.

    That is why the first move is not deactivation. It is a two-minute pass to record what changed and what exactly is broken. If the break started right after an edit to functions.php, for example, the edit is your prime suspect, and there are safer ways to make theme changes that survive the next update. If it started right after a Tuesday morning update run, you already have a short list.

    Write down what changed before you touch anything

    Four things, in a note, before you start clicking:

    • The last change on the site: plugin update, core update, theme switch, PHP version change, new caching or security rule.
    • The exact failing surface: which page, which action, front end or admin, logged in or logged out, checkout or contact form.
    • Whether it fails in a private window too. If it works there, you are looking at a cache or a logged-in-only difference, not a broken plugin.
    • Whether WordPress has already told you. Open Plugins → Installed Plugins and look for a plugin marked as paused with a notice that it was deactivated because of a fatal error. That notice names the file that crashed. People miss it constantly.

    Then read the logs rather than guessing. WordPress’s debugging handbook documents WP_DEBUG, WP_DEBUG_LOG and WP_DEBUG_DISPLAY in wp-config.php. On a live site, turn logging on and display off, then read wp-content/debug.log and the server error log. A PHP failure leaves a file path pointing at the plugin or theme that caused it. A cache problem leaves no error at all, which is itself a clue.

    The causes, roughly in the order they happen

    A conflict introduced by an update

    This is the most common one, and the trigger is usually an update that ran in the last day or two. Two plugins touch the same hook, one ships a new script that collides with another, or a plugin and the theme both try to control the same template. WooCommerce’s own self-service guide names the same three suspects for store problems: outdated software on the site, a conflict with the theme, and a conflict with another plugin.

    Repeat offenders in practitioner reports are the big ones, because they are the ones doing the most work: WooCommerce on major versions that run database migrations, and Elementor plus its add-on packs, where an add-on lags a version behind the builder.

    A cache serving the old version

    The most under-diagnosed layer by a distance. You fix the problem, the page still looks broken, so you assume the fix failed and change something else. Clear the caching plugin, the host cache and the CDN, in that order, then retest in a private window. While you are debugging, switch off minification, deferred JavaScript, critical CSS and Cloudflare Rocket Loader. Combining and deferring scripts is exactly the sort of thing that hides a plugin’s JavaScript from logged-out visitors while it works fine for you.

    The signature to recognise: it works when you are logged in and fails when you are not. That is almost always stale cached output, not a plugin bug.

    The plugin works, the template has nowhere to put it

    A plugin can be installed, active, licensed and running correctly while showing nothing on the page, because the theme template does not include the area or hook it renders into. This comes up constantly in WooCommerce and page-builder setups, where a custom product template replaced the standard one and dropped the hook the plugin attaches to.

    Before you start a conflict test, ask the cheap question: does this plugin’s output have anywhere to appear? Switching to a default theme for thirty seconds answers it.

    PHP version, memory, or a snippet with a typo

    Three different problems that produce similar-looking breakage. Plugin code that does not run on the site’s PHP version. Memory exhaustion on a small hosting plan carrying WooCommerce plus a page builder plus a security scanner. Or a snippet copied off a blog into functions.php with a missing semicolon.

    The errors are distinctive enough to sort quickly:

    • Parse error: syntax error, unexpected ... points at a code edit, usually the most recent one.
    • Fatal error: Allowed memory size of X bytes exhausted is a resource limit, not a bug.
    • Fatal error: Uncaught Error: Call to undefined function ... or Class '...' not found usually means a version mismatch or a half-installed plugin.

    An update that stopped halfway

    An auto-update that timed out leaves a plugin with a mix of old and new files. Symptoms include a site stuck on “Briefly unavailable for scheduled maintenance”, or database errors such as Table 'wp_xxx' doesn't exist and Unknown column ... in 'field list' after a plugin that migrates its own tables was interrupted mid-migration.

    For the maintenance message, WordPress.org’s troubleshooting FAQ covers the fix: delete the .maintenance file in the site root. For a half-finished migration, restore the pre-update database backup. Re-running the update on a half-migrated database tends to make it worse.

    The isolation test, run so the answer means something

    Everyone knows the method. Most people run it in a way that cannot produce a reliable answer. The rule is one change, one test, on the exact surface that failed.

    1. Take a backup. The test is only aggressive enough to be useful if you can undo it.
    2. Deactivate all plugins. Test the failing action, not the homepage. If it still fails, plugins are not your cause and you can move to the theme.
    3. Reactivate one plugin. Clear the cache. Test again. Repeat, one at a time. Reactivating in batches to save time destroys the only thing the test produces.
    4. If plugins come back clean, switch to a default theme such as Twenty Twenty-Five and retest. Users blame plugins for theme faults more often than the reverse.
    5. Open the browser console on the failing page and look for TypeError: ... is not a function or ReferenceError: ... is not defined. A JavaScript error names the file that failed to load.

    On a live site you do not want to take the public offline while you do this. The Health Check & Troubleshooting plugin, published by WordPress.org, adds a troubleshooting mode that disables plugins for your session only, so visitors keep seeing the normal site. One honest caveat: its directory listing currently carries a notice that it has not been tested with the last three major WordPress releases, so read that before installing it on a store.

    WordPress troubleshooting mode screen used to isolate a plugin conflict
    The ‘Troubleshoot’ option next to each plugin allows you to isolate conflicts for your session without affecting live site visitors. · Source: make.wordpress.org

    Two more cheap checks that solve a surprising share of cases. Resave Settings → Permalinks, which flushes rewrite rules and fixes plugin endpoints returning 404 or 500 after an update. And for any premium or connected plugin, confirm the licence is valid and the site can reach the vendor’s servers, because a plugin that cannot phone home fails silently and looks like a conflict.

    Getting back in when wp-admin is gone

    If a fatal error has taken the dashboard with it, stop trying to log in. Recovery happens at the file level, through SFTP, SSH or the host’s file manager.

    Rename the folder of the plugin you suspect, from plugin-name to plugin-name.off. WordPress cannot load it, so it deactivates, and the settings in the database stay intact. If you do not know which one, rename the whole wp-content/plugins directory to plugins.deactivate to force everything off. WordPress.org’s troubleshooting FAQ documents this as the way to deactivate all plugins without admin access. Once you are back in, rename the folder back and reactivate one at a time.

    SFTP file manager showing the wp-content plugins folder for renaming
    An SFTP client provides direct access to the wp-content/plugins directory, where renaming the folder can quickly restore access to a locked-out wp-admin. · Source: kinsta.com

    Being able to log in again is a milestone, not a finished job. The site is now running without the plugins it needs, and the thing that caused the crash is still there. Do the isolation pass before you call it fixed, and retest the exact admin screen or checkout step that broke rather than the homepage.

    Update, roll back, replace, or remove

    Once you know which plugin is at fault, the next step is a judgment call, not more testing.

    What you are looking atThe usual answer
    Maintained plugin, a newer version fixes the reported bugUpdate, on staging first if you have one
    Broke the moment it updated, previous version was stableRoll back and wait for the vendor patch
    Files look corrupt or an update was interruptedReinstall the same version so the files match
    Not updated in years, not tested with recent WordPress, fails on PHP 8Replace it with something maintained
    Known vulnerability, no patch, feature is business-criticalRemove it and solve the need another way

    Rollback is a normal first response, not a last resort. WP Rollback, by Devin Walker, restores any plugin or theme from the WordPress.org directory to a previous version through the familiar updater flow, so you do not have to hunt for an old zip. It only works if you did not delete the plugin, which is the argument for diagnosing before deleting.

    On the “replace it” line, check the plugin’s directory page for the last-updated date and the “tested up to” version before you reinstall hope. Patchstack publishes an annual State of WordPress Security whitepaper analysing the previous year’s vulnerability data, and the pattern it tracks is a plugin ecosystem problem more than a core one. An abandoned plugin is a maintenance decision, not a bug report.

    The fixes that make it worse

    • Reactivating in batches. Saves five minutes, costs you the answer.
    • Deleting the plugin before diagnosing. You lose its configuration and the clean rollback.
    • Setting permissions to 777. It is a security risk, many hardened hosts refuse it anyway, and it rarely was the problem. WordPress’s hardening handbook has a file permissions section worth reading instead.
    • Leaving WP_DEBUG_DISPLAY on in production. It prints file paths and stack traces to visitors.
    • Downgrading PHP permanently. It hides the incompatibility and drops you off security support. Use it as a bridge for a day, not a policy.
    • Editing plugin or parent-theme files in place. The next update overwrites your fix and the bug comes back with no record of why.

    When to stop and hand it over

    Three signals that the cheap path has run out: the conflict reappears after a clean isolation pass, the failure involves custom code or a bespoke integration, or the breakage is in the database rather than the files. At that point you are choosing between a long evening and someone with server access.

    That is the shape of work SiteSelf handles: you describe the symptom through chat, the agent reads the logs on the connected site, runs the isolation, applies the fix, then fetches the page and reports what it changed and what it checked. Content and settings work needs the SiteSelf Connector plugin; reading logs, renaming folders and rolling back files needs hosting access over SSH. More on handing WordPress troubleshooting to an agent, including what it refuses, such as pages owned by a visual page builder.

    Frequently asked questions

    Why does the plugin work for me but not for logged-out visitors?

    Almost always cached output. Logged-in users usually bypass page cache, so you see the current version while visitors get the stored one. Clear the caching plugin, the host cache and the CDN, then test in a private window with minification and deferred JavaScript switched off.

    Should I deactivate plugins first or switch the theme first?

    Plugins first, because conflicts between plugins are the more frequent cause and the test is faster. But always run the default theme test before you conclude a plugin is guilty. A theme that overrides a template or throws an error in functions.php produces symptoms that look identical to a plugin bug.

    Do I need to delete and reinstall the plugin?

    Reinstalling the same version helps when the files are corrupt or an update was interrupted, and it keeps your settings because those live in the database. Deleting is different: it can remove configuration and it takes away the clean rollback. Diagnose first, delete last.

    Why does it work on staging but not on live?

    Look at what differs between the two environments rather than at the plugin. The usual differences are cache and CDN layers that only exist on live, a different PHP version, plugin or theme versions that drifted apart, a premium licence tied to the live domain, and firewall or IP rules that block outbound calls from one environment.

    Is raising the PHP memory limit a real fix?

    Sometimes. A one-off increase is reasonable when a heavy task such as an import or a security scan exhausts memory. Repeated exhaustion during ordinary page loads means the plugin stack is too heavy for the plan, and raising the number again just moves the failure. Reduce the stack or move to hosting sized for it.

    What details should I give the plugin developer?

    WordPress version, PHP version, the plugin version, the active theme, the full list of active plugins, the exact steps that reproduce the failure, and the relevant lines from debug.log. Check the changelog and support forum first, because version-specific breakages are often already reported with a workaround.

  • How to edit themes in WordPress without losing work

    Key takeaways

    • The Site Editor only appears when a block theme is active. If you see Appearance → Customize instead, you have a classic theme and different instructions apply.
    • Anything saved through the Customizer or the Site Editor is stored in the database and survives a theme update. Anything typed into a parent theme’s files does not.
    • A working child theme needs two files: a style.css whose header includes a Template line naming the parent theme’s folder, and a functions.php that enqueues the stylesheet. Copy only the templates you actually change.
    • WooCommerce overrides load only from a woocommerce folder inside the active theme, at the same relative path and filename the plugin uses.
    • A missing semicolon in functions.php produces a white screen or the critical error page. The fix is reverting the file over SFTP or renaming the theme folder, not more editing in the dashboard.

    A color change made directly in a theme’s stylesheet looks right all afternoon. Then the theme updates and it is gone, along with the spacing fix from last month. Nothing was wrong with the code. It was saved in a file that the update was allowed to replace.

    That is one of two ways theme edits fail. The other is faster and louder: a stray character in functions.php and the site returns a blank page or the message “There has been a critical error on this website.” Both failures come from the same root cause, which is editing in the wrong place for the kind of change being made.

    So the useful question is not “how do I open the theme editor”. It is “which layer does this change belong in”. There are three, and WordPress stores each one differently.

    Check whether your theme is a block theme or a classic theme first

    The instructions for every step below depend on this, and the dashboard tells you in one click. Open Appearance:

    • Appearance → Editor means a block theme is active. WordPress.org’s Site Editor documentation states the Site Editor is only available when a block theme is installed and activated, so its presence is the test.
    • Appearance → Customize means a classic theme, where design settings come from the Customizer and the theme’s own options screens.
    • Appearance → Theme File Editor means file editing is switched on. Many hosts and security plugins remove it, which is not a fault.
    • A builder screen such as Elementor, Divi or Beaver Builder on your pages means a fourth model sits on top of the theme. Edit those pages in the builder; theme templates may not control them at all.

    Most confusing tutorials are confusing because they were written for the other model. A guide that says “go to Appearance → Customize” is describing a classic theme, and on a block theme that menu item does not exist.

    Match the change to the layer that stores it

    Three layers, in order of how safe they are to touch:

    • Settings. Customizer options, theme option screens, Site Editor global Styles. Saved in the database. Survives theme updates. Limited to what the theme exposes.
    • Templates. Block templates and template parts in the Site Editor, or PHP files such as single.php and header.php in a classic theme. This is where layout actually lives. Block template edits go to the database; PHP template edits belong in a child theme.
    • Code. functions.php, hooks and filters. This is where sites break, and where a snippet plugin is usually the better home.

    Before opening anything, write the change as an outcome: “make the mobile header shorter”, not “edit the header file”. Outcomes point at a layer. File names point at whichever file you happened to guess.

    Block themes: Styles for global design, templates for layout

    Open Appearance → Editor and pick the surface that matches the scope of the change.

    1. Styles for site-wide typography, colors, spacing and button styling. Changes here apply everywhere and are the first thing to try.
    2. Patterns and template parts for reusable pieces: the header, the footer, a call-to-action band. Editing the header template part changes every page that uses it.
    3. Templates for the structure of a view: single post, page, archive, search results, 404.
    4. Save, then load one real page in the browser at full width and at roughly 375px wide.
    WordPress Site Editor Styles panel used to edit a block theme
    The WordPress Site Editor’s Styles sidebar offers granular control over global color and typography, defining the visual identity of your block theme. · Source: wordpress.org

    The most common block-theme mistake is a layer mismatch in the opposite direction: editing a page’s content when a template governs the output, then concluding the change “didn’t save”. If the element appears on many pages, it comes from a template part. If it appears on one page only, it is content.

    A child theme of a block theme is usually a folder with a style.css header and a theme.json that overrides specific settings, rather than a pile of copied PHP.

    Classic themes: the Customizer, then Additional CSS, then stop

    Start at Appearance → Customize and look for the setting that matches the outcome: Site Identity for the logo, Colors, Menus, Widgets, Homepage Settings, plus whatever panels the theme adds. Anything you set here is update-safe.

    Appearance → Customize → Additional CSS is the right home for presentation tweaks the markup already supports: a button color, a font size, tighter spacing. It is stored in the database, it is easy to remove, and for a handful of rules it beats building a child theme.

    Additional CSS stops being the answer when you are fighting specificity to move things around. If you are stacking !important to rebuild a header, the markup cannot produce the layout you want. At that point the honest options are a child theme template, a different theme, or a developer. More CSS just makes the next person’s job harder.

    If the change is clear but you would rather not be the person hunting for the template, design changes on an existing theme are the kind of work SiteSelf does through chat, using the SiteSelf Connector plugin for settings and hosting access for theme files.

    How to build a child theme with two files

    A child theme gives code-level changes a place to live that updates will not overwrite. WordPress loads the child’s version of a template or stylesheet in preference to the parent’s. The theme handbook’s steps come down to a folder and two files.

    The two files

    Create a folder in /wp-content/themes/, for example company-child. Inside it, create style.css:

    /*
    Theme Name: Company Child
    Template: twentytwentyfive
    Version: 1.0.0
    */

    The Template value is the parent theme’s folder name, not its display name. “Kadence Pro” on screen might be kadence on disk. Check /wp-content/themes/ and copy the folder name exactly, including case.

    Then functions.php, which loads the child stylesheet after the parent’s:

    <?php
    add_action( 'wp_enqueue_scripts', function() {
        wp_enqueue_style(
            'company-child-style',
            get_stylesheet_uri(),
            array( 'parent-style-handle' ),
            wp_get_theme()->get( 'Version' )
        );
    } );

    Replace parent-style-handle with the handle the parent uses; search the parent’s functions.php for wp_enqueue_style to find it. Declaring the dependency is more reliable than an @import in the stylesheet, because WordPress then controls load order. Some parent themes, Divi among the ones practitioners complain about most, will render badly if the child does not load parent assets correctly, so check the parent’s own child theme notes before assuming the snippet above is enough.

    wp-content themes directory showing a WordPress child theme folder
    This SFTP client view clearly illustrates the essential wp-content/themes directory where all WordPress themes, including child themes, reside. · Source: www.theistudio.com

    Copy only what you change, at the exact same path

    Do not copy the parent’s entire functions.php into the child. It runs in addition to the parent’s, so duplicated function names produce a fatal error immediately. Copy only the code you need.

    Template overrides work on path matching. If the output you want to change lives in template-parts/post/content.php, the child needs that same relative path, or WordPress keeps using the parent file and your edit does nothing. A misplaced override looks exactly like a caching problem.

    Activate the child from Appearance → Themes, then load the homepage, a single post, an archive and a normal page. Any theme options set on the parent will need to be set again, which is a good reason to build the child theme before you spend an afternoon in the Customizer.

    Put small features in a snippet plugin instead of functions.php

    For hooks, filters and small behavior changes, a snippet plugin is safer than a theme file. Code Snippets, in the WordPress.org plugin directory, describes itself as a way to stop tweaking your theme’s functions.php and to add code as individual, manageable snippets.

    The practical advantage is recovery. Each snippet can be switched off from the plugin’s own screen, or through recovery mode, without SFTP. Add one snippet at a time and load the site after each. The division most practitioners settle on: snippet plugin for functionality, child theme for structure and layout.

    The limit is real. A bad snippet can still take the front end down, and a snippet plugin used as a dumping ground for hundreds of lines becomes its own unmaintainable mess. Database or environment-specific logic belongs in a small custom plugin, not in either place.

    WooCommerce: the shop page is not a page

    Editing the Shop page’s content and seeing nothing change is the single most common WooCommerce theme question. The shop layout comes from a product archive template, not from that page’s content.

    Three routes, cheapest first:

    • On a block theme, edit the Product Catalog or archive template in Appearance → Editor → Templates.
    • On a classic theme with WooCommerce options, use the theme’s own settings. Astra, Blocksy and Kadence each expose product catalog controls in the Customizer.
    • Override the template. WooCommerce’s developer docs describe copying the template into a woocommerce folder inside your theme, keeping the same directory structure, and editing the copy.

    Overrides fail on precision, not concept. The relative path and filename must match the plugin’s exactly, the theme holding the override must be the active theme, and the output you are chasing may come from several templates plus action hooks, so changing one file may not be enough. Removing markup or hooks that WooCommerce expects is how add-to-cart and checkout break, so test an actual purchase after any override. Store owners who want this handled without touching template files can read about WooCommerce work through chat.

    If the screen goes white after a PHP edit

    The white screen and the “critical error” page are both documented in WordPress’s Common WordPress errors handbook, and a PHP error in functions.php is the usual cause after theme editing. WordPress also emails the admin address with a recovery mode link, subject line “Your Site is Experiencing a Technical Issue”. Check that inbox first.

    WordPress critical error message after a functions.php edit
    This critical error message, displayed in your browser, signals a fatal PHP issue that often requires SFTP access to resolve. · Source: www.wpbeginner.com

    Work in this order and stop when the site returns:

    1. Revert the file. Over SFTP or your host’s file manager, remove the code you just added or restore your saved copy. Do not keep editing in the dashboard; if /wp-admin goes down too, that route closes.
    2. Rename the theme folder. Change my-theme to my-theme-old in /wp-content/themes/. WordPress falls back to a default theme such as Twenty Twenty-Five. If the site comes back, the fault is in the theme.
    3. Read the error. Set WP_DEBUG and WP_DEBUG_LOG to true in wp-config.php and open wp-content/debug.log. It names the file and the line.
    4. Reinstall the theme. If the file looks corrupted, upload a fresh copy of the parent theme. Your customizations are in the child theme, which is the point of having one.

    Get help when the error persists after the theme is ruled out, when you have no SFTP or file manager access, or when the site takes orders and every minute of a blank checkout costs money. Guessing is more expensive than asking.

    What to check before you call the edit done

    “Saved” is not “working”. Run through this after any theme change:

    • Clear the caching plugin, the host cache, the CDN and your browser, in that order, before believing the change did not apply.
    • View the change at a narrow width. Headers, tables, long headings and forms are where mobile breaks.
    • Load every view the edited template touches: post, page, archive, search results, pagination, and one page while logged out.
    • On a store, load a product, add to cart and reach checkout.
    • Note what you changed, where, and how to undo it. A one-line record beats memory three months later.
    • Recheck after the next parent theme update, particularly if you overrode a template.

    Visual settings in the visual tools, durable overrides in a child theme, functionality in a snippet plugin, nothing in the parent theme. That split is what keeps an update from erasing your work.

    Frequently asked questions

    Why is Appearance → Customize missing from my dashboard?

    You are almost certainly running a block theme, where the Customizer is replaced by the Site Editor at Appearance → Editor. Some themes hide parts of the Customizer too. If neither menu item appears, check which theme is active under Appearance → Themes.

    Why can’t I find the Theme File Editor?

    Many hosts and security plugins disable file editing from the dashboard, and multisite installs restrict it by default. It can also be off because file permissions do not allow writes. Use SFTP or your host’s file manager instead; that is the better workflow anyway, since it lets you keep a copy of the original file.

    Do I need a child theme, or is Additional CSS enough?

    For colors, fonts and spacing that the existing markup supports, Additional CSS is enough and it survives theme updates. For template changes, PHP, or anything structural, use a child theme. Developers disagree about the middle ground; a few dozen CSS rules do not need a child theme, but a growing pile of overrides does.

    My edits do not show up on the site. What now?

    Clear site, CDN and browser caches first. Then confirm you edited the template the page actually uses, since a page may render from front-page.php rather than page.php, or from a block template rather than page content. If the CSS is loading but losing, the parent rule is more specific, and if a page builder owns the page, the theme template may not be in play at all.

    Where are WordPress theme files stored?

    In /wp-content/themes/your-theme-name/, reachable over SFTP or through your host’s file manager. Practitioner advice across r/webdev is blunt about the rest: /wp-admin and /wp-includes are off limits, and plugin files should be overridden rather than edited in place.

    Can SiteSelf edit pages built with Elementor or Divi?

    No. Pages owned by a visual page builder are refused at the moment of work, with the reason given, because the builder holds the layout rather than the theme templates. Theme-level styling, templates and code on a standard theme are in scope, given the right access.

  • How to build a landing page in WordPress

    Key takeaways

    • A landing page in WordPress is a Page plus four decisions: template, slug, index setting, and what loads on the page. Nearly every failure traces back to one of them, or to a cache sitting in front of them.
    • Block themes: build a Landing page template in the Site Editor with the header and footer removed, then assign it in the page’s Settings sidebar. Classic themes: pick the full-width or canvas template, or add a template file in a child theme.
    • After you change a slug, open Settings and then Permalinks and press Save Changes to flush rewrite rules, then check that no live ad or menu item still points at the old URL.
    • A per-page Index setting does nothing while the SEO plugin still has a site-wide noindex rule on Pages. Check both.
    • Test the form on the published URL in a logged-out browser. A form that fails silently looks exactly like traffic that did not convert.

    WordPress has no landing page object. There is no dedicated post type, no setting to switch on, no feature to install. A landing page is an ordinary Page, and four decisions make it act like a landing page: the template that renders it, its slug, its indexing settings, and what CSS and JavaScript load on it.

    That framing is worth holding onto, because it also describes every way the page fails. Blank page, wrong layout, 404, missing from Google, form that does nothing: each one is a template problem, a permalink problem, an indexing problem, an asset problem, or a cache sitting in front of one of those. Fix the category and the symptom goes away.

    Decide what renders the page before you place a single block

    This is the decision that sets the ceiling on everything else. A landing page built with the block editor and a stripped template loads the theme’s stylesheet and whatever the blocks need. The same page built in a full page builder also loads the builder’s own CSS and JavaScript, on every request, whether the page uses three of its widgets or thirty.

    That overhead is not fatal. It is a real cost that shows up on the metric advertisers care about. web.dev’s Largest Contentful Paint guidance puts the “good” threshold at 2.5 seconds, measured at the 75th percentile of page loads, which is a low bar to clear on a laptop and a high one on a phone on mobile data.

    Three honest options:

    • Block editor plus a custom template. Free, lightest, no extra plugin. You need to be comfortable in the Site Editor, and you get no prebuilt campaign templates and no built-in split testing.
    • A page builder you already use across the site. Fastest to produce, easiest to hand to a marketer, and the standard choice if you publish campaign pages regularly. Adds page weight and one more thing that can conflict after an update.
    • A second builder, just for landing pages. Usually the worst of both. Two builders on one site means two asset stacks, two sets of update risk, and two ways to edit the same page.

    Pick one and stay with it. Overlapping tools doing the same job is the most reliable way to create a conflict you will spend an afternoon isolating.

    Build the page: block theme, classic theme, or a template file

    Block theme (Twenty Twenty-Four and similar)

    The Site Editor is only available when a block theme is active, according to WordPress.org’s Site Editor documentation. If Appearance shows an Editor item, you have one.

    1. Go to Appearance, then Editor, then Templates, and add a new template for Pages. Name it something obvious, like Landing page.
    2. Delete the Header and Footer template parts from it. Keep the Content block. That is your distraction-free shell, reusable for every campaign.
    3. Create the Page under Pages, then in the Settings sidebar set Template to Landing page. The Settings sidebar is the standard place WordPress exposes per-page controls in the block editor.
    4. Build the page in the content area with ordinary blocks: Cover or Group for the hero, Columns for benefits, an image or two, your form block.
    WordPress Site Editor templates list used to create a landing page template
    Within the WordPress Site Editor, easily manage existing templates or add new ones, including a blank page for a custom landing page without a header or footer. · Source: www.gravityforms.com

    Classic theme

    Open the Page, and in the Settings sidebar look for Template. Most classic themes ship something called Full Width, Blank, Canvas or Page Builder. Pick it, then hide anything the theme still prints, usually through the theme’s own page options.

    If the theme has no suitable template, add one in a child theme rather than editing the parent. A parent theme update will overwrite your file and take the design with it. A minimal blank template looks like this:

    <?php
    /* Template Name: Landing page */
    ?>
    <!doctype html>
    <html <?php language_attributes(); ?>>
    <head><?php wp_head(); ?></head>
    <body <?php body_class(); ?>>
    <?php while ( have_posts() ) : the_post(); the_content(); endwhile; ?>
    <?php wp_footer(); ?>
    </body>
    </html>
    

    Save it as landing-page.php in the child theme. Keeping wp_head() and wp_footer() matters: drop them and your analytics, your form scripts and half your plugins stop loading on exactly the page you care about.

    What goes on the page

    The structure practitioners keep landing on is boring and stable: hero, the problem, the offer, no more than three feature sections, proof, objections, a repeated call to action.

    The hero carries one H1 that echoes the ad or email that sent the visitor, one sentence of plain value, and one button. If the ad promised a free quote, the H1 says so. Proof goes after the benefits, not before, because a testimonial only reduces friction once the reader knows what is being offered. Named people with specific outcomes do more than a wall of anonymous “verified customer” quotes.

    Keep one goal and one primary action. A second offer on the page is a second decision, and second decisions are where conversion goes to die.

    The settings that decide whether the page works

    Design is the part everyone looks at. These four are the part that breaks.

    Slug. Short, campaign-aware, and unique. Check it does not collide with a plugin’s base, like /shop/, /docs/ or /kb/. If it does, change the plugin’s base in its settings rather than renaming the page a second time.

    Indexing. Campaign pages fed only by ads can be set to noindex. Pages you also want found in search must be set to Index, with the canonical URL pointing at themselves, not at the homepage. Then check the SEO plugin’s site-wide settings, because a global “noindex Pages” rule quietly overrides the per-page fix you just made.

    Navigation. Keep the page out of the main menu when traffic comes from ads or email. For a page that also serves organic search, a minimal header is a fair trade. For B2B offers, a single link to pricing or docs often costs less than the friction of hiding it.

    The thank-you page. Create a separate page shown after submit, set the analytics goal on that URL, and tag campaigns with UTM parameters so you can compare channels. Without a distinct URL you are guessing which source produced which lead.

    WordPress Permalinks settings screen used to flush rewrite rules after a landing page slug change
    Simply clicking the Save Changes button on the Permalink Settings screen can refresh rewrite rules, resolving many 404 errors on landing pages. · Source: www.geeksforgeeks.org

    Check these before you send traffic

    1. Open the published URL in a logged-out browser, not the editor preview. Template problems and cache problems only show up there.
    2. Submit the form yourself. Confirm the entry arrives, the notification email arrives, and the thank-you page loads.
    3. Load it on a phone on mobile data. Check the CTA is reachable without pinching and the hero image is not a 2 MB JPEG.
    4. Confirm exactly one H1, descriptive button text (“Book a call”, not “Learn more”), and enough contrast on the button to read it outdoors.
    5. Purge every cache layer you run: the caching plugin, the host cache, the CDN. Then reload.
    6. Check the page in Search Console’s URL Inspection if it is meant to be indexed.

    Do this again after any change to the page, not just at launch. Most silent landing page failures start with an edit that was never checked on the live URL. If keeping that loop going is the part that never happens, it is the kind of work you can hand to an agent that edits pages and reports back.

    When the page is blank, 404s, or the form does nothing

    Ranked roughly by how often each one turns out to be the cause.

    Blank page or “There has been a critical error on this website”

    Almost always a plugin or theme conflict, and almost always right after an update. Work in staging if you have it. Deactivate all plugins, then reactivate one at a time, refreshing the landing page after each. On a site with twenty or thirty plugins, halve the set instead of going one by one.

    To avoid taking the live page down while you test, the Health Check & Troubleshooting plugin from WordPress.org disables plugins for your session only. Note the caveat on its directory listing: WordPress.org flags that it has not been tested with the latest three major releases, so check it on staging first. If you are locked out of the dashboard entirely, rename the plugins directory over SFTP to get back in, then turn WP_DEBUG on in wp-config.php and read the fatal error instead of guessing.

    The page 404s

    Go to Settings, then Permalinks, and press Save Changes without altering anything. That flushes rewrite rules and fixes most cases. If it does not, your .htaccess or Nginx config is not writable and rules are never being written. Then check what still points at the old URL: menu items, internal links, and live ad campaigns, which will keep spending on a 404 until someone notices.

    Your edits do not show up

    Cache, in one of three places. Clear the plugin cache, the host cache and the CDN, in that order, and retest in a private window. Host-level caching is often not configurable from the dashboard, so a correct exclusion in your caching plugin can still be defeated by the server. If edits keep going stale on this one page, exclude the page itself from caching.

    The form submits and nothing happens

    Open the browser console with F12 and watch for JavaScript errors as you submit. The usual causes: a security plugin blocking the AJAX endpoint the form uses, minification or JavaScript deferral changing script order, or mixed content on a page still loading an asset over HTTP. Inside a page builder, using the form plugin’s shortcode instead of its widget removes a whole class of these problems. Turning off JavaScript optimization site-wide to make one form work is a bad trade: exclude that script instead.

    Browser console showing a JavaScript error while testing a WordPress landing page form
    When a form fails to respond, the browser console often reveals an ‘Uncaught TypeError’ pointing directly to the problematic script and line number. · Source: learn.microsoft.com

    WooCommerce pages

    A product landing page should use the Product post type, or a normal Page with WooCommerce blocks or the [product_page id="123"] shortcode. A Page with product copy pasted in has no cart integration. Cart, checkout and account endpoints must stay out of every cache layer, including the host’s. A cached checkout is a revenue failure that looks fine from the outside.

    When to stop and get help

    Stop when the fix requires editing files you cannot restore, when the error is a PHP fatal inside a plugin you did not write, or when the site is taking live ad traffic and you are more than half an hour into isolating a conflict. Roll back to the last backup, point the campaign at a working URL, and debug on staging. Firefighting on production with ad spend running is how a small problem gets expensive.

    Frequently asked questions

    Do I need a plugin to make a landing page in WordPress?

    No. The block editor plus a full-width or blank template covers simple lead-gen pages, and you only really need a form plugin and an SEO plugin on top. Builders earn their place when a non-technical team needs prebuilt templates, or when you want split testing without custom work.

    Can my homepage be a landing page?

    Yes. Go to Settings, then Reading, choose “A static page” and select your page. Do not set the same page as both the homepage and the Posts page, which makes WordPress render blog posts instead of your layout.

    Should a landing page have navigation?

    For pages fed by ads or email, remove it. For pages that also need to work in organic search, a minimal header is reasonable. For considered B2B purchases, keeping one link to pricing or docs usually costs less than the friction of hiding everything.

    How many landing pages should I run?

    One per offer, campaign or audience segment, each with its own URL and its own tracking. One generic page serving four campaigns gives you no way to tell which message worked.

    Should I use a dedicated landing page tool instead of WordPress?

    External tools launch faster and ship testing out of the box, at the cost of a separate subdomain, a separate bill and a split content footprint. A common compromise is to test paid-campaign variants outside the site, then rebuild the winner inside WordPress on your own domain where the SEO value accumulates.

    Will a WordPress landing page rank?

    It can, if it is indexable, canonical to itself, fast on mobile, and says something substantial rather than repeating a slogan four times. Thin pages built purely for ad traffic rarely rank, whatever platform they sit on.