Пользовательские темы hooks / filters – передача аргументов

Я запутался, пытаясь реализовать эти пользовательские теги. Попытка обернуть мне голову.

Я думал, что понял это. но теперь после чтения кода в течение нескольких часов; это стало худшим.

Как изменить передаваемый аргумент в следующем?

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'); 

То, что я пытаюсь достичь

Возможность переопределять крючки и обрабатывать контекстную обработку внутри функций или отдельного файла из запроса.

Пример: на первой странице я хочу, чтобы тема_content () не имела боковой панели, но на подстранице она содержит боковую панель и т. Д. Это может быть выражено так:

Это правильный способ сделать это? Я попытался написать его в своей теме и не смог понять, почему он не работает. Мои аргументы не передаются в параметрах.

Что я наделал

Просмотрели несколько тем на этом SE и обнаружили, что они не очень полезны для моего контекста:

  • Объяснение функции apply_filters и его переменных

  • get_template_part vs action hooks в темах

  • Разница между фильтрами и крючками действия?

Solutions Collecting From Web of "Пользовательские темы hooks / filters – передача аргументов"

Если вы хотите, чтобы theme_content запускалась с аргументами, передаваемыми в theme_content() вам необходимо написать ее следующим образом:

 function theme_content($args) { do_action('theme_content', $args); } 

Очень хороший ответ Рарста. Я делаю это жесткий неправильный путь без $args в функции инициализации крючка и вызванный global $post в функции обработки, чтобы заставить его работать.

Я также хотел расширить ответ Rarst и упомянуть, что вместо повторения значений вы должны назначить их переменной $arg иначе arg "foo" также получит вывод в контенте. Вам также не нужно apply_filters имя крюка в 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' );