Пользовательские тематические крючки/фильтры - передача аргументов


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

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

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

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 и нашел их не очень полезными для моего контекста:

Author: Community, 2011-08-01

2 answers

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

function theme_content($args) {

   do_action('theme_content', $args);
}
 7
Author: Rarst, 2011-08-01 20:15:13

Очень хороший ответ от Рарста. Я делал это жестким неправильным способом без $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' );
 1
Author: Chris_O, 2011-08-01 21:03:35