我有一个page.php
在其中,我定义了要传递到的自定义子菜单header.php
.
我试过使用常量(我知道很笨拙):
define("CUSTOM_MENU", "<ul><li>Test</li></ul>");
紧接着,代码包括标题:
get_header();
在标题中。php文件,其中的子菜单是,我输出自定义子菜单(如果设置),或
wp_nav_menu
:
if (defined("CUSTOM_MENU"))
echo constant("CUSTOM_MENU");
else
wp_nav_menu(array(some stuff));
奇怪的是
CUSTOM_MENU
常数在瞬间变为空
get_header()
被调用-并在剩余的时间内保持为空
page.php
:
define("CUSTOM_MENU", "<ul><li>Test</li></ul>");
echo constant("CUSTOM_MENU"); // The HTML code above
get_header();
echo constant("CUSTOM_MENU"); // Null!
对于存储我使用的自定义菜单数据的任何方法,都会发生这种情况。我尝试过:
不同的常量名称,命名空间常量,全局变量,一个带有静态变量的函数,我弄不明白为什么会发生这种情况!如果get_header()
不知怎的包括了标题。php使用http包装器,那么一旦退出,该值就不会被取消设置get_header()
再一次
这是怎么回事?我是否忽视了一些显而易见的事情?
SO网友:Johansson
很可能存在装载顺序问题。这个get_header()
功能不包括header.php
文件,所以我不确定该模板中发生了什么。一种解决方法是使用include()
并检查行为是否相同。
我建议你加入wp_head
或init
在这里定义常数。
add_action(\'init\', \'define_my_constant\' );
function define_my_constant() {
if ( ! defined( \'CUSTOM_MENU\' ) && is_page() ) {
define(\'CUSTOM_MENU\', \'<ul><li>Test</li></ul>\');
}
}
init
是WordPress上运行的最早的钩子之一,因此您的常量应该可以在任何主题或插件中访问。
SO网友:birgire
您可以尝试短路wp_nav_menu()
对于给定的theme_location
, 在给定页面上:
/**
* Filters whether to short-circuit the wp_nav_menu() output.
*
* Returning a non-null value to the filter will short-circuit
* wp_nav_menu(), echoing that value if $args->echo is true,
* returning that value otherwise.
*
* @since 3.9.0
*
* @see wp_nav_menu()
*
* @param string|null $output Nav menu output to short-circuit with. Default null.
* @param stdClass $args An object containing wp_nav_menu() arguments.
*/
$nav_menu = apply_filters( \'pre_wp_nav_menu\', null, $args );
Example:
在这里,我们覆盖导航菜单输出
primary
主题位置,用于
test
页码:
add_filter( \'pre_wp_nav_menu\', function( $nav_menu, $args )
{
if ( \'primary\' !== $args->theme_location )
return $nav_menu;
if( is_page( \'test\' ) )
$nav_menu = \'<ul><li>Test</li></ul>\';
return $nav_menu;
}, 10, 2 );