07: Sub_Plugin - #7
Open
nikolaystrikhar wants to merge 4 commits into
Open
Conversation
- is_callable() was the type discriminator on every string-or-callable key, and it is true for any string naming an existing function. conflict_policy is designed to be readable from an option, so a stored 'date' or 'flush' was invoked instead of used: a TypeError at plugins_loaded on PHP 8, a silent empty policy on 7.4. Strings and bools are values now. - Type-check required keys. An array passed the truthiness check and cast to "Array", which every sub-plugin making that mistake would have shared as its registry key, activation key, and notice id. - Reject an uncallable dependency_check or activation_callback at registration. Read-time is_callable() made "not configured" and "configured but uncallable" indistinguishable, so a dependency_check pointing at a private method reported dependencies met and let the load run into the fatal it guards. - Drop the redundant network check: WordPress's is_plugin_active() already ORs it in. The test that pinned it described a state WordPress cannot produce. - Guard the plugin.php require on is_plugin_active_for_network, since is_plugin_active is a function third parties shim. - Give get_conflict_notice_message() a default, guard the filter result with is_scalar(), and pass the Sub_Plugin to every configured callable.
nikolaystrikhar
force-pushed
the
06-conflict-policy
branch
from
August 6, 2026 14:22
127f04c to
686266b
Compare
nikolaystrikhar
force-pushed
the
07-sub-plugin
branch
from
August 6, 2026 14:22
b10ecc7 to
8c84385
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Sub_Pluginholds one registered sub-plugin, its configuration, and every per-sub-plugin decision. Each predicate is a plain method taking no hooks, so later collaborators stay thin and each decision is testable directly.Stacked on #6.
is_callable()was the type discriminator onconflict_policy,enabledand both message keys. A stored policy string likedateorflushwas invoked rather than used — an uncaughtTypeErroratplugins_loadedon PHP 8, a silent empty policy on 7.4. Strings and bools are values now.dependency_checkreported dependencies met, so a typo'd function name or a private method silently dropped the guard. Both callable-only keys are validated at registration.empty()but never type-checked. An array casts to"Array", collapsing every affected sub-plugin onto one registry key. They must be non-empty strings now.is_plugin_active()already ORs inis_plugin_active_for_network(), and the test defending it stubbed a state WordPress cannot produce.get_conflict_notice_message()had no fallback, so a host that configured no message got WordPress's raw fatal error screen. It takes a$default.Verify:
slic run unit— 77 tests, 111 assertions.composer test:analysis→[OK] No errors.