Пользовательские тематические крючки/фильтры - передача аргументов
Я запутываюсь, пытаясь реализовать эти пользовательские тематические крючки. Пытаюсь осмыслить это.
Я думал, что понял это. но теперь, после чтения кода в течение нескольких часов, стало еще хуже.
Как мне изменить аргумент, передаваемый в следующем?
functions.php
function theme_content() {
do_action('theme_content'); // Initialize my custom hook
}
function theme_content_alter($arg) {
// Do processing
if (!$arg) {
echo '<h2>default</h2>';
}
if ($arg == 'foo') {
echo '<div class="content">bar</div>';
}
echo apply_filters('theme_content','theme_content_alter', $arg);
} add_action('theme_content', 'theme_content_alter');
index.php
theme_content($arg = 'foo');
Чего я пытаюсь достичь
Возможность переопределять крючки и обрабатывать контекстную обработку внутри функции или отдельный файл из требования.
Пример: на главной странице я хочу, чтобы у theme_content() не было боковой панели, но на подстранице она будет содержать боковую панель и т. Д. Это можно было бы выразить так:
Правильно ли это делать? Я пытался написать это в своей теме и не смог понять, почему это не работает. Мои аргументы не передаются в параметрах.
Что я сделал
Рассмотрел несколько тем на этом SE и нашел их не очень полезными для моего контекста:
2 answers
Если вы хотите, чтобы theme_content
хук выполнялся с аргументами, которые вы передаете в функцию theme_content()
, вам нужно написать это так:
function theme_content($args) {
do_action('theme_content', $args);
}
Очень хороший ответ от Рарста. Я делал это жестким неправильным способом без $args
в функции инициализации крючка и вызывал global $post
в функции обработки, чтобы заставить ее работать.
Я также хотел бы подробнее остановиться на ответе Рарста и упомянуть, что вместо того, чтобы повторять значения, вы должны присвоить их переменной $arg
, иначе аргумент "foo" также будет выводиться в содержимом. Вам также не нужно указывать имя крючка в apply_filters
.
Вот ваш обновленный код (это было проверено и работает)
function theme_content( $arg ) {
do_action('theme_content', $arg ); // Initialize my custom hook
}
function theme_content_alter( $arg ) {
if( !$arg ) {
$arg = '<h2>default</h2>';
} elseif ( $arg == 'foo' ) {
$arg = '<div class="content">bar</div>';
}
echo apply_filters( 'theme_content_alter', $arg );
}
add_action( 'theme_content', 'theme_content_alter' );