WordPress как на ладони

Хук при обновлении «Рубрики»

Здравствуйте, подскажите в каком направлении смотреть.

Задача: при обновлении Рубрики выполнить мою функцию, которая принимает три "нестандартных" для события параметра + хочу передать $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.
Заметки к вопросу:
doubled 1.3 года назад

А общую цель я преследую такую: Использовать одну функцию на разные события, с передачей дополнительных параметров.

0
doubled
1.3 года назад
  • 1
    kolshix728 paxtoy.com

    Может вам подойдёт.
    Давно лазил в плагине 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";
    
    doubled 1.3 года назад

    Спасибо Вам большое! Я уже пробовал использовать класс, но был выбран неверный Хук и поэтому не видел правильное выполнение функции.

    Для тех кто не совсем понял что происходит:
    global $wpdb - это обращение к созданному Вами ранее классу, в него можно записать и свою уникальную функцию и свои параметры.

    $wpdb->prefix - переменная класса, сюда можно и записать и читать необходимые данные.

    $cat_ID - переменная куда попадают "стандартные" данные после выполнения 'edited_term'

    Необходимо дополнить add_action('edited_term', 'tedit_category', 10, 3);

    Kama 1.3 года назад

    Не надо в ничего записывать в свойства класса $wpdb, просто потому что так можно.

    edited_term и edited_category - это одинаковые хуки и оба они должны работать для твоей задачи. Ты просто не хорошо разобрался как работают хуки. В частности, apply_filters_ref_array() тебе использовать вообще не нужно - это в ядре делается, тебе нужна лишь функция add_action().

    Читай о том как работают хуки.

    doubled 1.3 года назад

    Kama, это комментарий ради комментария? Если нет, то как решить мою задачу, помимо вышеописанного примера, ты не дал.

    Возможно edited_term и edited_category - это одинаковые хуки и оба они должны работать, но по факту второй не отрабатывал, возможно я что-то не так делал.

    $wpdb я ничего и не вписываю, создал свой. О том, для чего он, я не знал до сегодня, так как только начинаю изучать WP.

    П.С. статью я прочитал внимательно, и там нет того, что мне надо.

    Kama 1.3 года назад

    Я дал ссылки в которых есть примеры. Как тебе помочь я не знаю из твоего вопроса видно что ты неправильно используешь хуки.

    П.С. Комменты ради комментов я не пишу, а наоборот удаляю много комментов...

    doubled 1.3 года назад

    Упертый ты же человек) опять комментарий без какой либо пользы. Хочешь помочь - так напиши лёгкий пример, зачем умничить и говорить что я не так что-то делаю? Ты бы ещё дал мне ссылку на Гугл и сказал что там все есть) мне кажется ты либо не понял мой вопрос, либо не знаешь как его решить иначе..

    я внимательно изучил статьи перед тем как писать здесь, не смогу найти там ничего подходящего..

    Kama 1.3 года назад
    1. Ты вопрос нормально задай, чтобы ответь тебе. Какие переменные ты хочешь передать, в каком контексте?

      return $var1 + $var2 + $var3; <- сюда требуется передать term_id

      Это вообще что в твоем вопросе? term_id автоматом передается в функции хуков edited_term, edited_category и им подобные.

    2. Так, в указанных мной ссылках битая была, может поэтому не нашел ответ. Сорян.

    3. Свои переменные глобально можешь передать. Так вообще не делается по хорошему, но раз уж ты настаиваешь.

      $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;
      }
    doubled 1.3 года назад

    Спасибо за ответ!
    Использование глобальных переменных мне тоже не по душе и по этому я хочу их передать в функцию:

    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;
    }

    Я смог это реализовать только через свой собственный класс. Можно иначе как-то сделать?

    Kama 1.3 года назад

    Есть еще вариант передать переменные в саму функцию определив анонимную функцию:

    // контекст где есть переменные $var1, $var2, $var3 
    
    add_action( 'edited_category', function( $term_id ) use ( $var1, $var2, $var3 ){
    
    	echo $var1 + $var2 + $var3;
    
    	return $term_id;
    } );

    П.С. Что за задача у тебя там такая странная.

    doubled 1.3 года назад

    Еще раз спасибо!
    Если любопытно, то:
    Задача следующая: У меня есть Рубрики и Записи которые по этим Рубрикам распределены. В Записях есть поле(переключатель) который определяет наличие или отсутствие ссылки на данную Запись в навигации.
    Навигации двух уровневая. Первый уровень это Рубрики. Второй Записи.
    Первый уровень должен автоматически создаваться, когда я отмечаю в Записи, что она должна быть в навигации. Исчезать, когда убрали все Записи у данной Рубрики из навигации.. т.е. наличие и отсутствие первого уровня определяет Запись, а не Рубрика.
    Наличие Второго уровня, в свою очередь, должно определяться непосредственно переключателем.

    А дальше я слежу за всеми состояниями и повторно использую свои функции при изменениях. Состояния: меняем название Рубрики\Записи, удаляем Рубрику\Запись и тд.

    т.е. для создания или обновления Первого уровня меню у меня есть функция, которую я применяю при разных событиях (хуках), передавая ей разные параметры.

    Знаю что все равно комкано, но общий смысл понятен мне кажется

    Kama 1.3 года назад

    Так если поле по которому все работает находится только в записях, может тогда и надо мониторить записи. Рубрики зачем мониторить? В рубриках вообще можно автоматом сделать проверку наличия нужного поля хоть у одной записи этой рубрики (обновлять его, скажем раз в день) - все это хранить в метаполе рубрики - есть поле показываем, нет так нет. Получится нужно будет обновлять только метаполе записи при обновлении этой записи и все.

    doubled 1.3 года назад

    А если я поменяю название рубрики? Старое название будет висеть сутки?
    Предположим я добавил 1000 Записей, и сайт будет каждый раз в сутки будет все их перебирать и смотреть наличие поля, как-то это странно на мой взгляд. Лучше я один раз напишу больше кода, но ресурсы буду экономить.

    Kama 1.3 года назад

    Изменение рубрики тут при чем? Ты видимо не понял принцип который я предложил. Или я не понял что тебе нужно.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация