Хук при обновлении «Рубрики»
Здравствуйте, подскажите в каком направлении смотреть.
Задача: при обновлении Рубрики выполнить мою функцию, которая принимает три "нестандартных" для события параметра + хочу передать $term_id.
Пытался применить apply_filters_ref_array, но вызов идет непосредственно при обновлении страницы, а не при обновлении Рубрики, а как вытащить id идей нет.
Выглядит примерно так:
add_action( 'edited_category', 'my_edited_category', 10, 3);
function my_edited_category ($var1, $var2, $var3) {
return $var1 + $var2 + $var3; <- сюда требуется передать term_id
}
apply_filters_ref_array( 'edited_category', array( 1, 2, 3 ) ); <- выполняется при обновлении страницы, а не при событии edited_category.А общую цель я преследую такую: Использовать одну функцию на разные события, с передачей дополнительных параметров.
Может вам подойдёт.
Давно лазил в плагине a-z category index - там дополнительные действия с терминами выполняются с помощью
add_action('create_term', 'tcreate_category'); add_action('edited_term', 'tedit_category'); add_action('delete_term', 'tdelete_category'); function tcreate_category($cat_ID){ global $wpdb; $table_name = $wpdb->prefix . "categoryindex";Спасибо Вам большое! Я уже пробовал использовать класс, но был выбран неверный Хук и поэтому не видел правильное выполнение функции.
Для тех кто не совсем понял что происходит:
global $wpdb - это обращение к созданному Вами ранее классу, в него можно записать и свою уникальную функцию и свои параметры.
$wpdb->prefix - переменная класса, сюда можно и записать и читать необходимые данные.
$cat_ID - переменная куда попадают "стандартные" данные после выполнения 'edited_term'
Необходимо дополнить add_action('edited_term', 'tedit_category', 10, 3);
Не надо в ничего записывать в свойства класса $wpdb, просто потому что так можно.
edited_term и edited_category - это одинаковые хуки и оба они должны работать для твоей задачи. Ты просто не хорошо разобрался как работают хуки. В частности, apply_filters_ref_array() тебе использовать вообще не нужно - это в ядре делается, тебе нужна лишь функция add_action().
Читай о том как работают хуки.
Kama, это комментарий ради комментария? Если нет, то как решить мою задачу, помимо вышеописанного примера, ты не дал.
Возможно edited_term и edited_category - это одинаковые хуки и оба они должны работать, но по факту второй не отрабатывал, возможно я что-то не так делал.
$wpdb я ничего и не вписываю, создал свой. О том, для чего он, я не знал до сегодня, так как только начинаю изучать WP.
П.С. статью я прочитал внимательно, и там нет того, что мне надо.
Я дал ссылки в которых есть примеры. Как тебе помочь я не знаю из твоего вопроса видно что ты неправильно используешь хуки.
П.С. Комменты ради комментов я не пишу, а наоборот удаляю много комментов...
Упертый ты же человек) опять комментарий без какой либо пользы. Хочешь помочь - так напиши лёгкий пример, зачем умничить и говорить что я не так что-то делаю? Ты бы ещё дал мне ссылку на Гугл и сказал что там все есть) мне кажется ты либо не понял мой вопрос, либо не знаешь как его решить иначе..
я внимательно изучил статьи перед тем как писать здесь, не смогу найти там ничего подходящего..
Ты вопрос нормально задай, чтобы ответь тебе. Какие переменные ты хочешь передать, в каком контексте?
Это вообще что в твоем вопросе? term_id автоматом передается в функции хуков edited_term, edited_category и им подобные.
Так, в указанных мной ссылках битая была, может поэтому не нашел ответ. Сорян.
Свои переменные глобально можешь передать. Так вообще не делается по хорошему, но раз уж ты настаиваешь.
$GLOBALS['my_global_vars'] = [ $var1, $var2, $var3 ]; add_action( 'edited_category', 'save_custom_form_field' ); function save_custom_form_field( $term_id ) { $term = get_term( $term_id ); // получим WP_Term объект list( $var1, $var2, $var3 ) = $GLOBALS['my_global_vars']; return $term_id; }Спасибо за ответ!
Использование глобальных переменных мне тоже не по душе и по этому я хочу их передать в функцию:
function save_custom_form_field( $term_id, $var1, $var2, $var3 ) { $term = get_term( $term_id ); // получим WP_Term объект echo $var1; return $term_id; }Как я могу так сделать? Или не могу?
Лучший для меня вариант следующий:
function sum($var1, $var2, $var3) { return $sum = $var1 + $var2 + $var3; } add_action( 'edited_category', 'save_custom_form_field' ); function save_custom_form_field( $term_id ) { echo sum($term_id, 555, 666); return $term_id; }Я смог это реализовать только через свой собственный класс. Можно иначе как-то сделать?
Есть еще вариант передать переменные в саму функцию определив анонимную функцию:
// контекст где есть переменные $var1, $var2, $var3 add_action( 'edited_category', function( $term_id ) use ( $var1, $var2, $var3 ){ echo $var1 + $var2 + $var3; return $term_id; } );П.С. Что за задача у тебя там такая странная.
Еще раз спасибо!
Если любопытно, то:
Задача следующая: У меня есть Рубрики и Записи которые по этим Рубрикам распределены. В Записях есть поле(переключатель) который определяет наличие или отсутствие ссылки на данную Запись в навигации.
Навигации двух уровневая. Первый уровень это Рубрики. Второй Записи.
Первый уровень должен автоматически создаваться, когда я отмечаю в Записи, что она должна быть в навигации. Исчезать, когда убрали все Записи у данной Рубрики из навигации.. т.е. наличие и отсутствие первого уровня определяет Запись, а не Рубрика.
Наличие Второго уровня, в свою очередь, должно определяться непосредственно переключателем.
А дальше я слежу за всеми состояниями и повторно использую свои функции при изменениях. Состояния: меняем название Рубрики\Записи, удаляем Рубрику\Запись и тд.
т.е. для создания или обновления Первого уровня меню у меня есть функция, которую я применяю при разных событиях (хуках), передавая ей разные параметры.
Знаю что все равно комкано, но общий смысл понятен мне кажется
Так если поле по которому все работает находится только в записях, может тогда и надо мониторить записи. Рубрики зачем мониторить? В рубриках вообще можно автоматом сделать проверку наличия нужного поля хоть у одной записи этой рубрики (обновлять его, скажем раз в день) - все это хранить в метаполе рубрики - есть поле показываем, нет так нет. Получится нужно будет обновлять только метаполе записи при обновлении этой записи и все.
А если я поменяю название рубрики? Старое название будет висеть сутки?
Предположим я добавил 1000 Записей, и сайт будет каждый раз в сутки будет все их перебирать и смотреть наличие поля, как-то это странно на мой взгляд. Лучше я один раз напишу больше кода, но ресурсы буду экономить.
Изменение рубрики тут при чем? Ты видимо не понял принцип который я предложил. Или я не понял что тебе нужно.