WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

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

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

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

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

0
doubled
1 месяц назад
  • 1
    kolshix682 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 месяц назад

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

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

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

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

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

    Kama 1 месяц назад

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

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

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

    doubled 1 месяц назад

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

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

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

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

    Kama 1 месяц назад

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

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

    doubled 1 месяц назад

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

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

    Kama 1 месяц назад
    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 месяц назад

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

    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 месяц назад

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

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

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

    doubled 1 месяц назад

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

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

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

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

    Kama 1 месяц назад

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

    doubled 1 месяц назад

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

    Kama 1 месяц назад

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

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