17

我正在为子主题使用主题框架。它有许多钩子,但我特别关注 thematic_header() 。thematic_header() 钩子添加了以下操作(通过 add_action):

<?php
  add_action('thematic_header', 'thematic_brandingopen', 1);
  add_action('thematic_header', 'thematic_blogtitle', 3);
  add_action('thematic_header', 'thematic_blogdescription', 5);
  add_action('thematic_header', 'thematic_brandingclose', 7);
  add_action('thematic_header', 'thematic_access', 9);
?>

动作的内容无关紧要。

我的问题是:我怎样才能改变所讨论的五项行动的优先级。例如,我希望thematic_access() 在thematic_brandingopen() 之前加载。我能够弄清楚的唯一方法是删除并重新添加操作,ala:

<?php
  function remove_thematic_actions() {
    remove_action('thematic_header', 'thematic_access');
    add_action('thematic_header', 'thematic_access', 0); //puts it above thematic_brandingopen
  } 
  add_action ('init', 'remove_thematic_actions');

这似乎是完成非常简单的事情的愚蠢方式。有没有办法访问和排序/重新排序在 WP 中存储操作的任何数据结构?

4

3 回答 3

11

来自WordPress

如果使用默认值 10 以外的优先级注册挂钩,则还必须在调用 remove_action() 时指定优先级。

所以我认为你可以先使用以下方法删除

remove_action('thematic_header', 'thematic_brandingopen', 1);
remove_action('thematic_header', 'thematic_access', 9);

并再次使用不同的添加priority

add_action('thematic_header', 'thematic_access', 1);
add_action('thematic_header', 'thematic_brandingopen', 2);
于 2012-09-22T02:25:33.043 回答
6

不是自我推销,但我在这方面做了一些工作,通过一个名为Prioritize Hooks的 WordPress 插件提供非编码解决方案。我的插件允许您通过 UI 设置各种注册钩子的优先级,并在运行时进行覆盖,因此代码不会被修改。

于 2012-11-20T15:57:43.750 回答
3

以防万一这有助于某人,变量操作存储在

global $wp_filter;
var_dump( $wp_filter[$hook_name] );

这是一个数组数组,其中键是添加​​操作时的优先级。

于 2015-08-20T13:53:07.873 回答