[{"data":1,"prerenderedAt":829},["ShallowReactive",2],{"\u002Fblog\u002Fpremium-themes-licensed-plugins":3,"blog-related-posts":112},{"id":4,"title":5,"author":6,"body":7,"date":97,"description":98,"extension":99,"image":100,"meta":101,"navigation":102,"path":103,"readingMinutes":104,"seo":105,"stem":106,"tags":107,"updated":100,"__hash__":111},"blog\u002Fblog\u002Fpremium-themes-licensed-plugins.md","Testing premium themes and licensed plugins before release","Folt Team",{"type":8,"value":9,"toc":89},"minimark",[10,14,19,22,35,38,42,51,55,58,62,65,77],[11,12,13],"p",{},"Open-source test stacks rarely match what your paying users run. Premium themes and licensed plugins are where “we tested it” often means “we tested without them.”",[15,16,18],"h2",{"id":17},"why-public-matrices-are-not-enough","Why public matrices are not enough",[11,20,21],{},"Default compatibility grids cover the most-installed plugins. They will not include:",[23,24,25,29,32],"ul",{},[26,27,28],"li",{},"A client's custom licensed page builder bundle",[26,30,31],{},"A niche WooCommerce extension with aggressive checkout hooks",[26,33,34],{},"A theme your enterprise customer mandates",[11,36,37],{},"Those are the combos that generate urgent tickets after release.",[15,39,41],{"id":40},"upload-licensed-zips-to-a-private-matrix","Upload licensed zips to a private matrix",[11,43,44,45,50],{},"Team plans let you add custom combos — upload the licensed theme and plugin zips and include them in your private matrix. Each selected combination becomes an environment run within the scan. Your code runs in ",[46,47,49],"a",{"href":48},"\u002Fhow-it-works","isolated test environments with zero egress"," and is destroyed after the scan.",[15,52,54],{"id":53},"keep-reports-not-source","Keep reports, not source",[11,56,57],{},"Folt stores the report — pass\u002Ffail matrix, stack traces, screenshots — not your proprietary zips after the run completes. Retention follows your plan (up to 90 days on Team).",[15,59,61],{"id":60},"make-it-part-of-release-qa","Make it part of release QA",[11,63,64],{},"Before you tag a release for a client with a known stack:",[66,67,68,71,74],"ol",{},[26,69,70],{},"Add their licensed combo to the matrix",[26,72,73],{},"Run the scan and diff against last release",[26,75,76],{},"Attach the report to internal release notes",[11,78,79,83,84,88],{},[46,80,82],{"href":81},"\u002Fpricing","Review Team pricing",", then use ",[46,85,87],{"href":86},"\u002Fblog\u002Fread-compatibility-report","the compatibility report guide"," to plan how reviewers will evaluate the private-matrix results.",{"title":90,"searchDepth":91,"depth":91,"links":92},"",2,[93,94,95,96],{"id":17,"depth":91,"text":18},{"id":40,"depth":91,"text":41},{"id":53,"depth":91,"text":54},{"id":60,"depth":91,"text":61},"2026-01-22","Your users run licensed themes and commercial plugins you cannot ship in a public repo. Here is how to test those combos safely before release.","md",null,{},true,"\u002Fblog\u002Fpremium-themes-licensed-plugins","3",{"title":5,"description":98},"blog\u002Fpremium-themes-licensed-plugins",[108,109,110],"premium","themes","team","CX3h1uvIyuTvJPqmqw2OyeK04VpcqUYqT1iK-c9CWq0",[113,169,263,368,469,566,649,732],{"id":4,"title":5,"author":6,"body":114,"date":97,"description":98,"extension":99,"image":100,"meta":166,"navigation":102,"path":103,"readingMinutes":104,"seo":167,"stem":106,"tags":168,"updated":100,"__hash__":111},{"type":8,"value":115,"toc":160},[116,118,120,122,130,132,134,138,140,142,144,146,154],[11,117,13],{},[15,119,18],{"id":17},[11,121,21],{},[23,123,124,126,128],{},[26,125,28],{},[26,127,31],{},[26,129,34],{},[11,131,37],{},[15,133,41],{"id":40},[11,135,44,136,50],{},[46,137,49],{"href":48},[15,139,54],{"id":53},[11,141,57],{},[15,143,61],{"id":60},[11,145,64],{},[66,147,148,150,152],{},[26,149,70],{},[26,151,73],{},[26,153,76],{},[11,155,156,83,158,88],{},[46,157,82],{"href":81},[46,159,87],{"href":86},{"title":90,"searchDepth":91,"depth":91,"links":161},[162,163,164,165],{"id":17,"depth":91,"text":18},{"id":40,"depth":91,"text":41},{"id":53,"depth":91,"text":54},{"id":60,"depth":91,"text":61},{},{"title":5,"description":98},[108,109,110],{"id":170,"title":171,"author":6,"body":172,"date":253,"description":254,"extension":99,"image":100,"meta":255,"navigation":102,"path":86,"readingMinutes":104,"seo":256,"stem":257,"tags":258,"updated":100,"__hash__":262},"blog\u002Fblog\u002Fread-compatibility-report.md","How to read a WordPress plugin compatibility report",{"type":8,"value":173,"toc":246},[174,177,181,184,205,208,212,215,219,222,226,229,233],[11,175,176],{},"A compatibility report is only useful if your team knows how to read it under release pressure.",[15,178,180],{"id":179},"start-with-the-three-questions","Start with the three questions",[11,182,183],{},"One Folt scan groups the results from all of its selected environment runs. Read that report in three passes:",[66,185,186,193,199],{},[26,187,188,192],{},[189,190,191],"strong",{},"Did it work at all?"," — pass\u002Ffail count across the matrix",[26,194,195,198],{},[189,196,197],{},"What specifically broke?"," — exact combo, stack trace, file\u002Fline",[26,200,201,204],{},[189,202,203],{},"What's the blast radius?"," — popularity-weighted impact estimate",[11,206,207],{},"If you only read the pass\u002Ffail headline, you will miss the prioritization layer.",[15,209,211],{"id":210},"treat-stack-traces-as-reproduction-steps","Treat stack traces as reproduction steps",[11,213,214],{},"A good stack trace includes the PHP version, core release, theme, and co-installed plugins. That is your reproduction recipe — not “please send error logs.”",[15,216,218],{"id":217},"use-blast-radius-to-order-fixes","Use blast radius to order fixes",[11,220,221],{},"Two failures are not equal. Fix the combo estimated to hit millions of sites before the edge-case warning — unless you have a contractual reason not to.",[15,223,225],{"id":224},"diff-release-over-release","Diff release-over-release",[11,227,228],{},"Attach reports to releases. When a new failure appears, the report narrows the investigation to changes since the previous accepted scan. When a failure disappears, you have evidence that the fix worked across the selected coverage — not just on your laptop.",[15,230,232],{"id":231},"see-a-live-example","See a live example",[11,234,235,236,240,241,245],{},"Walk through the ",[46,237,239],{"href":238},"\u002Fsample-report","sample report"," with screenshots and matrix output, then use the ",[46,242,244],{"href":243},"\u002Fblog\u002Frelease-checklist","release checklist"," to decide where the report belongs in your process.",{"title":90,"searchDepth":91,"depth":91,"links":247},[248,249,250,251,252],{"id":179,"depth":91,"text":180},{"id":210,"depth":91,"text":211},{"id":217,"depth":91,"text":218},{"id":224,"depth":91,"text":225},{"id":231,"depth":91,"text":232},"2026-01-20","Pass\u002Ffail counts, stack traces, and blast radius — how to turn a compatibility matrix into a prioritized fix list for your next release.",{},{"title":171,"description":254},"blog\u002Fread-compatibility-report",[259,260,261],"reports","compatibility","workflow","Mo8WvZFIUjfTJdN0CiyJxV2FVnHCT02pNDGGnkuf6CQ",{"id":264,"title":265,"author":6,"body":266,"date":357,"description":358,"extension":99,"image":100,"meta":359,"navigation":102,"path":360,"readingMinutes":104,"seo":361,"stem":362,"tags":363,"updated":100,"__hash__":367},"blog\u002Fblog\u002Fstatic-vs-runtime-testing.md","Static analysis vs runtime testing for WordPress plugins",{"type":8,"value":267,"toc":351},[268,271,275,278,289,292,296,299,310,313,317,320,324,335],[11,269,270],{},"Both static analysis and runtime testing belong in a mature plugin workflow — but they answer different questions.",[15,272,274],{"id":273},"what-static-analysis-is-good-at","What static analysis is good at",[11,276,277],{},"Tools that scan PHP source excel at:",[23,279,280,283,286],{},[26,281,282],{},"Deprecated function usage",[26,284,285],{},"Syntax errors before deploy",[26,287,288],{},"Obvious type issues in isolated files",[11,290,291],{},"They are fast, cheap, and belong in CI.",[15,293,295],{"id":294},"what-static-analysis-cannot-see","What static analysis cannot see",[11,297,298],{},"Static tools do not boot WordPress. They cannot tell you:",[23,300,301,304,307],{},[26,302,303],{},"Your activation hook fatals when WooCommerce is present",[26,305,306],{},"A page builder changes script load order and breaks your admin UI",[26,308,309],{},"Checkout fails only on PHP 8.2 with a specific theme",[11,311,312],{},"Those are runtime failures in a specific environment combo.",[15,314,316],{"id":315},"runtime-matrix-testing-closes-the-gap","Runtime matrix testing closes the gap",[11,318,319],{},"Runtime testing activates your plugin inside real WordPress, crawls admin and frontend, and records fatals, console errors, and screenshots for each selected environment run.",[15,321,323],{"id":322},"use-both-in-order","Use both, in order",[66,325,326,329,332],{},[26,327,328],{},"Static checks on every commit",[26,330,331],{},"A runtime scan with coverage appropriate to the release risk",[26,333,334],{},"Diff reports release-over-release",[11,336,337,338,342,343,346,347,350],{},"The Free plan includes 100 environment runs per month, which is enough to evaluate focused coverage but not the current full matrix. Read ",[46,339,341],{"href":340},"\u002Fvs\u002Fphp-compatibility-checker","Folt vs PHP compatibility checkers",", ",[46,344,345],{"href":81},"review pricing and run allowances",", and ",[46,348,349],{"href":238},"see a sample runtime report",".",{"title":90,"searchDepth":91,"depth":91,"links":352},[353,354,355,356],{"id":273,"depth":91,"text":274},{"id":294,"depth":91,"text":295},{"id":315,"depth":91,"text":316},{"id":322,"depth":91,"text":323},"2026-01-18","PHP linters and compatibility checkers catch syntax issues. Runtime matrix testing catches the fatals that only appear inside real WordPress.",{},"\u002Fblog\u002Fstatic-vs-runtime-testing",{"title":265,"description":358},"blog\u002Fstatic-vs-runtime-testing",[364,365,366],"static-analysis","runtime","testing","1Ovz9w55GwIK7Obw8Nd7Ue3S-hDCHCmxDtQJrGnYYh8",{"id":369,"title":370,"author":6,"body":371,"date":459,"description":460,"extension":99,"image":100,"meta":461,"navigation":102,"path":462,"readingMinutes":104,"seo":463,"stem":464,"tags":465,"updated":100,"__hash__":468},"blog\u002Fblog\u002Fplugin-conflict-testing-guide.md","WordPress plugin conflict testing — a developer's guide",{"type":8,"value":372,"toc":452},[373,376,380,383,394,397,401,404,408,416,427,431,434,438,445],[11,374,375],{},"Plugin conflicts are compatibility bugs with bad branding. Treat them like a testable matrix, not a mystery.",[15,377,379],{"id":378},"define-the-conflict-surface","Define the conflict surface",[11,381,382],{},"Conflicts appear when two plugins:",[23,384,385,388,391],{},[26,386,387],{},"Register incompatible hooks on the same action",[26,389,390],{},"Load assets in an order your code did not expect",[26,392,393],{},"Assume they are the only plugin customizing checkout, REST routes, or admin menus",[11,395,396],{},"List the plugins and themes your users actually run — not the minimal set on your dev machine.",[15,398,400],{"id":399},"build-a-combination-grid","Build a combination grid",[11,402,403],{},"A useful grid crosses PHP versions, the current and previous supported WordPress releases, themes, and co-installed plugins. Each selected combination is an environment run; the scan is the job and report that groups those runs. Skip the grid and you will fix symptoms one ticket at a time.",[15,405,407],{"id":406},"capture-multiple-signal-types","Capture multiple signal types",[11,409,410,411,415],{},"PHP fatals from ",[412,413,414],"code",{},"debug.log"," are table stakes. Also capture:",[23,417,418,421,424],{},[26,419,420],{},"JavaScript console errors on admin and frontend",[26,422,423],{},"Screenshots of broken layouts",[26,425,426],{},"WP-CLI activation status",[15,428,430],{"id":429},"prioritize-by-impact","Prioritize by impact",[11,432,433],{},"Not every failure deserves the same urgency. Combine the report's impact estimate with your own support commitments and customer context before ordering fixes.",[15,435,437],{"id":436},"run-the-matrix-automatically","Run the matrix automatically",[11,439,440,441,444],{},"Manual reproduction does not scale across releases. Folt can expand a scan into the current 216-run full matrix or a smaller selection and return a ",[46,442,443],{"href":238},"structured report",". The Free plan includes 100 runs per month, so it cannot launch the full matrix.",[11,446,447,448,350],{},"Compare approaches in ",[46,449,451],{"href":450},"\u002Fvs\u002Fmanual-vm-testing","Folt vs manual VM testing",{"title":90,"searchDepth":91,"depth":91,"links":453},[454,455,456,457,458],{"id":378,"depth":91,"text":379},{"id":399,"depth":91,"text":400},{"id":406,"depth":91,"text":407},{"id":429,"depth":91,"text":430},{"id":436,"depth":91,"text":437},"2026-01-16","How to systematically test WordPress plugin conflicts across PHP versions, themes, and popular plugins — without guessing from support tickets.",{},"\u002Fblog\u002Fplugin-conflict-testing-guide",{"title":370,"description":460},"blog\u002Fplugin-conflict-testing-guide",[466,366,467],"conflicts","wordpress","n_bJ-saKMo04xH4ariDzyqVMPSTaZnsiZSAXm9Ed5Jc",{"id":470,"title":471,"author":6,"body":472,"date":556,"description":557,"extension":99,"image":100,"meta":558,"navigation":102,"path":243,"readingMinutes":104,"seo":559,"stem":560,"tags":561,"updated":100,"__hash__":565},"blog\u002Fblog\u002Frelease-checklist.md","A checklist for shipping a WordPress plugin update safely",{"type":8,"value":473,"toc":550},[474,477,481,507,511,525,529,532,536,543],[11,475,476],{},"Shipping a WordPress plugin update should feel boring. This checklist keeps it that way.",[15,478,480],{"id":479},"before-you-tag-the-release","Before you tag the release",[66,482,483,489,495,501],{},[26,484,485,488],{},[189,486,487],{},"Choose compatibility coverage"," — not just your laptop. Cover the PHP versions you support, the current and previous supported WordPress releases, and relevant theme\u002Fplugin combinations. A focused scan may be the right gate; the full matrix is not included on Free.",[26,490,491,494],{},[189,492,493],{},"Diff against the last green scan"," — new failures should be intentional, not surprises.",[26,496,497,500],{},[189,498,499],{},"Check checkout and admin flows"," — if you integrate with WooCommerce or page builders, exercise those paths.",[26,502,503,506],{},[189,504,505],{},"Review JS console and screenshots"," — PHP fatals are not the only signal.",[15,508,510],{"id":509},"what-to-keep-in-the-release-artifact","What to keep in the release artifact",[23,512,513,516,519,522],{},[26,514,515],{},"Pass\u002Ffail count across the matrix",[26,517,518],{},"Stack traces for new failures",[26,520,521],{},"Blast radius estimate for anything red",[26,523,524],{},"Link to the full report for your team",[15,526,528],{"id":527},"after-you-ship","After you ship",[11,530,531],{},"Monitor support tickets for environment hints. If users report white screens without stack traces, queue another matrix scan with their combo added (Team plans support custom matrices).",[15,533,535],{"id":534},"automate-the-boring-part","Automate the boring part",[11,537,538,539,542],{},"Folt expands one scan into the environment runs you select and groups the evidence in one report. ",[46,540,541],{"href":48},"Review how coverage works",", attach the report to your release notes, and make compatibility an explicit release decision.",[11,544,545,546,549],{},"See ",[46,547,548],{"href":81},"pricing and included run allowances"," when you are ready to make scans part of every release.",{"title":90,"searchDepth":91,"depth":91,"links":551},[552,553,554,555],{"id":479,"depth":91,"text":480},{"id":509,"depth":91,"text":510},{"id":527,"depth":91,"text":528},{"id":534,"depth":91,"text":535},"2026-01-14","A release checklist for WordPress plugin developers — compatibility matrix, regression signals, and what to attach to your changelog.",{},{"title":471,"description":557},"blog\u002Frelease-checklist",[562,563,564],"release","checklist","qa","dadqdTICE4_YmtI0fqmcxUsh6lVIO7ijWAr1Y8kIQ6M",{"id":567,"title":568,"author":6,"body":569,"date":639,"description":640,"extension":99,"image":100,"meta":641,"navigation":102,"path":642,"readingMinutes":104,"seo":643,"stem":644,"tags":645,"updated":100,"__hash__":648},"blog\u002Fblog\u002Fwoocommerce-elementor-conflicts.md","WooCommerce + Elementor plugin conflicts: how to find them",{"type":8,"value":570,"toc":633},[571,574,578,581,584,588,591,602,605,609,612,616,622],[11,572,573],{},"Some of the highest-impact WordPress plugin failures happen only when WooCommerce and a page builder share the same site.",[15,575,577],{"id":576},"checkout-is-the-blast-radius","Checkout is the blast radius",[11,579,580],{},"Activation tests miss checkout regressions. A plugin can load in wp-admin yet break cart fragments, payment fields, or thank-you pages when WooCommerce and Elementor both enqueue assets.",[11,582,583],{},"Those failures cost revenue, not just aesthetics.",[15,585,587],{"id":586},"hook-order-is-the-hidden-dependency","Hook order is the hidden dependency",[11,589,590],{},"WordPress plugins cooperate through hooks. When Elementor and WooCommerce register handlers in a different order than your dev environment, your plugin may:",[23,592,593,596,599],{},[26,594,595],{},"Call functions before they exist",[26,597,598],{},"Override templates another plugin already filtered",[26,600,601],{},"Enqueue scripts that conflict on the checkout block",[11,603,604],{},"You need the combo in the room — not isolated unit tests.",[15,606,608],{"id":607},"scripted-checkout-beats-manual-clicking","Scripted checkout beats manual clicking",[11,610,611],{},"Manual QA on one WooCommerce demo store does not scale across PHP versions and theme variations. Automated checkout scripts across a matrix surface JS console errors and PHP fatals consistently.",[15,613,615],{"id":614},"find-the-combo-in-the-report","Find the combo in the report",[11,617,618,619,350],{},"Add WooCommerce, Elementor, and the relevant theme to the scan coverage. Failures can then be tied to selected environment runs and reviewed with stack traces, screenshots, and the report's ",[46,620,621],{"href":238},"impact estimate",[11,623,624,625,628,629,350],{},"Free includes 100 environment runs per month, not the current full matrix. ",[46,626,627],{"href":81},"Review pricing and run allowances"," or build a focused plan with the ",[46,630,632],{"href":631},"\u002Fcompatibility\u002Fwoocommerce","WooCommerce-specific testing guide",{"title":90,"searchDepth":91,"depth":91,"links":634},[635,636,637,638],{"id":576,"depth":91,"text":577},{"id":586,"depth":91,"text":587},{"id":607,"depth":91,"text":608},{"id":614,"depth":91,"text":615},"2026-01-12","Page builders and WooCommerce together expose hook-order bugs and JS conflicts. Here is how to find them before checkout breaks.",{},"\u002Fblog\u002Fwoocommerce-elementor-conflicts",{"title":568,"description":640},"blog\u002Fwoocommerce-elementor-conflicts",[646,647,466],"woocommerce","elementor","_1kw3Z-Jp7L4knn_bg0dQ8B_60ZLuXAKYre8dcexibg",{"id":650,"title":651,"author":6,"body":652,"date":724,"description":725,"extension":99,"image":100,"meta":726,"navigation":102,"path":727,"readingMinutes":104,"seo":728,"stem":729,"tags":730,"updated":100,"__hash__":731},"blog\u002Fblog\u002Fworks-on-my-machine.md","Why \"works on my machine\" fails for WordPress plugins",{"type":8,"value":653,"toc":718},[654,657,661,664,667,671,674,685,688,692,695,699,705],[11,655,656],{},"Every plugin developer has shipped a release that passed local QA and still broke production sites. WordPress makes this easy.",[15,658,660],{"id":659},"your-stack-is-an-outlier","Your stack is an outlier",[11,662,663],{},"You run a recent PHP release, current WordPress, your theme, and a curated plugin set. A user may run an older supported PHP release, the previous supported WordPress release, another theme, and plugins you never installed.",[11,665,666],{},"Their fatal error is your one-star review — and the ticket rarely includes a stack trace.",[15,668,670],{"id":669},"activation-is-not-enough","Activation is not enough",[11,672,673],{},"Many plugins pass a quick activation test but fail when:",[23,675,676,679,682],{},[26,677,678],{},"Another plugin registers the same hook first",[26,680,681],{},"A page builder enqueues scripts your code assumes are absent",[26,683,684],{},"WooCommerce loads checkout templates your plugin mutates",[11,686,687],{},"You need execution across combinations, not a smoke test on one site.",[15,689,691],{"id":690},"support-tickets-hide-the-matrix","Support tickets hide the matrix",[11,693,694],{},"“White screen after update” and “conflicts with some other plugin” are compatibility bugs described as mysteries. Without a matrix, you guess which combo to reproduce.",[15,696,698],{"id":697},"test-the-matrix-before-you-ship","Test the matrix before you ship",[11,700,701,704],{},[46,702,703],{"href":48},"Folt expands a scan into selected environment runs"," across PHP, WordPress, themes, and conflict plugins, then groups the failing combinations in one report. The current full matrix is broader than the 100 monthly runs included on Free.",[11,706,545,707,710,711,714,715,350],{},[46,708,709],{"href":238},"a sample report",", compare Folt with ",[46,712,713],{"href":450},"manual VM testing",", or ",[46,716,717],{"href":81},"review plan allowances",{"title":90,"searchDepth":91,"depth":91,"links":719},[720,721,722,723],{"id":659,"depth":91,"text":660},{"id":669,"depth":91,"text":670},{"id":690,"depth":91,"text":691},{"id":697,"depth":91,"text":698},"2026-01-10","Your stack is not your user's stack. Here is why single-environment testing misses the failures that become one-star reviews.",{},"\u002Fblog\u002Fworks-on-my-machine",{"title":651,"description":725},"blog\u002Fworks-on-my-machine",[467,564,260],"n8ElebkOD_Mi8sBB_cGtyTwIY3MA9igaQcAGi1HW4hw",{"id":733,"title":734,"author":6,"body":735,"date":820,"description":821,"extension":99,"image":100,"meta":822,"navigation":102,"path":823,"readingMinutes":104,"seo":824,"stem":825,"tags":826,"updated":100,"__hash__":828},"blog\u002Fblog\u002Fphp-8-compatibility-testing.md","How to test a WordPress plugin for PHP 8.2–8.5 compatibility",{"type":8,"value":736,"toc":814},[737,740,744,750,753,757,760,778,781,785,788,791,795,798,804],[11,738,739],{},"PHP upgrades are where “works on my machine” dies quietly. Your local stack is on 8.4, but a meaningful slice of WordPress sites still run PHP 8.2 on budget hosting.",[15,741,743],{"id":742},"why-test-all-four-versions","Why test all four versions",[11,745,746,747,350],{},"Type errors, callback validation, and deprecation warnings behave differently across minor PHP releases. A plugin that activates cleanly on 8.4 can fatal on 8.2 when a third-party plugin passes an invalid callback into ",[412,748,749],{},"array_map()",[11,751,752],{},"Testing one version tells you nothing about the long tail.",[15,754,756],{"id":755},"what-a-real-matrix-looks-like","What a real matrix looks like",[11,758,759],{},"A serious compatibility run crosses:",[23,761,762,767,772],{},[26,763,764],{},[189,765,766],{},"PHP 8.2, 8.3, 8.4, and 8.5",[26,768,769],{},[189,770,771],{},"The current and previous supported WordPress releases",[26,773,774,777],{},[189,775,776],{},"Popular themes and plugins"," that change hook order and asset loading",[11,779,780],{},"That is hundreds of combinations — not something you reproduce by SSH-ing into a single VM.",[15,782,784],{"id":783},"run-execution-not-just-static-analysis","Run execution, not just static analysis",[11,786,787],{},"PHP compatibility checkers find syntax-level issues. They do not activate your plugin inside WordPress, load WooCommerce checkout, or crawl wp-admin with Elementor active.",[11,789,790],{},"Runtime testing catches the fatals users actually hit.",[15,792,794],{"id":793},"ship-with-a-diffable-report","Ship with a diffable report",[11,796,797],{},"The goal is not a green checkbox on your laptop. It is a pass\u002Ffail matrix you can attach to a release, diff release-over-release, and prioritize by blast radius.",[11,799,800,801,350],{},"Folt expands one scan into the environment runs you select and returns runtime evidence for failing combinations. The current full matrix uses 216 runs; Free includes 100 runs per month, so start with focused coverage or ",[46,802,803],{"href":81},"review plans for broader release testing",[11,805,806,807,811,812,350],{},"Use the ",[46,808,810],{"href":809},"\u002Fcompatibility\u002Fphp-8-2","PHP 8.2 compatibility test plan"," to turn those choices into a release gate, then compare the output with the ",[46,813,239],{"href":238},{"title":90,"searchDepth":91,"depth":91,"links":815},[816,817,818,819],{"id":742,"depth":91,"text":743},{"id":755,"depth":91,"text":756},{"id":783,"depth":91,"text":784},{"id":793,"depth":91,"text":794},"2026-01-08","A practical guide to testing WordPress plugins across PHP 8.2, 8.3, 8.4, and 8.5 — not just running a linter on your laptop.",{},"\u002Fblog\u002Fphp-8-compatibility-testing",{"title":734,"description":821},"blog\u002Fphp-8-compatibility-testing",[827,260,366],"php","C7wqrsHSL8gKXPAW-i00MFPBQp14t_a39oESyBLqBXo",1784710665636]