Skip to content

Commit 7e0e642

Browse files
committed
Preserve generic hook removal behavior
1 parent c423cda commit 7e0e642

4 files changed

Lines changed: 29 additions & 23 deletions

File tree

packages/runtime-core/src/runtime-php-snippets.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ function ${snapshot}(string $hook_name): array {
1515
if (!isset($wp_filter[$hook_name]) || !isset($wp_filter[$hook_name]->callbacks)) {
1616
return $snapshot;
1717
}
18-
foreach ($wp_filter[$hook_name]->callbacks as $priority => $callbacks) {
18+
$callbacks_by_priority = $wp_filter[$hook_name]->callbacks;
19+
foreach ($callbacks_by_priority as $priority => $callbacks) {
1920
foreach (array_keys($callbacks) as $callback_id) {
2021
$snapshot[$priority . ':' . $callback_id] = true;
2122
}
@@ -33,11 +34,9 @@ function ${defer}(string $hook_name, array $before): array {
3334
if (isset($before[$priority . ':' . $callback_id])) {
3435
continue;
3536
}
36-
$deferred[] = array('priority' => (int) $priority, 'callback' => $callback);
37-
unset($wp_filter[$hook_name]->callbacks[$priority][$callback_id]);
38-
}
39-
if (empty($wp_filter[$hook_name]->callbacks[$priority])) {
40-
unset($wp_filter[$hook_name]->callbacks[$priority]);
37+
if (isset($callback['function']) && remove_action($hook_name, $callback['function'], (int) $priority)) {
38+
$deferred[] = array('priority' => (int) $priority, 'callback' => $callback);
39+
}
4140
}
4241
}
4342
usort($deferred, static function (array $left, array $right): int { return ($left['priority'] ?? 10) <=> ($right['priority'] ?? 10); });

packages/runtime-playground/src/bench-command-handlers.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,7 +1181,8 @@ function wp_codebox_bench_snapshot_wordpress_hook_callbacks(string $hook_name):
11811181
if (!isset($wp_filter[$hook_name]) || !isset($wp_filter[$hook_name]->callbacks)) {
11821182
return $snapshot;
11831183
}
1184-
foreach ($wp_filter[$hook_name]->callbacks as $priority => $callbacks) {
1184+
$callbacks_by_priority = $wp_filter[$hook_name]->callbacks;
1185+
foreach ($callbacks_by_priority as $priority => $callbacks) {
11851186
foreach (array_keys($callbacks) as $callback_id) {
11861187
$snapshot[$priority . ':' . $callback_id] = true;
11871188
}
@@ -1200,11 +1201,9 @@ function wp_codebox_bench_defer_new_wordpress_hook_callbacks(string $hook_name,
12001201
if (isset($before[$priority . ':' . $callback_id])) {
12011202
continue;
12021203
}
1203-
$deferred[] = array('priority' => (int) $priority, 'callback' => $callback);
1204-
unset($wp_filter[$hook_name]->callbacks[$priority][$callback_id]);
1205-
}
1206-
if (empty($wp_filter[$hook_name]->callbacks[$priority])) {
1207-
unset($wp_filter[$hook_name]->callbacks[$priority]);
1204+
if (isset($callback['function']) && remove_action($hook_name, $callback['function'], (int) $priority)) {
1205+
$deferred[] = array('priority' => (int) $priority, 'callback' => $callback);
1206+
}
12081207
}
12091208
}
12101209
usort($deferred, static function (array $left, array $right): int {

packages/runtime-playground/src/phpunit-command-handlers.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,8 @@ function pg_snapshot_wordpress_hook_callbacks(string $hook_name): array {
497497
if (!isset($wp_filter[$hook_name]) || !isset($wp_filter[$hook_name]->callbacks)) {
498498
return $snapshot;
499499
}
500-
foreach ($wp_filter[$hook_name]->callbacks as $priority => $callbacks) {
500+
$callbacks_by_priority = $wp_filter[$hook_name]->callbacks;
501+
foreach ($callbacks_by_priority as $priority => $callbacks) {
501502
foreach (array_keys($callbacks) as $callback_id) {
502503
$snapshot[$priority . ':' . $callback_id] = true;
503504
}
@@ -513,12 +514,10 @@ function pg_remove_new_wordpress_hook_callbacks(string $hook_name, array $before
513514
foreach ($wp_filter[$hook_name]->callbacks as $priority => $callbacks) {
514515
foreach (array_keys($callbacks) as $callback_id) {
515516
if (!isset($before[$priority . ':' . $callback_id])) {
516-
unset($wp_filter[$hook_name]->callbacks[$priority][$callback_id]);
517+
$callback = $callbacks[$callback_id];
518+
if (isset($callback['function'])) remove_action($hook_name, $callback['function'], (int) $priority);
517519
}
518520
}
519-
if (empty($wp_filter[$hook_name]->callbacks[$priority])) {
520-
unset($wp_filter[$hook_name]->callbacks[$priority]);
521-
}
522521
}
523522
}
524523
@@ -528,16 +527,15 @@ function pg_defer_new_wordpress_hook_callbacks(string $hook_name, array $before)
528527
if (!isset($wp_filter[$hook_name]) || !isset($wp_filter[$hook_name]->callbacks)) {
529528
return $deferred;
530529
}
531-
foreach ($wp_filter[$hook_name]->callbacks as $priority => $callbacks) {
530+
$callbacks_by_priority = $wp_filter[$hook_name]->callbacks;
531+
foreach ($callbacks_by_priority as $priority => $callbacks) {
532532
foreach ($callbacks as $callback_id => $callback) {
533533
if (isset($before[$priority . ':' . $callback_id])) {
534534
continue;
535535
}
536-
$deferred[] = array('priority' => (int) $priority, 'callback' => $callback);
537-
unset($wp_filter[$hook_name]->callbacks[$priority][$callback_id]);
538-
}
539-
if (empty($wp_filter[$hook_name]->callbacks[$priority])) {
540-
unset($wp_filter[$hook_name]->callbacks[$priority]);
536+
if (isset($callback['function']) && remove_action($hook_name, $callback['function'], (int) $priority)) {
537+
$deferred[] = array('priority' => (int) $priority, 'callback' => $callback);
538+
}
541539
}
542540
}
543541
usort($deferred, static function (array $left, array $right): int { return $left['priority'] <=> $right['priority']; });

tests/runtime-php-snippets.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@ $GLOBALS['calls'] = array();
3030
3131
function did_action($hook_name) { return (int) ($GLOBALS['wp_actions'][$hook_name] ?? 0); }
3232
function wp_get_abilities() { return array('before' => true, 'after' => true); }
33+
function remove_action($hook_name, $callback, $priority = 10) {
34+
foreach ($GLOBALS['wp_filter'][$hook_name]->callbacks[$priority] ?? array() as $callback_id => $registered) {
35+
if (($registered['function'] ?? null) === $callback) {
36+
unset($GLOBALS['wp_filter'][$hook_name]->callbacks[$priority][$callback_id]);
37+
if (empty($GLOBALS['wp_filter'][$hook_name]->callbacks[$priority])) unset($GLOBALS['wp_filter'][$hook_name]->callbacks[$priority]);
38+
return true;
39+
}
40+
}
41+
return false;
42+
}
3343
3444
$GLOBALS['wp_filter']['init']->callbacks[10]['existing'] = array('function' => static function () { $GLOBALS['calls'][] = 'existing'; }, 'accepted_args' => 0);
3545
$state = contained_runtime_test_component_lifecycle_replay_prepare();

0 commit comments

Comments
 (0)