Blog

  • How to add pages in WordPress and get them seen

    Key takeaways

    • Publishing creates a URL and nothing else. On a classic theme you add the page under Appearance > Menus and press Save Menu. On a block theme you edit the Navigation block in Appearance > Editor.
    • If a new page has no header or menu, check its Template setting before anything else. A Landing or canvas template leaves the navigation out on purpose, and switching to Default brings it back.
    • Deleting a page takes its menu item with it. Recreating a page with the same name does not bring the menu item back, so you have to add it again.
    • A page called Cart does nothing until it is assigned under WooCommerce > Settings > Advanced > Page setup. WooCommerce says Cart, Checkout and My Account must each be a separate page.
    • For a page that returns 404, resave your current permalink structure without changing it. Changing the structure on a live site breaks every existing URL.

    Almost nobody gets stuck on the part where you create the page. They get stuck after pressing Publish, when the page doesn’t show up in the menu, has no header, or returns a 404. Those are four separate systems: the page itself, the navigation, the template and the URL rules. Each one needs its own step, and fixing one doesn’t fix the others.

    This guide covers both jobs: creating the page, then making it reachable and getting it to display correctly. To change a page that already exists, see how to edit pages in WordPress.

    What do you need before you add a page?

    You need an account that can publish pages. Administrators and Editors can. If you log in and there is no Pages item in the left-hand admin menu, your role doesn’t include page permissions, and an administrator has to change it.

    Next, find out which kind of theme you have, because the menu steps depend on it. Open the Appearance menu in the dashboard. If it has an Editor item, you’re on a block theme and navigation lives in the Site Editor. If it has Menus and Customize, you’re on a classic theme. Many tutorials were written for classic themes. Readers on block themes follow them, can’t find Appearance > Menus, and conclude WordPress is broken. It isn’t. The setting has moved.

    Finally, check that you actually want a page. WordPress.org’s documentation puts it this way: pages are for non-chronological content, such as About, Contact, Services and legal notices. Posts are dated entries that show up in the blog and its feed. If the content will still be true next year and visitors will look for it in the navigation, make it a page.

    How do you create and publish a page?

    This is the standard workflow in the block editor, and it works the same on classic and block themes:

    1. In the dashboard, go to Pages > Add New Page. Some versions and hosts label the button Add New. The admin bar’s + New > Page opens the same screen.
    2. Type the title. WordPress builds the slug from it, so “Our Services” becomes /our-services/.
    3. Add the content as blocks: a Heading block for each section, Paragraph blocks for the text, and Image, Buttons or Columns blocks where they help. Text pasted from Word or Google Docs often brings stray spacing and fonts with it. Paste it as plain text, or type into the blocks directly.
    4. Open the settings sidebar (the panel icon at the top right) and set everything in the next section before you publish.
    5. Click Save draft, then Preview in a new tab. Check the page at desktop width and on a phone.
    6. Click Publish, then confirm by clicking Publish again.
    Adding a page in WordPress block editor with the page settings sidebar open
    The Page settings sidebar displays essential publishing attributes including status, URL slug, template, and parent hierarchy alongside the main canvas. · Source: easywpguide.com

    Which sidebar settings should you set before publishing?

    Five settings in the Page tab decide how the page behaves once it’s live:

    • Status and visibility. Published pages are public. Drafts, Pending Review, Private and password-protected pages are hidden from visitors. They are also left out of menus and the homepage selector.
    • Slug. Settle it now. If you change it after other pages, emails or ads link to it, those links break unless you add a redirect.
    • Parent. Choosing a parent makes this page a subpage and puts the parent in the URL, so a Board page under About becomes /about/board/. It doesn’t put the page into any menu.
    • Template. This controls the layout around your content. Leave it on Default unless you know you want something else. The template section below explains why.
    • Order. A number (1, 2, 3) that sorts pages in automatic page lists and in some themes’ default menus.

    Can you create pages from the Site Editor instead?

    Yes, on a block theme. WordPress.org’s Site Editor documentation describes Appearance > Editor > Pages, where the plus icon creates a draft. The benefit is that you edit the page inside its real template rather than on a blank canvas. The risk is that the header, footer and title belong to the template, not the page. WordPress locks those blocks and shows “Edit your template to edit this block.” If you unlock and change them, the change applies to every page that uses the template.

    How do you get the new page into the menu?

    You add it yourself. The menu doesn’t pick up new pages, and this is the most common “my page is missing” report on the WordPress.org forums and Reddit.

    On a classic theme

    1. Go to Appearance > Menus.
    2. Pick the right menu from the “Select a menu to edit” dropdown. Sites often have several, and editing the wrong one is a common mistake.
    3. In the Pages box, tick your page and click Add to Menu.
    4. Drag it into position. To create a dropdown, drag it slightly right, under its parent item.
    5. Under Menu Settings, check that the menu is assigned to a location your theme actually shows, usually Primary or Header.
    6. Click Save Menu. Nothing changes on the live site until you do.

    The same screen has an “Automatically add new top-level pages to this menu” checkbox. It only covers top-level pages and only works with classic menus, and it adds every new page, including ones you didn’t mean to show. Most sites are better off adding pages by hand.

    WordPress Appearance Menus screen for adding a new page to a classic theme menu
    Adding new pages to a classic navigation bar requires selecting them from the Pages panel and confirming your changes with the Save Menu button. · Source: wordpress.org

    On a block theme

    Go to Appearance > Editor, open Navigation (or open the header template and select the Navigation block), click the plus icon and add a Page Link to your page. Then save. One Reddit user described getting there by trial and error: “I had to access the template editor, edit the navigation element, and then I could add, reorder, and delete page links.” The Site Editor shows each menu item as a block, and you drag Page Links into one another to build a submenu. For more complex dropdowns, see our guide to building a WordPress drop down list.

    WordPress Site Editor Navigation block adding a page link on a block theme
    The Site Editor lets you configure menus directly on the canvas using the Navigation block rather than the traditional admin menu screen. · Source: make.wordpress.org

    One trap applies to both theme types. In a resolved WordPress.org thread, a site owner deleted their pages and recreated them under the same names, and the menu stayed empty. Deleting a page removes its menu item. A new page with the same title is a different page, so you have to add it to the menu again.

    How do you make the new page the homepage?

    Go to Settings > Reading, choose “A static page”, pick your page under Homepage and save. If you also want a blog, create an empty page called Blog, choose it as the Posts page, and WordPress will list your posts there. Only published pages appear in these dropdowns. If yours is missing, it’s probably still a draft.

    Why does the new page have no header or look different?

    The page has the wrong template. Many themes include a Landing, Blank or Canvas template that deliberately removes the header, footer and menu, which suits a campaign page and nothing else. In a WordPress.org support thread, a site owner getting ready for a promotion published a new page and found it had no menu. The page was using a Landing template, and switching it to Default fixed the problem. Check the Template field in the sidebar before you change anything else.

    If the template is right and the page still looks wrong, the problem is probably in the template itself: its width, spacing, sidebar or header. This is where adding a page turns into design work, and a change made there affects every page that uses the same template. If you’d rather hand that work off, SiteSelf’s page on design changes to an existing site describes the agent editing the styles and templates on your live site from a request you write in chat. If you want to do it yourself, theme customization that survives updates covers which layer to edit.

    How do you add a page with Elementor or another builder?

    Create the WordPress page first, then open it in the builder. With Elementor, that means Pages > Add New Page and then the “Edit with Elementor” button. Builders are common. HTTP Archive’s 2025 Web Almanac found that about 60% of WordPress sites use some form of page builder. Builders often have their own template and header settings, so the WordPress Template field may have no effect on what visitors see. If the builder won’t load or save, the problem is in the builder, not in page creation. Creating the page again usually just leaves you with duplicates.

    What about WooCommerce Cart and Checkout pages?

    They are ordinary WordPress pages, but WooCommerce ignores them until they’re assigned. A page called Cart does nothing until WooCommerce knows it’s the cart page. WooCommerce’s pages documentation sets out the process:

    • If the pages are missing, recreate them from WooCommerce > Status > Tools with the create-pages tool.
    • If you build one by hand, put the Cart or Checkout block on it, or put the shortcode ([woocommerce_cart], [woocommerce_checkout], [woocommerce_my_account]) in a Shortcode block. Pasted into a Paragraph block, the shortcode may not run.
    • Assign each one under WooCommerce > Settings > Advanced > Page setup, and assign the Shop page under Settings > Products.
    • Use a separate page for each function. WooCommerce warns that sharing one page causes incorrect redirects and broken payment gateways, and version 3.7 and later don’t let you do it.
    WooCommerce Page setup settings assigning cart and checkout pages in WordPress
    Selecting your designated Cart page from the Page setup dropdown establishes the functional link WooCommerce needs to direct shoppers. · Source: woocommerce.com

    Themes don’t come with these pages. The theme’s demo content can make it look as if they exist, which is what confused one store owner on r/woocommerce until they ran the Status tool and assigned the pages.

    What does a correct result look like?

    Open a private or incognito window, where you’re logged out, and check four things. The page loads at its URL. It appears in the menu on desktop and inside the collapsed mobile menu. It has the same header and footer as the rest of the site. Its links, buttons and forms work. Checking while logged in as an administrator doesn’t count, because you can see drafts and private pages that visitors can’t.

    What if it still doesn’t work?

    Work through the layers in this order. It goes from the cheapest check to the most invasive:

    1. Status. Open Pages > All Pages. If the page shows “Draft”, “Private” or “Password protected” next to its title, visitors can’t see it.
    2. The URL returns 404. Check the slug for typos and look for a post, category or plugin page with the same slug. Then go to Settings > Permalinks and click Save Changes without changing anything, which rebuilds the rewrite rules. Don’t switch to a different permalink structure on a live site. That breaks every existing URL.
    3. Old version showing. Clear your caching plugin, your host’s cache, any CDN such as Cloudflare, and your browser. Only blame the cache after you’ve ruled out status and menus.
    4. “Publishing failed. The response is not a valid JSON response.” The editor saves through the REST API, and this error means that request failed. Copy your content somewhere safe first. Then resave permalinks and deactivate plugins one at a time. In one WordPress.org case on Google Cloud, the fix was a server setting: Apache’s AllowOverride None had to become AllowOverride All.
    5. “Publishing failed. You are probably offline.” Practitioners usually trace this to an HTTP and HTTPS mismatch, where the WordPress Address and Site Address settings don’t match the SSL setup at the host or CDN.

    Stop and get help once a fix means changing server configuration, .htaccess or wp-config.php, or when you’ve switched to a default theme with all plugins off and the error is still there. At that point the problem is in hosting, not in WordPress. Host support can often fix a server-level error quickly. If your checkout is failing, don’t wait: get help straight away.

    Frequently asked questions

    How do I make a page appear as a dropdown under another page?

    Set the parent in the page’s sidebar so the URL is right, then nest the menu item under the parent in Appearance > Menus or in the Navigation block. The parent setting and the menu are separate, so you have to do both. Setting a parent never puts a page into a menu.

    Can I add a page straight from the Navigation block?

    Yes. In the block Navigation editor you can type a name that doesn’t exist yet and create the page there. It still has to be published before it shows up. It’s easy to end up with a blank published page this way, so add the content before you leave.

    How do I duplicate an existing page?

    WordPress core has no Duplicate link in the page list. You can open the page, use the editor’s options menu to copy all blocks, and paste them into a new page. A duplicator plugin does the same in one step. Either way, give the copy its own slug and title.

    Why can’t I find my new page in Google?

    Publishing doesn’t tell search engines anything. They find pages by crawling, which takes time and speeds up when the page is linked from your menu, footer or other pages. Also check that your SEO plugin hasn’t set the page to noindex.

    Should a developer create pages in theme files?

    No. Page content belongs in the database, created in wp-admin or with WP-CLI’s wp post create --post_type=page. Theme files hold templates, which are the layout that wraps the content, not the content itself.

    Can I add several pages at once?

    The dashboard creates one page at a time. WP-CLI, importers and some builders can create them in bulk. Bulk-created pages that are nearly identical give visitors nothing new and tend to do poorly in search, so only make pages that each have their own purpose.

  • Is there a difference between JPG and JPEG?

    Key takeaways

    • WordPress core maps jpg, jpeg and jpe to the same MIME type, image/jpeg, so thumbnails, srcset and editing work the same for both.
    • Renaming a HEIC, PNG or WebP file to .jpg does not make it a JPEG. Files like that get rejected by WordPress, show up blank or break bulk optimizers later.
    • If .jpg uploads but .jpeg does not, check the field or plugin allow-list first. Add both extensions, or use image/jpeg in a MIME field.
    • Don’t mass-rename old .jpeg files. The image stays the same but the URL changes, and links, caches and imports break.
    • The choices that change file size are compression, pixel dimensions and format. WordPress Core says AVIF can be up to 50% smaller than JPEG.

    No. .jpg and .jpeg are two extensions for one format. WordPress core maps jpg|jpeg|jpe to the MIME type image/jpeg. Mozilla’s MDN lists .jpg, .jpeg, .jfif, .pjpeg and .pjp as extensions for that same type. Rename a file from one to the other and the image is unchanged, down to the last byte.

    People keep asking because of what they run into. One spelling uploads and the other doesn’t, or a WebP plugin converts some photos and skips others. Real things cause those problems, and none of them is the extension. Most come down to a plugin, a form field or a server setting. The same pattern shows up in our guide to WordPress plugins that are not working.

    What actually decides a JPEG’s quality and size

    The quality and size of a JPEG come from the encoded image data. The filename has no part in it. The compression level, the pixel dimensions and the number of times the file has been re-saved all live inside the file. The extension is a label on the outside.

    JPEG is lossy. Each time it compresses, it throws away some detail, and editing and re-saving a JPEG again and again makes it worse. WordPress’s own “Image size and quality” documentation describes the trade: JPEG gives up detail for a smaller file, which suits photographs. No benchmark shows a quality, size or speed difference between the same file saved as .jpg and as .jpeg. Nothing about the format would create one.

    Why renaming a file is not converting it

    Renaming is fine between .jpg and .jpeg because both hold the same kind of data. Renaming across formats is where trouble starts. An iPhone HEIC photo, a PNG or a WebP renamed to photo.jpg is still a HEIC, PNG or WebP inside. Now its label is wrong.

    WordPress checks what a file actually is, not only what it is called. So a fake JPEG often fails at upload with “Sorry, this file type is not permitted for security reasons.” If one gets through, it can show up blank, or fail later when an optimization plugin tries to compress or resize it. Files half-converted by an online tool or an old export setting fail the same way.

    The fix is to open the original in an image editor, export a real JPEG and upload that. Don’t add ALLOW_UNFILTERED_UPLOADS to wp-config.php to force it in. That constant turns off file-type filtering for every upload on the site, and the broken file behind the error is still broken.

    WordPress upload error for a fake JPEG file saying the file type is not permitted
    WordPress inspects the actual contents of an uploaded file and rejects unauthorized formats with a security warning regardless of the file extension. · Source: www.wpbeginner.com

    Why a site accepts .jpg but rejects .jpeg

    When only one spelling fails, something between you and WordPress core is checking the extension against its own list. Core accepts both. A form plugin, a WooCommerce product upload field, a security plugin or a custom validator may not.

    Some WooCommerce extensions have you set allowed file types for each field. The documentation for All In One Files Upload for WooCommerce lists JPEG and JPG as separate options. If someone ticked one and not the other, the field rejects half your customers’ photos. You fix it in the settings, not in the file:

    • In a field that asks for extensions, allow both jpg and jpeg.
    • In a field that asks for MIME types, enter image/jpeg. That one type covers both spellings.
    • If you write upload code, check the file’s contents and MIME type, not just the characters after the dot.

    Sometimes the cause is a plugin bug. In a 2022 WordPress.org support thread, a user found that the Converter for Media plugin was converting their .jpg files to WebP but skipping .jpeg files that held the same data. The plugin’s author could not reproduce it. The user suggested renaming old .jpeg files to .jpg, and the author strongly advised against it. A later section explains why.

    Renaming the one file you are uploading can get you past a badly set up allow-list. It repairs nothing, so fix the setting.

    When both fail, the extension was never the cause

    If a small, ordinary JPEG with a simple name also fails, stop thinking about the extension. The error messages are vague (“HTTP error”, “The server cannot process the image”), but the causes follow a familiar order. The order below comes from practitioner reports, not from measured data:

    1. Pixel dimensions too large. On upload, WordPress creates several smaller copies of each image, plus any extra sizes your theme adds. A photo straight off the camera can run out of PHP memory during that step even after you compress its megabytes. Resize it before uploading. If Allowed memory size ... exhausted shows up in debug.log, see the memory fixes in our white screen guide. Raising WordPress’s limit does nothing if the server’s PHP limit is lower.
    2. Image library failure. The server processes images with Imagick or GD. If ImagickException: unable to read image data appears in the log, try switching to GD, stripping unusual EXIF metadata or re-exporting the file.
    3. A fake or corrupt file. See the renaming section above.
    4. Upload limits. PHP’s upload_max_filesize and post_max_size cap the size of an upload. On Nginx, client_max_body_size rejects large requests with a 413 before PHP ever sees them, so changing PHP alone won’t help. The displayed maximum on Media → Add New shows the PHP side.
    5. Plugin or theme conflicts. Test with the Health Check & Troubleshooting plugin, which Learn WordPress covers for conflict testing. Don’t switch everything off on a live store.
    6. Permissions or disk space. move_uploaded_file(): Unable to move '/tmp/...' usually follows a migration. Directories should be 755 and files 644. 777 is never the fix.
    7. Security rules. A 403 during upload often means a ModSecurity or firewall rule. Ask your host to whitelist that specific rule rather than turn the firewall off.

    One more: WordPress.com’s support docs note that “Unexpected response from the server” often means the upload worked anyway. Check Media → Library before you upload again, or you’ll end up with duplicates.

    If you’d rather not work through that list yourself, SiteSelf can track down the upload failure on your live site and report what it found and changed. Server limits, logs and file permissions need hosting (SSH) access, not just the connector plugin.

    WordPress Media Add New screen showing the maximum upload file size for JPEG uploads
    Although the Media Library displays a maximum upload limit governed by PHP, an upstream Nginx configuration can still reject large files before they ever reach it. · Source: www.wpkube.com

    Should you rename your existing .jpeg files to .jpg?

    No. Renaming is safe for the image and risky for the site. /photo.jpg and /photo.jpeg are different URLs. Posts with hardcoded image links, CDN caches, download links, product imports and other sites linking to your images all point at the old one. Linux servers also treat file paths as case-sensitive, so .JPG and .jpg can be two different files there.

    A mixed library looks messy but costs nothing. Pick one convention for new uploads, usually lowercase .jpg, and leave old files alone. If you really must rename something, update every reference to it and redirect the old URL.

    The image decisions that matter more

    Choosing between the two spellings changes nothing. These choices do:

    • JPEG or PNG. Use JPEG for photographs. JPEG cannot be transparent, so a “transparent background JPG” doesn’t exist. Logos, screenshots, line art and anything with sharp text belong in PNG or SVG. Keep the vector master file for a logo.
    • JPEG or WebP and AVIF. WordPress 6.5 added AVIF support, and the Make WordPress Core announcement says AVIF images “can be up to 50% smaller than JPEGs” at the same quality. “Up to” means best case, and your savings depend on the photo and the encoder. The usual approach is to upload JPEGs, let a plugin serve WebP or AVIF copies with JPEG fallbacks, and keep the originals.
    • Dimensions and compression. A 6,000-pixel photo in a 1,200-pixel column wastes bandwidth whatever its extension. Resize it before uploading, then compress it.

    Modern formats explain why a site can show .jpg, .jpeg, .webp and .avif files side by side. Those are copies made for delivery. They don’t mean the two JPEG spellings behave differently. One practical exception: WooCommerce’s mobile app does not support WebP, and its docs recommend exporting product images as .jpg or .png.

    WordPress Media Library showing JPEG originals alongside WebP and AVIF copies
    Comparing identical assets across formats reveals dramatic file size reductions when generating modern WebP and AVIF copies alongside standard JPEG files. · Source: instawp.com

    Frequently asked questions

    How do I convert a JPG to a JPEG?

    There is nothing to convert. If the file is a real JPEG, it is already both. Renaming it changes the label and the URL, not the image. You only need a real conversion when the file is actually another format, such as HEIC, PNG or WebP.

    Is JPG the same as JPEG 2000?

    No. JPEG 2000 is a separate standard with its own extensions, such as .jp2. It is not what a camera or phone produces when it saves a .jpg, and WordPress does not treat it as an ordinary JPEG.

    Does renaming .jpeg to .jpg reduce quality?

    No. Renaming leaves the image data alone. Quality drops when a JPEG is re-encoded, for example when you edit it and save it again or run it through a compressor at a lower quality setting.

    Does uppercase .JPG cause problems?

    It can, and the problem is the URL, not the image. On a case-sensitive server, photo.JPG and photo.jpg are different paths, so a link typed in lowercase can break. Stick to lowercase filenames for new uploads.

    Can I upload only WebP and skip JPEG entirely?

    You can, but most practitioners advise against it. Uploading JPEGs and letting a plugin create WebP or AVIF copies keeps a fallback for tools that don’t handle the newer formats, and lets you regenerate everything later. Test the fallbacks before you delete any originals.

  • How to embed a PDF in WordPress so it actually shows

    Key takeaways

    • The Embed block is for services like YouTube. For an uploaded PDF, use the File block, an iframe in a Custom HTML block, or a viewer plugin’s own block or shortcode.
    • Open the PDF’s URL in a private window first. If it returns a login page, a 404 or HTML instead of the file, no viewer will fix it.
    • Mobile browsers are the weakest point. Always keep a visible Open or Download link below the viewer.
    • If a browser can show a PDF, it has already downloaded it. Hiding the download button deters people but protects nothing. Paid files belong in WooCommerce’s protected uploads folder.
    • Search engines and screen readers handle the PDF separately from the page. Indexing is set with the X-Robots-Tag header, and a scanned PDF with no text layer can’t be read by assistive technology.

    Putting a PDF on a WordPress page takes about a minute. Getting it to display everywhere is the harder part: on phones, behind a cache, inside a tab, over HTTPS. When it doesn’t work, visitors see a bare link, a grey box or a viewer stuck on “Loading…” and assume the page is broken.

    This guide covers the methods in the order most sites should try them, then the failures people report most and how to fix each one. If you haven’t edited a block page before, start with how to edit pages in WordPress.

    Which embed method fits your PDF?

    For an ordinary public PDF, use the core File block. Add a plugin only when you need something the browser’s own viewer can’t give you.

    MethodUse it whenMain weakness
    File block with inline embedA public brochure, policy or price listRelies on the browser’s viewer, which is patchy on mobile
    Iframe in a Custom HTML blockYou need a size or title the block won’t setSame browser dependency; breaks on HTTP or preview URLs
    Viewer pluginYou need page navigation, zoom, mobile modes or view trackingMore scripts to exclude from caching, more updates, more to maintain
    Google Drive embedThe file already lives in Drive and changes oftenDepends on a third party and on sharing settings
    HTML page plus PDF downloadThe content matters, changes often or has to be trackedTakes the most work up front

    One common mistake to rule out: the generic Embed block is for content from third-party services like YouTube, according to WordPress.org’s Embeds documentation. If you paste a PDF URL into it, you’ll usually get “Sorry, this content could not be embedded.”

    How to embed a PDF with the File block

    You need an editor or administrator account on a site that uses the block editor. No hosting access is required.

    1. Open the page and add a File block. You can also type /file in an empty paragraph.
    2. Upload the PDF or pick it from the Media Library.
    3. In the block settings sidebar, find the PDF settings and turn on Show inline embed if it isn’t already on.
    4. Set a height in pixels. For a portrait document, 600 to 800 is a reasonable starting point. A small height like 200 cuts the document off.
    5. Keep the file name link and the Download button turned on. They are the fallback for any browser that can’t render the PDF inline.
    6. Above the block, write a sentence or two saying what the document is. Search engines and screen readers can read that text. They can’t read what sits inside the viewer.
    7. Update the page, then open it in a private window on desktop and on a phone.
    WordPress File block settings with Show inline embed turned on for a PDF
    Enabling the inline embed toggle unlocks the height control slider so visitors can browse the document directly on the page. · Source: wordpress.org

    The result should be a scrollable viewer at the height you set, with a working link and button below it. On many phones you’ll see only the link or the first page. That’s normal browser behaviour and the reason step 5 matters.

    How to embed with an iframe or a plugin shortcode

    When the File block isn’t enough, put an iframe in a Custom HTML block. Point it at a direct HTTPS URL for the file. The easiest way to get one is Media, then Library, then click the file and copy the File URL.

    <iframe src="https://example.com/wp-content/uploads/2026/09/price-list.pdf"
      width="100%" height="800"
      title="2026 price list (PDF)"></iframe>
    <p><a href="https://example.com/wp-content/uploads/2026/09/price-list.pdf">Open the price list (PDF)</a></p>

    The title is what a screen reader announces for the frame. “2026 price list” helps a listener. “PDF viewer” doesn’t. If you paste the iframe into a field that filters HTML, like a widget, a theme option or a paragraph block, WordPress may remove it without telling you. Custom HTML blocks and page builder code modules keep it.

    For a viewer plugin, use the plugin’s own block in the block editor and its shortcode everywhere else: the Classic Editor, builder text modules, widgets. PDF Embedder, which the WordPress.org directory lists at 300,000+ active installs, has both, and it renders the PDF on your own server without a third-party service:

    [pdf-embedder url="https://example.com/wp-content/uploads/document.pdf"]

    If you use Google Drive, the file has to be shared as “anyone with the link can view”. Use Drive’s own embed code, not the sharing link. A sharing link opens a preview page, not the PDF file. Don’t use Drive for private or regulated documents.

    When a viewer plugin is worth the upkeep

    A plugin earns its place when you need page-by-page navigation, zoom, a dedicated mobile mode, watermarks or view and download counts. Most plugins draw the PDF with JavaScript instead of the browser’s viewer, so it looks the same across browsers.

    That control has a cost. Each viewer adds scripts that your caching plugin has to leave alone, updates that can change how it behaves, and code that needs security patches. Flipbook viewers look good in a demo. They are also heavier, and some need extra server headers before they load at all. If one plain viewer covers your needs, stop there.

    Why your PDF shows a link, a blank box or “Loading…”

    Most failures come from the setup around the embed, not the embed tool. The order below comes from reading support threads, not from measured data, so treat it as a rough guide. Whatever you try, check the file URL first.

    The file URL doesn’t return a PDF

    Paste the PDF URL into a private window. You should see the document. If you get a login page, a 403, a 404, a redirect to the homepage or a security challenge, the viewer has nothing to show. In your browser’s developer tools, open the Network panel, reload the page and click the PDF request. The Content-Type should be application/pdf. If it isn’t, the fix is on the server: hotlink protection, a firewall rule or a membership plugin. Send your host the URL and the response you saw. Renaming the file won’t help.

    Browser Network panel showing a PDF response with Content-Type application/pdf for WordPress PDF embedding
    Inspecting the Network panel confirms whether your server is returning the required application/pdf content type header before troubleshooting the viewer. · Source: medium.com

    The wrong block or field was used

    Check for a PDF URL in an Embed block, an iframe removed by a filtered field, a shortcode in a field that doesn’t run shortcodes, or “Show inline embed” switched off. Moving the content into the right container fixes all four.

    A cache or minifier is serving stale or broken scripts

    A viewer that sits on “Loading…” usually means its JavaScript didn’t run. That happens a lot after an update, when a caching plugin or CDN still serves the old files. Purge the caching plugin, the host cache and the CDN, then the browser, and test again in a private window. If it still hangs, exclude the viewer’s script files from minification and combining. Plugins sometimes rename those files, and an exclusion written for the old names quietly stops working. To test for conflicts safely, follow the plugin conflict routine on a staging copy.

    HTTP, www and domain mismatches

    An HTTPS page that loads an HTTP PDF is mixed content, and browsers handle it inconsistently. In one wordpress.org thread, a PDF with “Show inline embed” turned on displayed only in Firefox. The fix was loading the file over HTTPS in an iframe. Some viewers also refuse files from a different origin: www versus no www, another subdomain, or S3 and CDN storage without CORS headers. Pick one HTTPS domain and update old URLs to match it.

    The viewer sits inside a tab, accordion or hidden section

    A viewer that loads while its container is hidden measures its own size as zero and stays blank when the tab opens. Give each PDF its own tab, use a plain accordion, or put the document on a separate page. The same happens with any container that has no set height.

    The phone can’t handle the file

    PDF Embedder’s mobile troubleshooting page says phones have less memory and stricter rendering, so large or complex PDFs can crash or show blank pages. Its advice: compress the file, flatten transparency and layers, re-export with common fonts, and give a revised file a new name such as brochure-v2.pdf so no one gets the cached copy.

    An update changed the behaviour

    Embeds that used to work can break after an update. After Gutenberg 17.2.0, one user reported that inline PDFs showed only the text link and Download button, as if the setting had been turned off. If embeds broke the same day as an update, look at that update first.

    What an embedded PDF doesn’t do

    It doesn’t protect the file. To display a PDF, the browser has to download it first, so hiding the Download button or blocking right-click only slows people down. WooCommerce’s downloadable products documentation says anyone with the direct URL can open a Media Library file. Paid files should be uploaded from the Edit product page so they go into the protected woocommerce_uploads folder. Avoid the “Redirect only” download method, because it reveals the file’s URL.

    It isn’t part of the page’s SEO. Google indexes the PDF as its own document. A noindex tag on the page doesn’t apply to the PDF. To keep a PDF out of search results, the server has to send an X-Robots-Tag header, as described in Google’s robots meta tag specification.

    It isn’t automatically accessible. An accessible page doesn’t make the PDF inside it accessible. A scanned PDF with no text layer is just an image to a screen reader. The PDF itself needs OCR (with the errors corrected), tags, a reading order, a title and a language. The W3C lists how to do this in its WCAG 2.2 PDF techniques.

    It isn’t free to load. A PDF of several megabytes on a homepage slows the whole page. Compress it, or show a thumbnail image that links to the file.

    For newsletters, catalogs and anything with prices that change monthly, practitioners often suggest skipping the embed. Publish the content as a normal page and offer the PDF as a download. The page works on phones, search engines can read it, analytics can track it, and editing it doesn’t mean exporting a new file.

    When to stop and get help

    Once you’ve checked the URL, the block settings and every cache layer, what’s left usually needs someone who can read response headers, CORS settings and minification rules, or change server configuration. Stop there if the failure appears only for logged-out visitors, only through the CDN, or only inside a page builder layout. If you’d rather hand off the rest of the work, SiteSelf takes on page and layout changes on your existing site on request through chat, then checks the live page and reports back.

    Frequently asked questions

    Can I embed a PDF in WordPress without a plugin?

    Yes. Use the File block with “Show inline embed”, or an iframe in a Custom HTML block that points to a public HTTPS PDF URL. Both rely on the browser’s built-in viewer. You get the document, but not the navigation, zoom or mobile mode a plugin adds.

    Why does the PDF work in the editor but not on the live page?

    The editor loads a fresh copy while logged in, and visitors get cached output. Purge the caching plugin, the host cache and the CDN, then check in a private window. If it still fails, compare the live page’s Console and Network panels with what you see in the editor.

    How do I embed a PDF in Elementor or Divi?

    Use the builder’s HTML or code module for an iframe, or paste the viewer plugin’s shortcode into a text module. Test the published page, not only the builder preview. Watch for viewers inside hidden sections or tabs, and remember the builder has its own cache to clear.

    Can I embed a PDF hosted on another site?

    Only if the viewer gets a direct link to the .pdf file and the other server allows it to be fetched. Some viewers accept only files from the page’s own domain. Others need CORS headers on the host. A viewer or preview URL from another service won’t work in place of the file.

    How do I gate a PDF behind a form?

    Put a form on a landing page and email a link to the file, not an attachment. If the file sits at a public Media Library URL, the gate is for show, because anyone with the link can skip the form. Store it somewhere that checks access.

  • How to edit WordPress in HTML at the right layer

    Key takeaways

    • Use a Custom HTML block for new snippets. Use Edit as HTML to change one existing block, and expect “This block contains unexpected or invalid content” if the markup stops matching what the block expects.
    • Scripts and iframes that disappear on save are usually removed on purpose. Users without the unfiltered_html capability have disallowed tags stripped by wp_kses(), and WordPress.com limits script, style, iframe and link tags to plugin-enabled plans.
    • Headers and footers live in the Site Editor on block themes and in child-theme templates on classic themes. Once the Site Editor saves a template, that saved version wins over the theme file.
    • WooCommerce templates are overridden by copying them into yourtheme/woocommerce/ without the /templates/ folder. A wrong path fails silently, and old copies go stale as WooCommerce updates.
    • The theme and plugin file editors in the dashboard save straight to the live site with no syntax checking, so back up first and use DISALLOW_FILE_EDIT to switch them off.

    WordPress is not a folder of HTML files. Your content is stored in the database, and your theme is PHP templates (classic themes) or block HTML templates (block themes) that build each page when someone requests it. What you see in View Source or Inspect Element is that finished output. You can’t save changes back to it.

    So before “how do I edit the HTML” comes “which part of the site produces this markup?” A snippet on one page, the site header, a WooCommerce cart layout and an Elementor section are four different jobs in four different places. Get the place right and most edits take minutes. Get it wrong and the change gets stripped on save, breaks the block, or disappears at the next update. If you only need to change page text, editing pages in the block editor covers it without touching markup.

    Which layer owns the HTML you want to change?

    Match the change to the layer that produces it. Choose the narrowest option that does the job: it is the easiest to test and the easiest to undo.

    What you want to changeWhere to edit itRisk
    Add an embed or snippet to one post or pageCustom HTML blockLow
    Adjust the markup of one existing blockEdit as HTML on that blockLow to medium (can break the block)
    See or fix a whole page’s markupCode editorMedium
    Header, footer, templates on a block themeSite Editor (Appearance, then Editor)Medium, applies site-wide
    Header, footer, templates on a classic themeCopy the PHP template into a child themeHigh, needs file access
    Shop, product or cart markupWooCommerce template override or hooksHigh
    A page built in Elementor, Divi or similarThe builder’s own HTML widgetDepends on the builder
    A script on every pageA header and footer plugin, or a child-theme hookMedium

    PHP never goes in any of the content routes. It belongs in a plugin, a snippets plugin or theme code.

    How to add HTML to one post or page

    Use the Custom HTML block. It stores your markup in the post content, renders it on the page and has a preview. WordPress.org’s Custom HTML documentation describes the steps:

    1. Open the post or page in the block editor.
    2. Click where the snippet should go, type /html and choose Custom HTML.
    3. Paste or write your markup.
    4. Switch to the preview and check it renders as expected.
    5. Click Update (or Save) and open the published page to check.
    Custom HTML block with markup in the WordPress block editor
    Entering markup directly into the Custom HTML block lets you preview and render styled elements within the WordPress editor. · Source: easywpguide.com

    Two mix-ups cause most “my HTML shows up as text” reports. Paste markup into a Paragraph block and WordPress displays the code as visible text. The Code block does the same thing on purpose, because it is for showing code to readers. Only the Custom HTML block renders markup.

    Don’t paste a full HTML document either. WordPress already outputs <!DOCTYPE>, <html>, <head> and <body>, so paste only the fragment you need.

    The block has been changing. WordPress.org’s documentation says WordPress 7.0 added separate editing areas for CSS and JavaScript. A Make WordPress Core post on WordPress 7.1 describes putting regular editable blocks inside a Custom HTML block: the static markup stays fixed, and the inner blocks can be edited in place but not moved around. That is useful when a client should change the words but not the layout.

    Editing one existing block with Edit as HTML

    Select the block, open More options (the three dots in the block toolbar) and choose Edit as HTML. Make the change, then choose Edit visually to switch back. WordPress.org’s More options page warns that after your changes the editor may no longer recognise the original block. The next section covers what that looks like.

    Seeing the whole page in the Code editor

    Open the editor’s More options menu at the top right, then Editor, then Code editor. You get the entire post as block markup, including the <!-- wp:paragraph --> comments that tell WordPress where each block starts and ends. Leave those comments alone. The Code editor is good for finding a stray tag. It is a poor place to write a page from scratch, and developers regularly complain that it normalises or strips markup they meant to keep. For hand-written layouts, use a Custom HTML block.

    If you use the Classic Editor

    Sites running the Classic Editor plugin edit HTML in the Text tab above the content box. Switching back and forth between Visual and Text can rewrite or strip tags, so finish your HTML work in Text and save from there.

    Why WordPress says “This block contains unexpected or invalid content”

    The block editor checks each block’s saved markup against the structure that block expects. If you edited a normal block’s HTML and it no longer matches, the editor shows this error. The live page often still looks fine. What breaks is your ability to edit that block visually.

    WordPress block editor showing the unexpected or invalid content error after editing HTML
    When WordPress detects a mismatch between saved markup and a block’s expected structure, the editor displays an invalid content notice alongside an option to attempt automatic recovery. · Source: pixelgrade.com

    WordPress.org’s block error guide lists the recovery options. Each one gives something up:

    • Convert to blocks (or Attempt Block Recovery) keeps the block controls but can throw away custom markup that doesn’t map to the block. That is often the exact change you just made.
    • Convert to Custom HTML keeps your markup exactly, but the block loses its visual controls.

    Third-party block plugins make this worse. A WordPress.org support thread describes adding one paragraph inside an Advanced Columns container: the editor crashed, and neither recovery option kept the change. The rule that follows: if you plan to hand-write markup, start with a Custom HTML block instead of editing inside someone else’s block.

    Why your script or iframe disappeared when you saved

    Usually WordPress removed it on purpose. On a self-hosted site, users without the unfiltered_html capability have disallowed tags stripped by wp_kses() when they save, as the Custom HTML documentation explains. On a normal single site, administrators and editors have that capability and authors and contributors do not. On WordPress.com, the support documentation limits script, style, iframe and link tags to plugin-enabled plans.

    Pasting the same script again won’t help. Pick a supported route instead:

    • The service’s own WordPress plugin or embed block, if it has one. Disqus, Calendly and most video hosts do.
    • A header and footer plugin for site-wide scripts such as analytics or chat widgets.
    • A hook in a child theme or snippets plugin, for developers.

    Widening wp_kses_allowed_html or giving untrusted users unfiltered_html works, and it also removes a security boundary. Anyone with that capability can put JavaScript on your pages. Save it for a last resort, done by someone who knows the risk.

    How to change header, footer and template HTML

    Don’t do it in post content. Where you do it depends on your theme type.

    Block themes. If Appearance shows an Editor item, you have a block theme. WordPress.org’s Site Editor documentation says the Site Editor only appears when a block theme is active. The header and footer are template parts in there, and the Site Editor has its own Code editor. One trap catches developers: once someone saves a template in the Site Editor, WordPress stores that version in the database, and it overrides the parts/header.html file in the theme. Edit the file afterwards and nothing happens, with no error. Either make the change in the Site Editor, or reset the saved template so the file takes over again.

    Classic themes. Copy header.php, footer.php or the page template from the parent theme into a child theme and edit the copy. If you edit the parent theme, the next theme update overwrites your change. Our guides to editing the WordPress footer and theme customization that survives updates go through both theme types step by step.

    WordPress Site Editor listing header and footer template parts for HTML edits
    The WordPress Site Editor organizes structural areas like the header and footer into dedicated template parts rather than standard page content. · Source: developer.wordpress.org

    How to change WooCommerce markup

    WooCommerce has its own override path, and it fails silently if you get it slightly wrong. WooCommerce’s template structure documentation says to copy the template into a woocommerce folder in your child theme, keeping the folder structure but dropping the templates folder:

    wp-content/plugins/woocommerce/templates/cart/cart.php
    becomes
    wp-content/themes/your-child-theme/woocommerce/cart/cart.php

    If the path is wrong, WooCommerce quietly uses its default template. If your theme contains a woocommerce.php file, you can’t override archive-product.php this way. Overrides also go stale: when WooCommerce changes a core template, it flags your copy as outdated, and an old copy can be missing hooks that newer extensions rely on. For small changes such as moving or removing an element, WooCommerce’s actions and hooks survive updates better than copying a whole template. Write down every override you make.

    What if the page is built with Elementor, Divi or another builder?

    Then the builder owns the markup. It stores the layout in its own data, often JSON, and generates the HTML from that. Editing the output directly either does nothing or corrupts the builder’s data. Use the builder’s HTML widget or element for snippets, and change attributes like nofollow in the builder, menu or SEO plugin that adds them. Downloading the page source, editing it and uploading it over FTP never works on WordPress, builder or not.

    When should you edit theme files directly?

    Only with a backup, and ideally on a staging copy. WordPress’s Advanced Administration Handbook says the built-in Theme File Editor and Plugin File Editor save straight to the live site, don’t have advanced syntax checking or line numbers, and need the files to be writable (permission 604 at minimum). It recommends editing files offline in a text editor, never a word processor, which changes straight quotes into curly ones and breaks the code.

    One missing semicolon in a PHP file can white-screen the site and lock you out of the dashboard. That is why many sites turn the editors off in wp-config.php:

    define( 'DISALLOW_FILE_EDIT', true );

    Then edit over SFTP or your host’s file manager, in a child theme, with a copy of the original file saved. If a file edit has already taken the site down, follow our recovery steps for a white screen.

    Why you saved the edit but nothing changed

    Check these in order before you touch the markup again:

    1. Wrong target. You edited the page when the element comes from the header template, or you edited a theme file when the Site Editor’s database copy wins.
    2. Cache. Purge the page cache in your caching plugin, your host’s cache and any CDN, then load the page in a private window.
    3. Logged-in view. Some caching and optimisation plugins treat logged-in users differently. Check the page logged out.
    4. Stripped on save. Reopen the block. If your tag is gone, go back to the sanitisation section.
    5. Builder ownership. The builder regenerated its markup over yours.

    People often “fix” markup that was already right and break it, when the real problem was a stale cache.

    How to check the result and undo it

    Check the live page, not the editor preview. Theme CSS, plugin output and caching all come after the editor. Look at it on a phone-sized screen, click every link and button you added, and make sure hand-written HTML stays accessible and crawlable. Use real <a href> links rather than clickable <div>s, real <button> elements, alt text on meaningful images and alt="" on decorative ones, and <label> elements on form fields. The W3C Nu HTML Checker catches unclosed tags and invalid nesting.

    To undo a content edit, use revisions. WordPress.org’s revisions documentation explains that every saved draft or update is recorded. Open Revisions in the post settings sidebar, drag the slider to the version before your edit, compare the changes and click Restore This Revision. Revisions only cover post content. Template, WooCommerce and file edits need your backup or the saved copy of the original file.

    When to stop and get help

    Content HTML in one post is a reasonable job to do yourself. Stop when the change starts touching PHP files, WooCommerce templates, a script that keeps getting stripped, or a block error that recovery won’t fix. At that point you’re not editing HTML any more. You’re diagnosing, staging and testing, and a mistake takes down a live page. If you’d rather describe the change than find the layer, SiteSelf handles website edits through chat: content changes go through the SiteSelf Connector plugin, template and file changes need hosting access, and pages owned by a visual page builder are refused with the reason.

    Frequently asked questions

    Can I edit my site permanently with Inspect Element?

    No. Inspect Element changes only the copy of the page in your own browser, and it resets when you reload. It is still useful for finding which element and CSS class you need, so you know where the real edit belongs.

    Can I put PHP in a Custom HTML block?

    No. WordPress doesn’t run PHP stored in post content. Put PHP in a snippets plugin, a small custom plugin or a child theme’s functions.php.

    The Edit as HTML option has disappeared. Why?

    Usually a plugin conflict. In one WordPress.org support case, the option came back as soon as the GenerateBlocks plugin was deactivated. Check the browser console for errors, then deactivate plugins one at a time, on a staging copy if you have one.

    Can I edit HTML on WordPress.com?

    You can add content HTML with the Custom HTML block on any plan. According to WordPress.com’s support documentation, script, style, iframe and link tags need a plugin-enabled plan, and theme file access depends on the plan too.

    Should I edit the parent theme or make a child theme?

    Use a child theme, or the Site Editor on a block theme. The next theme update overwrites parent-theme edits. Our guide to editing themes without losing work covers setting up a child theme.

    Is it fine to build whole pages out of Custom HTML blocks?

    It works, but it becomes hard to maintain. The next editor can’t change a heading without reading code, and nobody remembers what each block does. Use Custom HTML for snippets, and use patterns, templates or the 7.1 editable inner blocks when the structure should stay fixed.

  • What a hello bar for WordPress is and how to add one

    Key takeaways

    • Three products share the name: the hosted service at HelloBar.com, the Hello Bar Popup Builder plugin that loads its script, and any native notification bar plugin. Elementor’s Hello theme and the WordPress admin toolbar pollute the search results on top of that.
    • The official plugin designs nothing. WordPress.org lists Hello Bar Popup Builder at 3,000 active installations, a 32% rating from 7 ratings, last updated 2026-06-04 and tested up to WordPress 7.0.5.
    • If you want the bar without an external account, My Sticky Bar is in the same directory at 100,000 active installations and a 98% rating from 1,198 ratings, tested up to 7.1.1.
    • A bar that never appears is usually cache. Purge the caching plugin, the host cache, the CDN and the object cache, then test logged out in a private window before you touch anything else.
    • A bar renders on every page, so an injection flaw in one reaches every visitor. CVE-2026-1042, announced in January 2026, reports stored cross-site scripting in a plugin named WP Hello Bar.

    Someone wants a strip across the top of the site. Free shipping until Sunday, a webinar link, a notice that the shop is closed for a week. The message takes two minutes to write. Then the search for a hello bar for WordPress returns a hosted service, a plugin that designs nothing, a dozen announcement bar plugins and a page builder theme called Hello.

    That is most of the problem. The rest is integration: cache layers, a conflicting plugin, a theme that swallows the markup, testing while logged in as an administrator. Almost nothing that goes wrong with a bar is about the bar itself, which is why our guide to fixing WordPress plugins that are not working reads like a hello bar troubleshooting guide.

    Three different things get called a hello bar

    Work out which one you have before you read any advice, including advice in a support thread with “hello bar” in the title.

    • Hello Bar, the hosted service. You build the bar in an account at HelloBar.com, and it appears on your site through a JavaScript snippet. It works on any site, WordPress or not. The campaign, the targeting rules and the reporting live in the vendor’s dashboard, not in your database.
    • Hello Bar Popup Builder, the WordPress plugin. A connector published in the WordPress.org directory under the author name telepathy. Its description is plain about the job: add a popup to your WordPress site with the official Hello Bar plugin. It has no bar editor.
    • Any WordPress notification bar plugin. My Sticky Bar, HashBar, Easy Notification Bar, Welcome Bar and others. These are self-contained: the bar is built in wp-admin, stored in your database and rendered by your site.
    • Not a bar at all. Elementor’s Hello theme and the WordPress admin toolbar both match the phrase and neither is a notification bar.

    The collision is not theoretical. A WordPress.org thread asking how to add “a hello bar” to the header turns out to be about the Hello theme. An Elementor GitHub issue about clicking “Hello” is about the admin bar creating a draft page. Searches on Reddit and WordPress Stack Exchange for hello bar problems mostly return admin toolbar questions and actual bars that serve drinks. If a thread does not name the plugin slug or HelloBar.com, assume it is about something else.

    One more thing the silence tells you: there is very little public practitioner discussion of Hello Bar on WordPress. That is not evidence it works well or badly. It means you will be relying on the vendor’s own material and on generic WordPress diagnosis, so it pays to know which is which.

    Why the official plugin gives you nothing to configure

    Because it is a pipe, not a product. You create and style the bar at HelloBar.com, then the plugin puts the service’s code on your pages. The changelog records the shape of that job: version 0.5 changed the integration from manually entering a JavaScript tag to entering only an API key, version 0.6 fixed a bug where the API code would not save, and version 0.2 fixed duplicate deployment scripts when the header deployment option was selected. Nothing in there is about designing a bar.

    The directory signals for that connector are thin. WordPress.org lists Hello Bar Popup Builder at 3,000 active installations, a 32% rating from 7 ratings, last updated 2026-06-04 and tested up to WordPress 7.0.5. Read that carefully before you draw a conclusion: 7 ratings is far too small a sample to call a quality measure, and 3,000 installs counts the branded connector only. Plenty of Hello Bar users paste the snippet through a script manager or into the theme and never install this plugin.

    The plugin listing also says Hello Bar is “trusted by over 600k websites”. That is publisher copy inside a readme file, not a WordPress.org install count, and it does not say how many of those sites run WordPress. Treat it as marketing.

    WordPress.org plugin directory page showing install count and rating for a notification bar plugin
    The WordPress.org Plugin Directory highlights plugin popularity through download counts, offering a crucial indicator of reliability that often speaks louder than any description. · Source: www.sitepoint.com

    The maintenance signal is worth more than the rating. Being tested up to 7.0.5 while actively maintained plugins in the same category are tested to 7.1.1 tells you about cadence, not breakage. For code that renders on every page of your site, cadence matters.

    If you want the hosted service but not the branded connector, Header Footer Code Manager exists for exactly this: it adds tracking snippets, conversion pixels and other third-party scripts to the header or footer. It is a general script manager rather than a documented Hello Bar path, so test it on staging first and keep the snippet somewhere you will find it again.

    How to put a bar on the site, both ways

    You need an administrator account in wp-admin for either path, plus a Hello Bar account for the hosted one. Do it on staging if you have staging, and take a backup if you do not.

    The hosted path

    1. Create the bar in your HelloBar.com account, set its message, link and display rules, and publish it. A plugin with no published bar behind it shows nothing.
    2. Install and activate the connector plugin in Plugins, then Add New, or install the snippet through a script manager instead. Pick one method and only one.
    3. Paste the API key or site snippet into the plugin settings and save. Reload the settings screen and confirm the value is still there.
    4. Purge every cache layer you run, then load the site in a private window.

    The native plugin path

    1. Install a bar plugin from the directory. My Sticky Bar is the best-evidenced option in the category: 100,000 active installations, a 98% rating from 1,198 ratings, last updated 2026-09-15 and tested up to WordPress 7.1.1. It also handles sticky headers, which is where bar plugins usually collide with themes.
    2. Write one message with one action. Two links in a bar is one too many.
    3. Set placement, dismissal behaviour and which pages it appears on before you publish, not after.
    4. Check the result on a phone, on a page with a sticky header, and on a page with a cookie notice already at the top.

    A correct result: the bar appears on the pages you targeted, logged out, in a private window, on a second device. It does not cover the logo, the mobile menu or the first line of content, and dismissing it makes it stay dismissed on the next page.

    Announcement bar across the top of a WordPress site above the header
    This clean announcement bar clearly communicates a single, time-sensitive message without cluttering the main content. · Source: www.rocketspark.com

    Why the bar is not showing

    There is no Hello Bar error message. The normal symptom is silence: the bar simply is not there. Work the causes in this order, which reflects how often each one turns up in practitioner guidance rather than a measured survey. The times are rough.

    1. Cache, at every layer. The old HTML or the old script is still being served. Purge the caching plugin (WP Rocket, W3 Total Cache, LiteSpeed Cache), then the host or server cache, then the CDN (Cloudflare, Varnish), then the object cache, then your browser. Five to thirty minutes. The way to waste an afternoon is to clear the browser cache only and conclude the install failed. The same ordering applies to a font change that will not appear.
    2. The setup is incomplete. Plugin active but no bar published in the account, key pasted with a trailing space, targeting rules that exclude the page you are testing. Ten to thirty minutes to re-walk the steps.
    3. You are testing logged in. Admin sessions, cookie state and display rules all behave differently for an administrator. Test logged out, in incognito, in a second browser, on a phone. Five to twenty minutes, and it costs nothing to do first.
    4. The script is deployed twice. Plugin deployment plus a manually pasted copy in the theme header gives you two bars, and older releases of the connector inserted the script twice on their own. Remove one copy.
    5. Plugin conflict. Deactivate everything else, confirm the bar works alone, reactivate one at a time and reload between each. Caching, optimisation, security, JavaScript management and page builder plugins are the usual suspects. Thirty to ninety minutes on a small site.
    6. Theme or builder conflict. Switch temporarily to a default theme such as Twenty Twenty-Four. If the bar appears there, the problem is your theme’s header output, its JavaScript, or a sticky element layered over the bar. Thirty minutes to two hours.
    7. Stale versions. Update WordPress, the theme and the plugin, then check the PHP version in your host’s control panel. Updating PHP while leaving an old plugin release in place changes nothing, because the compatibility work happened in the plugin.
    8. Damaged files. Delete the plugin and reinstall it from Plugins, then Add New, or replace the folder under /wp-content/plugins/ over SFTP.
    9. Account or licence. Confirm the hosted account is active and the snippet is the current one.
    WordPress caching plugin settings screen with the purge cache option
    This caching plugin interface highlights the diverse cache layers, from plugin-specific to server and memory caches, that may need purging to resolve display problems. · Source: wordpress.org

    Update the plugin, do not roll it back

    The instinct after a bad update is to go back to the version that worked. For this plugin the changelog argues the other way. Version 1.5 set a PHP 7.4 minimum, 1.5.1 added PHP 8.x compatibility along with security and URL handling improvements, 1.5.2 was security fixes, and 0.6 fixed the API key that would not save. Rolling back hands those bugs back to yourself.

    When to stop and get help

    Stop if the dashboard itself goes down. A fatal error from a conflict can lock you out, and the recovery is done over SFTP: rename /wp-content/plugins to /plugins_old to force everything off, then rename it back and re-enable plugins one at a time. If that sounds like a bad evening, it is the point to call your host or a developer. Also stop if the failure is on the vendor’s side, if your host runs a server cache you cannot purge from wp-admin, or if the site is a store taking orders while you experiment.

    What you are trading for the hosted version

    The hosted service is not selling you a strip of text. Any of a dozen free plugins will draw that. It sells campaign management: targeting by geography, device and referral source, scheduling, split testing and reporting across more than one site. Those are the vendor’s feature claims, and they are the reason to accept the dependency, if you accept it.

    What you give up is control of code that runs on every page. Three things follow.

    Performance is unmeasured. The product documentation says it does not affect site speed. No independent benchmark exists to check that. A remotely loaded script that renders visible content at the top of the viewport is exactly where render blocking and layout shift live, so measure it on your own site with the bar on and off rather than trusting either side of the argument.

    Security reaches every visitor. In January 2026 the CVE programme announced CVE-2026-1042, stored cross-site scripting in a WordPress plugin named WP Hello Bar, via the digit_one and digit_two parameters. Note the name: WP Hello Bar is not obviously the same plugin as Hello Bar Popup Builder, and those parameter names suggest a countdown feature that does not appear in the Popup Builder changelog. Check the exact plugin slug you have installed against Wordfence or the CVE record before you assume you are affected, and before you assume you are not.

    Pricing is not what review sites say it is. Three 2026 review pages report two incompatible monthly schedules for the same plans. A free tier is consistently reported. Read the current prices from the vendor, not from an affiliate review.

    What changes when the bar is someone else’s job

    A bar is a small, reversible, high-visibility change, which makes the coordination around it absurd. Writing the message takes two minutes. Deciding where the markup goes, checking it against a sticky header, testing it logged out on a phone and taking it down again is what turns a ten-minute job into a ticket.

    SiteSelf is an AI agent for existing WordPress sites: you describe the change in chat, it does the work on the live site, checks the result and reports what it changed. Bars sit squarely in design changes on an existing site.

    Example request: “Add a bar across the top of every page: Free delivery on orders over 50 until Sunday, dark green background, white text, linking to /shop. Make sure it does not cover the mobile menu.”

    What happens next: the agent looks at what the site already has, either a bar plugin that is installed or the theme’s own header, makes the change there rather than adding a fifth plugin, then fetches the changed page and reports what it did and what it checked. Settings and content work runs through the SiteSelf Connector plugin from the WordPress.org directory. Theme templates, CSS and a snippet in the header need hosting access over SSH, so say which you can give.

    The limits are worth stating plainly. If the page is owned by Elementor, Divi or Beaver Builder, the work is refused at the moment it is attempted, with the reason. Nothing runs on a schedule, so “take it down on Monday” is a second message on Monday. Campaigns that live in a vendor dashboard such as HelloBar.com stay there: third-party systems are read at most, and nothing is written to them. Before a change, the agent says what is about to change and whether it can be undone, and what it did is recorded.

    Frequently asked questions

    Can I add a hello bar without writing code?

    Yes, on both paths. The hosted service is built around pasting a key or a snippet, and native bar plugins are configured entirely in wp-admin. Code only enters the picture if you want the bar inside a custom theme header or need CSS to stop it colliding with a sticky menu.

    Is Hello Bar free?

    A free Starter tier is reported consistently by third-party review pages, with paid tiers above it. Those same pages disagree with each other about the paid prices, so read the current numbers from the vendor before you plan around them.

    Why does my bar appear twice?

    Two copies of the script. Usually the plugin is deploying it and someone has also pasted it into the theme header or a code manager. An old version of the connector plugin also duplicated the script on its own when the header deployment option was used, which version 0.2 fixed. Use one deployment method and update the plugin.

    Why does it show on one page but not another?

    Either the display rules exclude that page or that page is being served from cache. Check the targeting rules first because it takes ten seconds, then purge the cache for that URL and reload it in a private window.

    Does a bar work with WooCommerce and Elementor?

    No verified compatibility list exists for Hello Bar specifically. In practice the risk is layout rather than function: bars, sticky headers, cookie notices and builder-rendered headers all compete for the same strip of screen. Test on a product page and on a builder page before you announce the campaign.

    Is a bar plugin safe to install?

    Judge it the way you would any plugin that outputs on every page: check the active install count, the rating volume, the last updated date and whether it is tested against a current WordPress release, then look the slug up in a vulnerability database. A bar is a high-exposure surface, since whatever it renders reaches every visitor.

  • Theme customization in WordPress that survives updates

    Key takeaways

    • Classic themes are customized at Appearance then Customize. Block themes use Appearance then Editor, and WordPress.org’s documentation says the Site Editor only appears when a block theme is active. A missing Customize link usually means you are on a block theme.
    • Presentation belongs in the theme, behaviour belongs in a plugin. Anything that has to survive a theme change, not just a theme update, should never live in theme files.
    • “My change did not appear” is more often a stale cache layer or a save request that failed than a CSS problem. Open the browser Network tab before you reach for !important.
    • A child theme only protects you if the style.css header names the parent folder exactly and the parent stylesheet is loaded properly. Improperly linked child themes and wrong wp-content permissions are a recurring cause of failed customizations.
    • No public, sourced price range for theme customization exists. Buy a paid audit and a written spec first, then ask for a fixed price, because revision loops cost more than the hourly rate difference.

    A change written straight into a parent theme’s footer.php lasts until the next theme update replaces that file. A change made in the Customizer lasts until you switch themes. A change made inside a page builder lasts until you stop using the builder. Theme customization in WordPress is not one task. It is a decision about which layer holds the change and how long you need it to hold.

    Two things go wrong, and they look different from each other. Either the change vanishes, quietly, weeks later during an update. Or the change takes the front end down now, with a critical error naming a file you have never opened. The methods below are ordered by how much they can break, and the diagnosis section is ordered by how often each cause actually turns up.

    If what you want is the step-by-step for working in theme files themselves, that is covered separately in the guide on how to edit themes in WordPress. This piece is about choosing the layer and recovering when the change does not stick.

    Match the change to the layer that should hold it

    The single best architectural rule from practitioners is short: presentation belongs in the theme, behaviour belongs in a plugin. If a tracking snippet, a shortcode, a custom post type or a form handler lives in functions.php, it dies the day someone changes theme. That is not a theme update problem, and a child theme does not solve it.

    What you are changingWhere it belongsWhat it survives
    Logo, colors, menus, site identityTheme settings: the Customizer, or Styles in the Site EditorUpdates to the same theme. Not a theme switch.
    One spacing fix, a hover state, a scoped tweakAdditional CSS, or per-block custom CSSUpdates. Additional CSS is stored per theme.
    Typography, spacing and color as a systemtheme.json in a child theme, or Styles in the Site EditorUpdates, and new pages inherit it.
    Template markup, WooCommerce product layoutA child theme, overriding only the file you needUpdates, but you now own that file forever.
    Behaviour that must outlive the themeA small site-specific plugin or a snippets pluginTheme updates and theme switches.
    The theme fights you at every stepA different theme, or a rebuildNothing. This is the expensive answer, so be sure.

    The working heuristic: use the least powerful tool that solves the problem. A promotional button color does not need a template override. A publisher standardising article typography across every template does need a system, not thirty one-off rules. Solving the same design problem three different ways in three places is how maintenance debt starts.

    Classic theme or block theme decides where you work

    Classic themes are customized at Appearance then Customize. WordPress.org’s documentation describes the Customizer as arriving in WordPress 3.4, with sections including Site Identity, Colors, Menus, Widgets and Additional CSS, and a live preview before you publish. Themes add their own sections here too, often under a name like Theme Options.

    Block themes are customized at Appearance then Editor. WordPress.org’s documentation says the Site Editor is only available when a block theme is installed and active. That single sentence answers the most common confusion in this whole subject: if Appearance then Customize is missing, you are almost certainly on a block theme, and the settings you are hunting for are in Styles or in a template.

    WordPress Site Editor Styles panel used for block theme customization
    The Styles panel within the WordPress Site Editor provides comprehensive controls for site-wide design elements like colors, centralizing customization for block themes. · Source: wordpress.org

    Be ready for the block model to feel less inspectable than it looks in marketing. Experienced builders report the same short list of frustrations: block boundaries are hard to see without hovering, the code editor fills with inline styles and JSON-like data, changing something as small as a block background color can leave escaped CSS variable names elsewhere, and selecting blocks lags while the canvas re-renders. The common responses are the old ones, a child theme plus custom CSS, or a move to a page builder. The WordPress developer blog’s February 2026 post lists per-block custom CSS among the changes arriving with WordPress 7.0, which takes some pressure off the second choice.

    Page builders are a real option for marketing pages and a real dependency everywhere else. Support threads show builder features that cannot be fully switched off because no option or hook exists, plugin updates that add dashboard menu items nobody asked for, and a version bump breaking icons in the Customizer. None of that makes those products unreliable. It does mean your design work becomes coupled to that plugin’s release schedule.

    Child theme rules that decide whether the safeguard holds

    WordPress’s Theme Handbook describes a child theme as a way to modify an existing theme without directly editing that theme’s code, and walks through creating the folder, creating style.css, activating it, then loading the stylesheet and using functions.php. Two details do the actual work: the Template line in the child’s style.css header has to match the parent theme’s folder name exactly, and the parent stylesheet should be enqueued from functions.php rather than pulled in with @import.

    The safeguard is also a failure source. Practitioners report improperly linked child themes and wrong wp-content permissions as recurring reasons customizations do not apply, alongside files uploaded to the wrong installation. If your child theme “does nothing”, check the parent folder name, the file paths, and whether the upload actually reached production before you rewrite any CSS.

    Keep the copying minimal. Override one template, not the parent’s whole structure. Every duplicated file stops receiving the parent developer’s bug fixes and markup changes the moment you copy it. Prefer hooks and filters where the parent theme exposes them. For stores, WooCommerce’s developer docs cover overriding templates through a theme and keep a separate page on fixing outdated templates, which is the mechanism that tells you when a copied file has drifted behind the plugin.

    Existing modifications first, child theme second. The sequence practitioners recommend is: document or back up what has already been changed, restore the original theme, create the child theme, then reapply the customizations inside it. Budget hours for this, not minutes. And do not do it live on a site taking orders. Staging that mirrors production is the one operational rule the community data agrees on without argument.

    When the change does not appear, diagnose in this order

    The same symptom has at least five causes, and they are not equally likely. Work down the list rather than guessing.

    1. Stale output, held somewhere you did not clear. This is the most frequently reported cause by a distance, and the mistake is rarely “forgot to clear the cache”. It is clearing only the browser while the old copy sits with the host, the CDN, or the builder’s generated CSS file. Publish again, purge browser, WordPress cache plugin, host and CDN, then regenerate CSS and JavaScript assets. Then confirm the page, domain, template and file you edited are the ones being served. Staging URLs and duplicated templates absorb a lot of wasted afternoons.
    2. The save never happened. A failed or blocked save looks exactly like a caching problem. Open the browser Network and Console tabs and watch the request when you press Update. A security rule at the host rejecting the request, or a rejected JSON payload, produces a silent non-change. Repeatedly pressing Update is the anti-pattern here.
    3. A plugin conflict, usually a builder or a customization plugin. Confirm a current backup, enable troubleshooting mode, disable plugins, test on a default theme, then reactivate one component at a time until the fault returns. Reactivating everything at once tells you nothing. Stacking !important on top of an unidentified conflict makes the eventual fix harder. The isolation process is written out in more detail in the guide to WordPress plugins that are not working.
    4. Theme or plugin code that throws a fatal error. Here you get evidence: a stack trace naming a file and a line, such as a Customizer failure inside a theme’s own WooCommerce options file. Follow the trace to the component, then disable or update that component. Do not patch the named file reflexively, because it may simply be the last file accessed before a hosting-level failure. If the front end has gone blank, start with the recovery steps for a WordPress website white screen.
    5. Server configuration wearing a theme costume. PHP version, memory and execution limits, file permissions, firewall and ModSecurity rules, and settings like allow_url_fopen cannot be fixed inside the theme. Builder vendors send people to their host for exactly these checks. If you have isolated the fault to none of the above, escalate rather than keep editing CSS.
    WordPress critical error message after a theme customization change
    This critical error message signals a fatal issue on your WordPress site, often pointing to a specific component that needs disabling. · Source: www.wpbeginner.com

    If the dashboard itself is unreachable after an update, rename wp-content/plugins in the host’s file manager to get back in, then restore the folder and deactivate plugins individually. Do not edit files in /wp-admin or /wp-includes, and do not patch core as a first response. Those changes are undone by the next core update and hide the real cause in the meantime.

    What theme customization should cost, and where the money goes

    There is no defensible published price range, and anyone quoting one is quoting a forum comment. What community threads do agree on is the shape of the waste. Very cheap work returns in revision loops, sometimes five rounds of them. Expensive work may include strategy, responsive testing, integrations and project management that never appear on the invoice as line items. Price alone does not tell you which one you bought.

    The workflow that reduces the risk on both sides: pay for an audit, write down the design changes you want with a mockup, then ask for a fixed price against that spec. Clear specifications cut iteration more than any hourly rate negotiation does.

    Two purchase decisions deserve more scepticism than they get. A commercial theme that looks close to your design can still be expensive, because you end up paying a toll against its structure, CSS, templates and hooks on every change. And a theme generated by AI to save the cost of a licence is only a saving if you can personally read, debug and update the code through PHP and WordPress version changes. A theme can look finished while quietly accumulating technical debt.

    What changes when you hand the work to an agent

    The reason a small design change costs what it does is rarely the change. It is the coordination: describing it, finding someone, waiting for the queue, reviewing a staging link, deploying. Changing the button color on a services page should not need three people and a window.

    Example request: “Our services page buttons are the old teal. Change them to brand navy #12224A everywhere they appear, and tighten the gap between the page heading and the first section on mobile.”

    SiteSelf works on your existing WordPress site through chat. For that request it would find where the button color is actually defined, global styles, a theme setting, or a stylesheet rule, apply the change in that layer rather than pasting an override, say what is about to change and whether it can be undone before it acts, then fetch the changed page and report in plain language what it did and what it checked. The work is recorded. Content and settings work goes through the SiteSelf Connector plugin from the WordPress.org directory; touching theme files, CSS files or templates needs hosting access over SSH. That kind of WordPress design change through chat is the same category of task described above, just without the queue.

    The honest limits matter as much. Verification today is a fetch of the changed page and a written report, not a screenshot and not a test on real devices, so a mobile spacing change still deserves your own look on a phone. Pages owned by a visual page builder such as Elementor, Divi or Beaver Builder are refused at the moment of work, with the reason given. Analytics and Search Console are not written to. Work happens on request, not on a schedule. Cost is credit-based, and the details sit on the pricing page.

    Frequently asked questions

    Appearance then Customize has disappeared. Where did it go?

    You are most likely running a block theme, where customization moves to Appearance then Editor. WordPress.org’s documentation says the Site Editor is only available when a block theme is installed and active, and the reverse holds too: many block themes register no Customizer sections. Switching to a classic theme brings the Customizer back, which is a diagnostic, not a recommendation.

    Do I still need a child theme if I use a block theme?

    For colors, fonts and spacing, Styles in the Site Editor saves to the database and survives theme updates, so no. For a changed template file, a theme.json override or custom PHP, yes, a child theme is still the place to put it. Anything that must survive switching to a different theme belongs in a plugin either way.

    The change shows on desktop but not on my phone. What now?

    Run the same cache sweep first, including any CDN, and check on the device in a private window rather than a resized desktop browser. Then check whether a breakpoint rule or a block visibility setting is hiding the element at that width. If both come back clean, watch the save request in the Network tab, because a change that never saved looks identical to one that is cached.

    Can I let AI generate a theme instead of buying one?

    Only if you can inspect, debug and update the code yourself. The risk is not the first screenshot, it is maintaining the code through PHP version changes, WordPress releases and a fatal error six months later. Practitioners who tried it often report going back to a dependable starter theme because it was easier to keep running.

    Is it safe to edit theme files on a live store?

    No, and this is the strongest warning in the community data. Build and test on a staging environment that mirrors production, and take a confirmed backup before any conflict testing. On WooCommerce, override only the templates you need in a child theme and use hooks for smaller changes, then check the plugin’s outdated-template report after each WooCommerce update.

    Additional CSS or a stylesheet in the child theme?

    Additional CSS is fine for a handful of scoped rules and it is easy to undo, but it is stored per theme and it becomes unreadable past a few dozen lines. Once the CSS is long enough that you would want comments and version control, move it into the child theme’s stylesheet. Content-level tweaks that only affect one page belong in the page itself, which the guide on editing pages in WordPress covers.

  • Why your WordPress font change is not showing

    Key takeaways

    • Check the live page in a private window after purging caches in order: caching plugin, host cache, CDN, page builder CSS, then a hard browser refresh. The editor preview proves nothing.
    • Five causes cover nearly every report: stale caches, a setting changed at the wrong scope, theme or builder CSS winning on specificity, a font registered but never loaded on the front end, and a font file returning 404 or refused cross-origin.
    • Two developer tools checks split the problem in half: the computed font-family on the element says whether your rule applied, the Network panel says whether the file downloaded.
    • Do not load fonts with @import in Additional CSS. It often fails to render on the front end. Use @font-face in a child theme or enqueue the stylesheet.
    • Give typography one owner (theme styles, builder global fonts, or your own CSS) and leave the other layers empty, or the next update reintroduces the old font.

    You picked the font, you saved, and the live site still shows the old one. Or half of it changed: headings updated, buttons did not, and product titles are doing something else entirely.

    That is not one bug. It is five, and from the outside they look the same. Work through them in order of how often they turn out to be the answer, and stop at the first one that explains what you see. If you are still deciding where the font should be set in the first place, the walkthrough of where to change fonts in WordPress covers the Site Editor, the Customizer and CSS paths.

    Before anything else: check the live page, not the editor

    The block editor and the Site Editor preview render with their own stylesheet. They are close to the front end, not identical to it, so neither a correct preview nor a wrong one is evidence.

    Do this first, in this order:

    1. Confirm the change was actually committed. Site Editor styles need Save. Customizer changes need Publish. Builder changes need Update and often a separate global settings save.
    2. Open the live URL in a private window, or hard refresh with Ctrl+Shift+R (Cmd+Shift+R on a Mac).
    3. Right-click the text that is wrong and choose Inspect. In the Styles or Computed panel, read the font-family the browser actually applied, and look for your rule with a line through it.
    4. Switch to the Network panel, filter by Font, and reload. Either the font file downloads with status 200 or it does not.

    Those two panels split the problem cleanly. If the computed font-family is not your font, the CSS never won. If it is your font but the file did not download, the CSS won and the asset failed. Everything below sits on one side of that line.

    Cause 1: a cache layer is still serving the old stylesheet

    This is the most common answer by a wide margin, and the reason people retry the change three times in three different places and make the site worse. A typical WordPress site has four or five independent caches, and clearing one does nothing to the others.

    Purge in this order, testing after each step so you learn which layer was holding the file:

    1. The caching plugin, including any minified or combined CSS it generates.
    2. The host’s own server cache, which is often separate from the plugin and sometimes only clearable from the hosting panel.
    3. The CDN in front of the site.
    4. The page builder’s generated CSS. Builders such as Elementor write their styles to their own files and keep serving the old ones until you regenerate from the builder’s tools screen.
    5. The browser, with a hard refresh or a private window.

    Two details save repeat visits. Turn off CSS minification and combining while you debug, because an aggregated stylesheet can be cached under a filename that never changes. And if the builder offers a choice between printing CSS inline and writing it to an external file, the external file is easier to reason about, because you can open it and see whether your font is in it.

    The signature of a caching problem: the editor is right, the live page is wrong, and it is right in a private window or on your phone over mobile data.

    Cause 2: you changed the font at the wrong scope

    WordPress applies typography at several levels, and the narrower level wins. A font set on one heading block beats the global heading style. A style set on Links beats the size you set on body text for anything that is a link.

    That last one catches people regularly: a header menu that refuses to change size until it is changed under Styles, Typography, Links. WordPress’s Styles overview documentation describes the Styles panel as setting the overall look of the site at a global level, with separate typography sections inside it, so global is the default place to work and per-element settings are the exceptions.

    Walk the scopes from narrow to wide:

    • The individual block. Select it, open Typography in the sidebar, and clear any font family or size set there.
    • The template or template part, if the wrong text lives in a header, footer or archive.
    • Global styles for that element: Text, Headings, Links, Buttons, Captions.

    On WooCommerce stores the same problem wears a different costume. Product titles, prices, breadcrumbs and Add to cart buttons each carry their own classes, and a store theme usually styles them directly. Changing global body text leaves them untouched. Inspect the element, read the class the theme is styling (something like .woocommerce-loop-product__title), and target that.

    Cause 3: theme or builder CSS outranks your rule

    If the Styles panel shows your font-family with a line through it, the rule loaded and lost. A more specific selector, a rule loaded later, or an inline style from a builder beat it.

    Read the winning rule in the Styles panel. It names the file and the selector, which tells you who owns the font on that element: the parent theme, a child theme, the builder, a design plugin, or your own snippet. Then either change the font where the winner sets it, which is almost always the better fix, or write a selector at least as specific as theirs. Prefer .site-content p over a bare p. Keep !important for the case where you have read the winning rule, cannot edit it, and have written down why.

    Never fix this by editing the parent theme’s style.css or functions.php. The next theme update overwrites both. Use Additional CSS for small overrides, or a child theme when the change involves template or function code. The guide to editing themes without losing work covers when Additional CSS is enough and when you need the child theme.

    WordPress Site Editor Styles panel open on the Typography settings
    Within the WordPress Site Editor, the global Styles panel offers dedicated typography controls for elements like text, headings, links, and buttons, centralizing your site’s design. · Source: developer.wordpress.org

    Cause 4: the font is registered but never loaded on the front end

    Here the CSS applies correctly and the browser still renders something else, because the font it was asked for was never delivered. Three versions of this are common.

    @import in Additional CSS. Pasting a Google Fonts @import line into Appearance, Customize, Additional CSS frequently fails to take effect on the front end. Load the font properly instead: register the font family in a block theme’s theme.json, or declare @font-face in a child theme, or enqueue the stylesheet with wp_enqueue_style. The WordPress theme handbook’s typography page covers custom font families and registering web fonts as font faces in theme.json, which keeps the editor preview and the front end in agreement.

    Registered in the Font Library, not printed on the front end. A font can appear in the font picker and still fall back to a system font on the live site, because registration and front-end loading are separate steps and the integration between a theme, a font plugin and core is not always complete. Update the plugin, then check the page source for a @font-face rule naming your font. If there is none, nothing was ever loaded.

    The weight is missing. You applied a family that ships 400 and 700 and asked for 300. The browser substitutes or synthesises, and the text looks subtly wrong rather than obviously wrong. Confirm the weights and styles you use are among the faces you actually loaded.

    Cause 5: the font file does not arrive

    When the Network panel shows the font request failing, read the status and the console message. Each one points at a specific fix.

    What you seeWhat it meansFix
    404 (Not Found) on a font URLThe path in src is wrong, or the file is not in that directoryOpen the font URL directly, correct the path, re-upload the file
    A CORS message about a font on another domainThe CDN or other domain is not sending an Access-Control-Allow-Origin header for fontsAdd the header at the CDN or server, or self-host the font on the same domain
    A mixed content warningAn http:// font URL on an https:// pageChange the URL to https or a protocol-relative path
    The file downloads but nothing rendersThe server sends the wrong MIME type, or the file is corruptRe-export as woff2, confirm the server serves font types correctly

    Site migrations and domain changes cause a burst of these, because absolute font URLs in CSS still point at the old host. The durable setup is self-hosting: put .woff2 files in a folder inside your child theme, declare each weight in @font-face with font-display: swap;, and reference the family by name.

    Still unclear? Isolate the layer that owns typography

    If none of the five explains it, stop changing settings and start removing variables. Switch to a recent bundled theme such as Twenty Twenty-Five and reload the page. If the font behaves, the problem is in your theme or its options. Then deactivate design-related plugins one at a time: builders and styling suites ship their own typography presets and overwrite theme styles by design. The isolation method in the guide to fixing WordPress plugins that are not working applies here unchanged.

    Then fix the structural cause, not just the symptom. Decide which layer owns typography on this site: theme global styles, the builder’s global fonts, or your own CSS. Set it there, clear the settings in the other layers, and write down the decision somewhere the next person will find it. Sites where three layers all set a font are the ones where the old typeface comes back after an update.

    If you would rather hand the tracing over, SiteSelf works on your connected WordPress site through chat and can track down and fix a change that is not taking effect, then report what it changed and what it checked. Content and settings work needs the SiteSelf Connector plugin from the WordPress.org directory; theme files, font assets and server configuration need hosting access over SSH. Pages owned by a visual page builder are refused at the moment of work, with the reason.

    The font loads, and now the page jumps

    A font that finally works can introduce a new problem: text renders in the fallback, the web font arrives, and the layout shifts. Three things reduce it.

    Load less. Every extra family, weight and italic is another file. Two or three weights of one or two families covers most sites, and the hierarchy you wanted usually comes from size, weight and colour rather than a third typeface.

    Preload the fonts that appear above the fold and let the rest wait. web.dev’s best practices for fonts is written around optimising web fonts for Core Web Vitals and is the reference worth reading before you add a second family.

    Match the fallback’s metrics to the web font so the swap does not move anything. MDN describes the size-adjust descriptor as a multiplier for the glyph outlines and metrics of a font, and alongside ascent-override, descent-override and line-gap-override it lets a local fallback occupy the same space as the real font:

    @font-face {
      font-family: "brand-fallback";
      src: local("Verdana");
      size-adjust: 87.6%;
      ascent-override: 95.2%;
      descent-override: 24.1%;
      line-gap-override: 0%;
    }
    
    h1 { font-family: "Brand Sans", "brand-fallback", sans-serif; }

    The percentages are specific to that pair of fonts. Compute yours for your own font and fallback rather than copying these.

    When to stop and get help

    Stop and bring in a developer when the fix requires editing server configuration you do not control, when the font is licensed and the licence restricts self-hosting, or when the only rule that works is a page-wide !important and you cannot tell what it is fighting. Stop sooner on a store: if product pages are rendering inconsistently across browsers, the cost of guessing is orders, not tidiness.

    Also stop if you have changed the same font in three places. At that point the site has accumulated overrides rather than a font setting, and the work is to remove two of them, not to add a fourth.

    Frequently asked questions

    The font looks wrong in the editor but fine on the live site. Did I break something?

    Probably not. The block editor has its own appearance settings, reachable from the three-dot menu at the top right under Preferences, Appearance. They affect the editing interface only. If the live page is correct in a private window, the site is correct.

    Do I need woff, ttf and otf, or is woff2 enough?

    For current browsers, woff2 alone is enough and it is the smallest format. Some font uploader plugins and builders ask for more formats in their upload screens, and older browsers are the only real reason to supply them. Start with woff2 and add formats only if a specific tool refuses the upload.

    Can I load a Google Font with @import in Additional CSS?

    It often fails to render on the front end, which is why the same fix keeps getting reported as not working. Register the family in theme.json, declare @font-face in a child theme, or enqueue the stylesheet instead.

    How do I go back to the theme’s default font?

    Reset typography in Styles or the Customizer to the theme default, remove any font rules from Additional CSS and from child theme stylesheets, and deactivate font plugins you no longer need. Then purge caches and check the live page. Default theme fonts load fast and are a reasonable place to stay.

    Why did my fonts change after I activated a new plugin?

    Design plugins and page builders ship their own typography presets and apply them site-wide by design. Configure that tool’s global typography to match, or switch off its style output if it offers the option. Running two styling suites at once produces font behaviour nobody can predict.

    Is !important ever the right answer?

    Occasionally, when a builder writes inline styles you cannot edit. Use it on the narrowest selector that works, and add a comment saying which rule it is overriding. Applying it across body and every heading hides the conflict and makes the next change harder.

  • How to edit pages in WordPress without breaking it

    Key takeaways

    • Pages, then All Pages, then hover the title and click Edit. Quick Edit changes the title, slug and status without loading the editor at all.
    • The editor that opens tells you where the content is stored. Block editor and classic editor save into the page content; an “Edit with Elementor” link means the layout lives in the builder’s data instead.
    • The homepage is the usual trap. Settings, then Reading names the page, but WordPress’s template hierarchy checks front-page.php before any page template, so a theme file can override what you edited.
    • WooCommerce’s documentation lists Shop, Cart, Checkout and My Account as pages it creates automatically, with no content required on Shop. Typing into that page changes nothing on the front end.
    • If the editor will not load, work in this order: browser and cache, all plugins off, default theme, /wp-json/, PHP memory and error logs, then roles and database last.

    You change a headline, click Update, refresh the live page, and the old headline is still there. Or the text changes and the spacing collapses on mobile. Or the edit link opens a purple screen that says Edit with Elementor and none of the tutorial steps match what you see.

    Finding a page and typing in it is the easy part. The part that costs an afternoon is working out which layer of the site owns the thing you want to change. A page has content, but it also sits inside a template, which belongs to the theme, and editing a WordPress theme safely is a different job with different risks. Get the layer right and most edits take two minutes.

    Open the right page before you change anything

    Log in at yourdomain.com/wp-admin, open Pages, then All Pages. Hover the title of the page you want and click Edit. Make the change, click Update. That is the whole flow, and on a simple page it works exactly as it reads.

    Two shortcuts save time on busy sites:

    • Quick Edit. Hover the title in the Pages list and click Quick Edit to change the title, the slug, the status or the parent without loading the editor. Click Update in the same row.
    • The admin bar. While logged in, open the page on the front end and click Edit Page in the black bar at the top. This is the reliable way to be certain you are editing the page a visitor is looking at, not a similarly named copy.

    That copy problem is common enough to check for. Sites accumulate duplicates: /about/ and /about-2/, a seasonal landing page cloned three times, a translated version that looks identical in the list. Before editing, confirm the slug in the row matches the URL you visited. You need the Administrator or Editor role to edit published pages; Contributors can write but not publish.

    WordPress Pages list with Edit and Quick Edit row actions
    Hover over any item title in the WordPress admin to instantly reveal the Edit and Quick Edit options, your starting point for content changes. · Source: www.smashingmagazine.com

    The editor that opens tells you where the content lives

    WordPress.org’s documentation calls the default editor the block editor, the WordPress editor or the Gutenberg editor, all the same thing. It builds a page out of blocks: paragraph, heading, image, buttons, columns, group. What you type there is saved into the page’s content, so it is the layer you can reach and change with no help.

    Three other things can open instead, and each one means something:

    • One large text area with a formatting toolbar. That is the classic editor, usually because the Classic Editor plugin is active or the page holds a Classic block. Content still saves into the page. Layout control is minimal.
    • A button that says Edit with Elementor, Edit with Divi or Beaver Builder. The builder stores the layout in its own data, not in the page content. Elementor’s listing in the WordPress.org plugin directory describes it as a drag and drop website builder, and the practical consequence is that the page’s design belongs to it. Edit that page in the block editor and you either change text nobody sees or you wreck the layout. Stay in the builder, or rebuild the page deliberately. Our explainer on what a landing page builder really does covers that tradeoff.
    • The Site Editor, reached through Appearance then Editor. WordPress.org’s documentation says the Site Editor is only available when a block theme is installed and activated. If Appearance shows an Editor item, part of what you see on your pages is a template, and headers and footers are template parts rather than page content.

    The same distinction explains locked blocks. If you select a section and the layout controls are missing, you are usually inside a pattern, which opens in content-only editing, or inside a template part being edited from a template. Text is editable, structure is not. Edit the pattern at its source, or open the template part directly, which is the same path as editing the footer in WordPress.

    Change the block, not the container

    Most “I broke the design” damage is a container that moved. A paragraph sits inside a Group, which sits inside a Column, which carries the padding. Drag the paragraph and the spacing goes with it.

    1. Open List View (the icon at the top left of the editor). It shows the real nesting. Select the block you mean to edit there, not on the canvas.
    2. Use the sidebar, not just the toolbar. Dimensions, spacing, colour and typography live in the block settings panel on the right. If one call to action has custom padding and the next inherits theme defaults, they will look aligned in the editor and uneven on the live page.
    3. Duplicate a section that already works rather than rebuilding one. Right-click the block in List View, choose Duplicate, then change the text. Inherited settings come with it.
    4. Save a draft first on anything structural. Revisions are good for text and weak for layout, especially with synced patterns involved.
    5. Preview in a new tab, and check it logged out. An incognito window shows what a visitor gets, without your admin styles or your cache.

    For small markup fixes, the three-dot menu at the top right switches to the Code editor, and a Custom HTML block holds raw markup inside a page. Structural changes belong in a child theme, not in the page.

    List View in the WordPress block editor showing nested groups and columns
    The List View panel clearly reveals how blocks are nested within containers like Group and Columns, directly impacting their layout and spacing. · Source: learn.wordpress.org

    You clicked Update and the live page looks the same

    The edit almost always saved. Something else is deciding what visitors see. Work down this list in order, because the cheap causes are also the common ones.

    1. Your browser. Hard refresh with Ctrl+Shift+R, or Cmd+Shift+R on a Mac, then load the URL in a private window.
    2. Site and CDN cache. Purge the caching plugin, then the host’s cache, then Cloudflare or whatever sits in front. Two cache layers with no exclusion for the admin will also break the editor itself, not only the front end.
    3. The wrong page. Compare the slug you edited against the URL in the address bar. Duplicates and translated copies look identical in the Pages list.
    4. A template is printing the homepage. Check Settings, then Reading, which is where WordPress decides whether the front page shows your latest posts or a static page. Even when that setting is right, the theme handbook’s front page hierarchy checks front-page.php before the page you selected, so a theme file can output a layout that owes nothing to the page editor. Change it in the template, in a child theme so an update does not wipe the work.
    5. The content is builder data. Open the page and look for an Edit with Elementor or Edit with Divi link. If it is there, that is where the visible text lives.
    6. You are looking at the wrong environment. Staging edits stay on staging until someone pushes them.

    The WooCommerce Shop page deserves its own line, because it is the single most reported version of this. WooCommerce’s own documentation lists Shop, Cart, Checkout and My Account as pages created automatically during setup, and notes that Shop requires no content. WooCommerce builds the product listing on the fly. Editing that page does nothing. Change the Product Archive template in the Site Editor, use your theme’s catalog options under Appearance then Customize if it has them, or build a normal page with a shortcode such as [products columns="3" orderby="date"] and assign it as the shop page in WooCommerce settings.

    If tracking down which layer owns a change is not how you want to spend the afternoon, SiteSelf handles WordPress page edits through chat: you say what to change, the agent finds the page, makes the change, fetches the result and reports what it changed and what it checked, and pages owned by Elementor, Divi or Beaver Builder are refused at the moment of work, with the reason.

    When the editor will not load at all

    A blank editor canvas, a critical error on the edit screen, or a 404 on the edit link is a different problem from an edit that does not appear. WordPress.org support replies and builder documentation converge on the same sequence. Follow it in order; the early steps are reversible and the last one is where people lock themselves out.

    1. Browser and cache. Different browser, private window, cache cleared. Five minutes, and it settles a surprising share of cases.
    2. All plugins off. Not two suspects, all of them. If editing works, reactivate one at a time until it breaks. The last one you switched on is the culprit. One WordPress.org thread titled “Cannot edit page until I disable BOGO” is a clean example of the pattern: the reporter first blamed the theme and the host, saw “You attempted to edit an item that doesn’t exist. Perhaps it was deleted?”, and found the answer in the plugin they had installed most recently. Our guide to fixing WordPress plugins that are not working walks the isolation process in detail.
    3. Default theme. Switch to a recent bundled theme such as Twenty Twenty-Five and retest. Theme and core updates that land out of step are a repeatable trigger: a theme stylesheet loaded into the editor can render your content white on white.
    4. Check /wp-json/. Load yourdomain.com/wp-json/ in a browser. You want JSON. A 403, a 404, an HTML page or a PHP warning printed above the JSON gives you the classic blank block editor. Resave Settings, then Permalinks, with no changes to reset routing, then look at security plugins and host firewall rules that filter that path.
    5. PHP memory and logs. A white screen with nothing in the browser console usually means a PHP fatal error. Add define('WP_MEMORY_LIMIT', '512M'); to wp-config.php, and raise the server’s own memory_limit too, since WordPress cannot exceed it. Then read the PHP error log, or ask the host for it, because more memory hides a fatal error rather than fixing it. The white screen troubleshooting guide goes through the log reading.
    6. Roles and capabilities, last. “Sorry, you are not allowed to edit this item” on an account that shows as Administrator usually means capabilities in wp_usermeta are wrong, or a membership or role manager plugin is overriding them, or you are an admin on a different site in a multisite network.
    WordPress Settings Reading screen showing the homepage displays option
    The WordPress Reading Settings allow you to designate a static page as your homepage, a setting that a theme’s front-page.php can still override. · Source: wordpress.org

    When to stop and get help

    Stop at the database. Editing user capabilities by hand in phpMyAdmin is how people lose access to their own site, and it is the step to hand to a developer along with the error log. Stop too when the cause is a plugin’s code rather than its settings: a plugin that opens output buffering without closing it, or ships files with whitespace after ?>, corrupts the JSON the editor depends on, and only the plugin author or a developer can fix that. And back up before any of this, on a staging copy where you have one. Running a full plugin deactivation test on a live store during business hours is its own outage.

    Frequently asked questions

    What is Quick Edit actually for?

    Title, slug, date, parent, template in some themes, status and password protection, all without loading the editor. It is the fastest way to fix a URL or unpublish something. It cannot touch the page’s body content.

    Can I edit a page’s HTML directly?

    Yes. The three-dot menu at the top right of the block editor switches to the Code editor, which shows the block markup for the whole page, and a Custom HTML block holds raw markup inside a layout. Anything structural, like the wrapper around the content, is a template file and belongs in a child theme.

    Why can I not edit the WooCommerce shop page?

    Because it is not a normal page. WooCommerce’s documentation lists Shop among the pages created automatically at setup and notes it needs no content; the product listing is generated on request. Edit the Product Archive template, use your theme’s catalog settings, or build a page around a products shortcode and point WooCommerce at it.

    Is the classic editor gone?

    No. The Classic Editor plugin still works, and pages already holding a Classic block still render and open for editing. If you cannot find a Classic block to insert on a recent WordPress version, that is a change to what the inserter offers by default, not the removal of classic editing.

    Can I edit a builder page in the block editor to save time?

    Not safely. The layout is in the builder’s data, so the block editor shows you a stripped version at best. Deactivating the builder to “switch to Gutenberg” leaves orphaned shortcodes and missing sections. Either keep editing in the builder or rebuild the page on purpose, with the old version still live until the new one is ready.

    How do I let a marketer edit copy without touching the design?

    Give them the Editor role, then lock the structure rather than the person: keep hero sections and repeated layouts in patterns and template parts so they open in content-only editing. Text stays editable, spacing and columns do not. A short written note saying which page holds which section beats any capability tweak.

  • What a landing page builder for WordPress really is

    Key takeaways

    • There are three kinds: dedicated campaign-page plugins (SeedProd, PluginOps), general visual builders (Elementor, Divi, Beaver Builder, Bricks, Breakdance) and block-based tools inside the editor you already have (Site Editor patterns, Kadence Blocks).
    • Popularity and page weight run in opposite directions. GravityKit’s April 2026 HTTP Archive reading puts Elementor on 32.67% of WordPress sites, and Gaurav Tiwari’s 2026 speed comparison puts it near the bottom on LCP and HTML size.
    • A block theme plus a blank template and pattern library answers most landing page requests: hero, features, FAQ, CTA, no header or footer, no extra plugin.
    • Most post-launch failures are process failures: plugin and addon conflicts, theme conflicts, host memory limits, stale cache and per-breakpoint settings that hide the CTA on mobile.
    • Before you commit, deactivate the builder on a staging copy and look at what is left. That test tells you the real switching cost.

    A landing page builder for WordPress is not a separate platform. It is either a plugin that creates ordinary WordPress pages, or a library of blocks and patterns you assemble inside the editor you already have. Either way, what exists at the end is a normal page in your database, rendered through your theme’s template system.

    That distinction sounds pedantic until a campaign page breaks. Most regret in this category comes from the other mental model: someone picks the tool with the biggest template library, builds a promo page on it, and then discovers that the page’s speed, its mobile layout and its editability depend on layers the builder does not own. If you want the build steps, read the guide to building a landing page in WordPress. This piece is about what you are actually choosing between, and what each choice costs you six months later.

    The three kinds, and what each one owns

    Every product marketed as a landing page builder falls into one of three groups. They differ less in what the editor feels like and more in who owns the markup once you publish.

    KindExamplesWhat it producesWhat is left if you turn it off
    Dedicated campaign-page pluginsSeedProd, PluginOps Landing Page Builder, LightStartStandalone campaign, coming soon and maintenance pages that bypass the theme’s normal layoutThe page stops rendering as designed. The content is usually still in the database, but not in a form the block editor can lay out.
    General visual buildersElementor, Divi, Beaver Builder, Bricks, Breakdance, WPBakeryAny page or template, built from the builder’s own elements and stored in its own formatBuilder-specific markup or shortcodes in the editor. Switching builders means rebuilding, not migrating.
    Block-based tools and pattern librariesCore Site Editor, Kadence Blocks, GutenKit, SpectraOrdinary block content in the page, plus a pattern library to start fromCore blocks keep working. Blocks from the plugin show as invalid content until you restore the plugin or convert them.

    The size difference between these groups is larger than the marketing suggests. WordPress.org lists Elementor at 10 million active installs; its own directory listing claims more than 23 million websites. SeedProd, the largest plugin that markets itself specifically as a landing page builder, sits at 600,000 active installs, and its directory slug is still coming-soon. PluginOps ships 120+ templates in its free version and is a fraction of that size again. Kadence Blocks takes the third route entirely: it extends the block editor with custom blocks and design controls rather than replacing the editor.

    Popular and fast are not the same list

    Elementor is the default answer in this category, and the usage data supports that. GravityKit’s April 2026 reading of HTTP Archive data puts Elementor on 32.67% of WordPress sites, ahead of the WordPress block editor at 20.62%, wpBakery at 8.52% and Divi at 5.72%.

    The speed data points the other way. Gaurav Tiwari’s 2026 comparison of 15 page builders, which tests for speed, code quality, workflow, pricing and lock-in, records Elementor at 1.5 seconds LCP with 68KB of HTML and Divi at 1.7 seconds with 84KB, against GenerateBlocks at 0.8 seconds with 24KB. Those are different amounts of work for the browser to do before anything useful appears.

    PageSpeed Insights report showing LCP for a WordPress landing page
    A low PageSpeed Insights score and high Largest Contentful Paint value highlight the critical need to measure the actual performance of a finished website, not just its template. · Source: www.seroundtable.com

    Read that as a loading weight problem rather than an interactivity problem, because that tells you which levers matter. Deeply nested sections, columns and wrappers inflate the DOM. Unoptimised hero images inflate the transfer. Each addon adds another stylesheet and another script. The fixes are image compression and modern formats, caching at the server and the plugin layer, deferring scripts that are not needed for the first screen, and flattening the layout where the builder allows it. That is the same work as speeding up a slow WordPress page anywhere else on the site.

    One caveat that the benchmark publishers are honest about: builder choice explains only part of the variance. The same builder can produce a fast page and a slow one depending on hosting, image discipline and plugin count. Test your own finished page on mobile with the real images, forms, consent banner and analytics loaded, not a demo template on a demo host.

    You might not need a builder at all

    Two of the most common questions people type into Google about this subject are how to create a landing page without a plugin, and how to remove the header and footer from one. Both have the same answer, and it does not involve buying anything.

    If a block theme is active, WordPress gives you the Site Editor. WordPress.org’s Site Editor documentation says the Site Editor is only available when a block theme is installed and activated; if Appearance shows an Editor item, you have one. Create a template there with no header and no footer template parts, assign it to your page, then build the page from patterns in the Patterns tab of the block inserter. Hero, feature grid, FAQ, call to action: the pattern libraries shipped with block plugins cover exactly those sections, because that is what people build.

    WordPress block inserter open on the Patterns tab while building a landing page
    The WordPress block inserter’s Patterns tab offers a diverse collection of prebuilt layouts, from headers and footers to call-to-action sections, simplifying landing page creation. · Source: developer.wordpress.org

    When people say they cannot find the patterns a plugin promised, it is almost always a wrong-screen problem rather than a broken plugin. Patterns live in the inserter’s Patterns tab and in Appearance then Editor then Patterns, not under Posts, and not in the classic editor. Some block plugins also gate a second block behind a companion plugin, so a missing block usually means a missing dependency.

    Where the pattern route runs out: popups, multi-step opt-ins, built-in A/B testing and sophisticated form logic. If your campaign needs those, a dedicated conversion plugin or an external tool earns its place. If your campaign needs a page that loads fast, says one thing and has one form on it, patterns do the job with nothing extra to update.

    What breaks after launch, roughly in the order it breaks

    Practitioner reports cluster in a predictable order, and the order is worth knowing because it tells you where to look first instead of blaming the builder.

    1. Plugin and addon conflicts. The symptom is a 500 error when you open the builder, or the public message “There has been a critical error on this website.” Check the admin inbox for the email titled “Your Site is Experiencing a Technical Issue”, which contains a recovery mode link and usually names the failing plugin. Enable WP_DEBUG and read /wp-content/debug.log for a file path and line number. Deactivate the suspect, not everything at once. Our guide to WordPress plugins that are not working covers the isolation process in detail.
    2. Theme conflicts. Blank pages and fatal errors that vanish under a recent default theme such as Twenty Twenty-Five point at the theme, not the builder. Oxygen’s own documentation recommends default-theme testing for this reason.
    3. Host and PHP limits. Builders post large forms back to the server. Timeouts, database connection errors and 500s often trace to memory limits and max_input_vars. A 256MB memory limit is the floor people report as restoring normal behaviour in heavy builders. Ask the host to check firewall and ModSecurity rules and send you the server PHP error log.
    4. Stale cache hiding a fix that worked. There are usually four layers: the host, the CDN, the caching plugin and the builder’s own generated CSS. Clear all of them, regenerate the builder’s cache, and retest in a private window before you conclude the fix failed.
    5. Settings, roles and licence state. No dramatic error here. Features simply do not appear, or editing is restricted, because of role manager permissions, an expired licence or a PHP version the builder no longer supports.

    Mobile layouts break because of per-device settings, not the builder

    Visual builders expose width, offset and a hide-on-device toggle per breakpoint. Three things go wrong with them. Widths that were never set for the tablet or mobile band squeeze or overflow the content. Offsets copied from desktop create empty gaps or horizontal scroll. And the hide toggle gets used aggressively enough that a section disappears on small screens.

    That last one is the expensive mistake. If the hidden section contained the form or the call to action, the mobile page cannot convert at all, and the people who only have a small screen lose information everyone else gets. Check the page on a real phone width with the form visible before you count the campaign as live.

    Addons drift out of step with the builder

    Builder addon changelogs are full of entries like “compatibility with the latest Elementor release” for a reason. When the main builder or WordPress core updates and an addon does not, widgets built on that addon, sliders, modals, feed embeds, stop working on a page that is currently taking traffic. Update addons in step with the builder, read the release notes, and resist the urge to hand-patch a broken layout before you have updated the thing that broke it.

    WordPress Plugins screen showing builder and addon plugins with updates available
    Outdated plugins, clearly marked with update notices on the WordPress admin screen, can quickly lead to compatibility issues and failing widgets. · Source: www.snapfrozen.com.au

    Questions to ask before you commit to one

    • Who edits this page in six months? If the answer is a non-technical colleague, structure matters more than widget count. Patterns and reusable templates let someone change words and images without moving the layout.
    • What is left if the builder is deactivated? Build one representative page on a staging copy, deactivate the plugin, and look at the result. That is the switching cost, measured rather than guessed.
    • How many addons does this design need? Every addon is another update cycle, another compatibility check and another security patch to track.
    • How will the page be measured? On mobile, with real images, the form, the consent banner and analytics loaded.
    • Who has which access? Content and settings work needs WordPress admin. Asset, caching and code work needs hosting access. Decide that before the campaign date, not during it.

    What changes when an agent does the work

    The tool choice is usually not the bottleneck. The waiting is. A headline change, a swapped image, a form field that needs removing before Monday’s campaign: small work, wrapped in a process that costs more than the work does.

    Example request: “Our spring promo page is slow on phones. The hero image is a 4MB PNG, the page still loads the slider plugin we stopped using, and the FAQ section is hidden on mobile by mistake. Fix those three and tell me what you changed.”

    SiteSelf works on the site as it is. For the FAQ visibility and the image swap it uses the SiteSelf Connector plugin from the WordPress.org directory, which covers content and settings work. For the unused slider assets and any caching or template change, it needs hosting access over SSH. Before it changes anything it says what is about to change and whether it can be undone. Afterwards it fetches the changed page and reports in plain language what it did and what it checked. The work is recorded, so you can see later what happened and undo it. This is the same shape as any other design change on an existing WordPress site.

    The honest limits matter here more than in most subjects, because this article is about builders. If the promo page is owned by Elementor, Divi or Beaver Builder, the page is refused at the moment of work, with the reason given. Verification is a fetch of the page and a written report, not a screenshot and not a device test, so a layout you care about deserves your own look on a phone. Nothing runs on a schedule and nothing runs unattended: work happens when you ask, through chat or from Telegram. Nothing is written to your analytics, ad platform or CRM. Pricing is credit-based, so a heavier task costs more than a lighter one; the pricing page has the current detail.

    Frequently asked questions

    Can I build a landing page in WordPress without a plugin?

    Yes, if a block theme is active. Create a page, assign a template you made in the Site Editor without header and footer parts, then build the sections from patterns in the block inserter. WordPress.org’s documentation notes the Site Editor appears only with a block theme installed and activated.

    How do I remove the header, footer or sidebar from one page?

    Do it at the template level, not with CSS that hides elements. In a block theme, duplicate your page template in the Site Editor, remove the header and footer template parts, save it under a name like Landing Page, then assign that template to the single page from the page settings panel.

    Do page builders hurt SEO?

    Not directly through markup, but through loading weight. The measured gap between heavy visual builders and block-based tools shows up in LCP, which is one of the Core Web Vitals. Image compression, caching, deferring non-critical scripts and flattening nested layout wrappers are the levers that move it.

    Is a free landing page plugin enough?

    For one campaign page with a form, usually yes. Free tiers from SeedProd, PluginOps, Kadence Blocks and Beaver Builder all exist on WordPress.org. Paid tiers buy template volume, A/B testing, theme building and commerce support, so check whether your campaign actually needs those before paying for them.

    I used an AI page generator and nothing happened. What now?

    Check three things in order. Whether the plugin’s AI provider connection is configured in its settings, whether you clicked the button that creates the page rather than stopping at the preview, and whether the page it created is sitting in Drafts. Several of these plugins create the page as a draft by default, so it exists but is not public.

    Should I use WordPress or a hosted landing page tool?

    The split people settle on is intensity-based. Hosted tools suit short, heavily tested paid campaigns where iteration speed and built-in experiments matter and the page has no future. WordPress suits evergreen pages that belong to the site, share its navigation and design, and need to stay indexed and editable for years.

  • What a music player WordPress plugin adds and breaks

    Key takeaways

    • Core covers more than people expect: the Audio block embeds one file, and the Playlist block plays a collection of tracks in a single player with a track list, shuffle and a waveform visualization.
    • Check the vulnerability record before the feature list. Patchstack shows 16 patched issues for MP3 Audio Player by Sonaar (20,000 installs), including an unauthenticated IDOR affecting 4.0 to 5.10 and broken access control up to 5.12.
    • A patched record is a good sign, not a bad one. The problem is a site sitting three versions behind, because none of these failures show on the front end.
    • Ranked by how often they happen: broken file URLs after a migration, JavaScript killed by minification, players missing because the track is still a draft, and waveforms blanked by a CDN that blocks the XHR fetch.
    • Continuous playback across page loads has no clean plugin answer. Frames break mobile, AJAX page loaders break other scripts, and going single-page is a rebuild.

    WordPress plays audio with no plugin at all. The Audio block embeds a music file, a podcast episode or any other sound file directly in a post or page, with the browser’s own controls. The Playlist block goes further: WordPress’s documentation describes it as a collection of audio tracks played in a single player, where visitors browse the track list, play in order or on shuffle, and follow the current track in an interactive waveform visualization.

    So the question is not “which music player WordPress plugin is best”. It is narrower: what does a plugin add that core does not, and what does it cost you three months later. The cost is usually one of four things going wrong, and those four are the same for every plugin in the category. If yours has already stopped working, the general method in our guide to WordPress plugins that are not working applies here too.

    What core already covers, and where it stops

    The Audio block handles one file per block. Its toolbar includes a Replace control, which matters more than it sounds: the URL of the file you chose is written into the post content, so swapping the MP3 in the Media Library does nothing to blocks you already published. You change the block, not the library.

    The Playlist block is the bigger change to the calculation. Multi-track playback with a waveform was the main reason to install a plugin for years. Its documentation opens with a requirements section, so check it against the WordPress version you actually run before you plan around it. Sites on older releases will not have the block, and a page built on a newer staging install will not render it when you copy it down.

    WordPress block editor with an audio block inserted into a post
    WordPress’s core Audio block provides simple single-track playback capabilities directly within the editor, demonstrating its built-in media handling. · Source: gutenix.com

    If you need one track in a post, or an album on a release page, you may already be finished. Everything past that point is what the plugin market exists for.

    What a plugin adds that core does not

    Six things, and most sites need one or two of them:

    • Page-builder placement. Music Player for Elementor ships a dedicated Elementor widget, so the player is a layout component rather than a shortcode dropped in a text box.
    • Product previews. Music Player for WooCommerce puts a player on products and supports OGA, MP3, WAV and WMA files plus M3U and M3U8 playlists, with Dokan, WCFM Marketplace and MultivendorX support for marketplace setups.
    • Podcast and radio sources. AudioIgniter’s listing covers building playlists from standard WordPress media uploads and streaming a radio show. MP3 Audio Player by Sonaar is written for music, beat makers and podcasters, with players on posts, WooCommerce products or custom post types.
    • Format breadth. HTML5 Audio Player by bPlugins lists .mp3, .wav, .ogg and more.
    • Sticky and floating players that stay visible while the visitor scrolls.
    • Skins and branding, where the player is part of the page design rather than a grey bar.

    If your list of needs is empty, do not install anything. A player is JavaScript, and JavaScript on a WordPress site has a maintenance cost that a block does not.

    How to read a plugin listing before you install it

    Install counts in this category are small. The leaders sit around 10,000 to 20,000 active installs, not the hundreds of thousands you see in forms or SEO. That means abandonment risk is real in the long tail, and it also means a high install count is not proof of much on its own.

    Four signals are worth more than the feature list:

    • Tested up to. A plugin lagging a full WordPress release behind its peers is a mild staleness signal, not a disqualification. Two releases behind, with no update in a year, is a different conversation.
    • Does it ship a block or a widget, or only a shortcode? Shortcodes are where the support tickets come from, because attribute names get typed by hand.
    • Builder lock-in. An Elementor-only player means the audio implementation gets rebuilt if the site ever leaves Elementor. Prefer something with a block and a shortcode as an escape route.
    • The description itself. Compact WP Audio Player’s listing still describes the plugin as an HTML5 and Flash hybrid supporting .mp3 and .ogg files. Flash has been dead since 2020. Copy that old tells you how much attention the listing gets.

    The signal almost nobody checks is the vulnerability record, and in this category it is the one that matters most.

    Why audio players need update discipline more than most plugins

    Patchstack’s entry for MP3 Audio Player by Sonaar, the most installed plugin in the category at 20,000 installations, lists 16 patched vulnerabilities and none currently present, against a latest version of 5.14.2. The recent run reads: cross site scripting up to 5.13.1, broken access control up to 5.12, an unauthenticated insecure direct object reference exposing sensitive information in versions 4.0 to 5.10, a server side request forgery up to 5.11, and an author-level server side request forgery in 5.3 to 5.10.

    It is not only that plugin. Patchstack lists two patched issues for Music Player for WooCommerce, including cross site scripting up to 1.8.9, and one for AudioIgniter, an unauthenticated insecure direct object reference on the audioigniter_playlist_id parameter up to 2.0.2.

    Read that the right way. A plugin with 16 patched issues and zero present is a plugin whose maintainer is fixing things. The danger is the site sitting on 5.9, sounding perfect, with private post content readable by anyone who knows the AJAX endpoint. None of this is visible from the front end. There is no broken layout, no error message, no dead play button. The only remedy on offer for each of these entries is the same: be on a version past the affected range.

    WordPress Plugins screen showing an available plugin update
    A clear update notification on the WordPress Plugins screen reminds users that keeping plugin versions current is essential for site security. · Source: www.wpbeginner.com

    The awkward part is that media plugins are also the ones most likely to break on update, because updates change the markup and the enqueued scripts. So the answer is not automatic updates applied blind, and it is not leaving the plugin alone. It is updating on purpose and then loading a page with a player on it and pressing play.

    Example request

    “Our audio player plugin is three versions behind. Read the changelog, update it, and check the players on the releases pages still render.”

    SiteSelf reads the changelog and the plugin’s current version, tells you what is about to change and whether it can be undone, applies the update, then fetches the pages you named and reports what it found. Plugin and settings work runs through the SiteSelf Connector plugin from the WordPress.org directory; if the fix turns into a template or theme-file change, it needs hosting access over SSH. Handing routine plugin updates to your agent is most useful in exactly this category, where the version number is the whole security story.

    The limits are worth stating plainly. Verification today is a fetch of the changed page and a plain-language report in chat, so it can confirm the player markup and the script are on the page. It cannot listen to the audio, and it is not a device test. If the release page is owned by Elementor, Divi or Beaver Builder, that page is refused at the moment of work, with the reason. Nothing runs unattended; the work happens when you ask, and what was done is recorded.

    The four things that break, in the order they happen

    The file URL. Most “audio is broken” tickets are a 404. Open the audio file’s URL directly in a browser tab. If it does not load there, no plugin setting will help. This is also what a domain change or an HTTP to HTTPS migration does: the URL is stored in the post content, changing the Site URL setting does not rewrite it, and mixed-content rules then block the old asset silently. Migrate with a proper search and replace across post content, not just the setting. Format matters too: a 24-bit WAV will not play in Firefox, and a server configured to send audio as text/plain or with forced download headers breaks in-browser playback whatever the plugin does.

    The player renders but play does nothing. Open DevTools and look for Uncaught TypeError. This is almost always JavaScript aggregation, deferral or minification in a caching plugin. Turn JS and HTML minification off, clear every cache layer, retest. If playback returns, add targeted exclusions for the player’s script and for the core media scripts wp-mediaelement.min.js and mediaelement-migrate.min.js rather than leaving optimisation off site-wide. Keep that exclusion list with the rest of your WordPress speed work, so the next performance pass does not undo it.

    No player at all. Check in this order: is the track published rather than draft or private, is the plugin activated and not merely uploaded, does the page source show the shortcode rendered or printed as literal text, and are the attribute names exactly as documented. Copy shortcodes from the plugin’s own management screen instead of typing IDs by hand, or use its block or widget and remove the opportunity for the mistake.

    The waveform is blank but the plain player works. Waveform players fetch the audio file over XHR to draw the waveform, which a plain <audio> element never does. A CDN that blocks XHR or omits an Access-Control-Allow-Origin header breaks one and not the other. Fix the CDN headers, serve that file from the main server, or fall back to the plugin’s simple player for that instance. This is the one case where offloading media to a CDN, normally good practice, is the cause.

    Browser console showing a JavaScript error while debugging an audio player
    A browser’s developer console quickly identifies an Uncaught TypeError, pinpointing the exact line of code where something broke. · Source: learn.microsoft.com

    Stop and get help when the console is clean, the file loads directly, minification is off and the player still does nothing. At that point you are looking at a theme or plugin conflict, and the isolation work is worth doing in staging rather than live.

    The one thing no plugin solves properly

    People want music to keep playing while visitors browse. A normal WordPress page load replaces the document, which stops playback. Every workaround trades one problem for another: frames keep the audio alive and break mobile rendering, AJAX page loaders keep the audio alive and interfere with other scripts on the site, a single-page or headless front end solves it and is a rebuild, and a pop-out player window solves it at the cost of an extra window most visitors will close.

    Sticky and floating players are not the same thing. They keep controls visible while the visitor scrolls one page. They still stop at the next page load, and a vendor describing the feature as continuous playback is usually describing that.

    Frequently asked questions

    Do I need a plugin at all?

    If you want one track in a post, no. If you want an album with a track list, shuffle and a waveform, check whether your WordPress version has the Playlist block first. Install a plugin when you need a page-builder widget, product previews, podcast feed ingestion, radio streams, custom skins or analytics.

    Why did my audio stop working after I moved to HTTPS?

    The full file URL is stored in the post content, and changing the Site URL setting does not rewrite it. The old http:// URL stays in every embed, and the browser blocks it as mixed content on an https:// page. Run a search and replace across post content, or re-select each file in the block.

    I replaced the MP3 in the Media Library and the old one still plays. Why?

    Same cause. The block holds a URL, not a live link to the library item. Edit the block and use Replace in the block toolbar, or upload the new file over the old one at the same path.

    Why won’t autoplay work?

    Browser policy, not WordPress. Modern browsers block autoplay of audio with sound until the visitor interacts with the page. Give people a visible play control rather than relying on the HTML5 autoplay attribute, and expect custom JavaScript that forces playback to be blocked and to log console errors.

    Can I stop people downloading my MP3s?

    Not completely. Anyone who can hear the file can capture it. You can reduce casual downloading with players that hide the direct file path and serve short-lived URLs, by gating tracks behind a membership or LMS plugin, and by serving previews rather than masters. Treat it as deterrence, not protection.

    Does an audio player slow the site down?

    It depends on whether the plugin enqueues its scripts everywhere or only on pages that contain a player. Check the page source of a page with no audio on it. If the player’s CSS and JS load there, that is the cost you are paying site-wide, and it is worth raising with the plugin’s support before you build around it.