WordPress как на ладони
Мощный и не дорогой хостинг от Fornex.com

Хуки

Фильтры

События

33 коммента
Полезные 1 Вопросы 1 Все
  • Рыгор

    Отличный материал, спасибо!
    Не подскажете, как можно реализовать такую "защиту от дурака":
    чтобы при сохранении материалов, в случае если поле с Заголовком пустое, вываливало диалоговое окно с предупреждением "Поле Заголовок не заполнено" и не давало опубликовать материал (для полного счастья еще бы проверку на присвоение рубрик, чтобы не публиковался материал без рубрики).
    Я так понимаю, что нужно использовать хук save_post, но как это реализовать, не могу представить.
    Заранее спасибоsmile

    Ответить3.7 года назад #
    • Aamonorias
      <?php
      	function save_the_post( $post_id ) {
      		if ( ! isset( $_POST['title'] ) )
      			return;
      		else
      			update_post_meta( $post_id, 'title', sanitize_text_field( $_POST['title'] ) );
      	}
      	add_action( 'save_post', 'save_the_post' );
      ?>

      Думаю, принцип понятен.

      Ответить3.7 года назад #
  • @ Фёдор

    Здравствуйте. Я только осваиваю wordpress, и недавно узнал о возможности фильтровать вывод постов на главную страницу. Использую следующий фильтр скрытых постов, который вставляю в функции темы:

    function exclude_post($query) {
    if ($query->is_feed || $query->is_archive || ($query->is_home || ($query->is_search)))
       {$query->set('post__not_in', array(167) );} // id записи (поста) 
    return $query; }
    add_filter('pre_get_posts','exclude_post');
    • таким образом запись не отображается на главной странице. Но у записи есть комментарии, и они появляются в ленте новых комментариев. Подскажите, пожалуйста, как убрать из ленты новых комментариев комментарии конкретной записи? (то есть чтобы на главной странице не появлялись комментарии к отфильтрованной записи, но продолжали появляться остальные)?
      Заранее благодарен за ответ...
    Ответить3.5 года назад #
  • campusboy3081 cайт: www.youtube.com/c/wpplus

    Как жаль, что описания хуков так мало. Непаханое поле! smile
    Не могу найти нужную зацепку, чтобы правильно сделать следующее: нужно убрать админбар у простых пользователей. Обычные примочки не сработали на сайте к большому удивлению, долго искали почему - не нашли. Не стал терять время и решил сделать так:

    /* Если юзер не админ и у него активирована админ-панель - дизактивировать её */
    add_action( 'wp', 'check_show_admin_bar', 1000, 1 );
    function check_show_admin_bar (){
    	if( is_admin_bar_showing() and !current_user_can( 'manage_options' ) ) {
    		$user_id = get_current_user_id();
    		update_user_meta( $user_id, 'show_admin_bar_front', 'false' ); 
    	}
    }
    
    /* При регистрации сразу делаем админ-панель неактивной по умолчанию */
    add_action( 'user_register', 'disable_toolbar' );
    function disable_toolbar($user_id){
    	update_user_meta( $user_id, 'show_admin_bar_front', 'false' );
    }

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

    Вывод: перезапись поля show_admin_bar_front происходит после того, как получено.

    Вопрос: на какой вешать хук, чтобы значение перезаписывалось, а потом считывалось? Возможно ли вообще такое?

    Ответить3.4 года назад #
    • campusboy3081 cайт: www.youtube.com/c/wpplus

      В общем, выкрутился таким методом:

      add_action( 'wp', 'check_show_admin_bar' );
      function check_show_admin_bar (){
      if( is_admin_bar_showing() and !current_user_can( 'manage_options' ) ) {
      		$user_id = get_current_user_id();
      		update_user_meta( $user_id, 'show_admin_bar_front', 'false' );
      		wp_redirect( wp_get_shortlink() ); 
      		exit;
      	}
      }

      Если кто-то знает более элегантное решение, то буду очень благодарен услышать его!

      Ответить3.4 года назад #
    • Kama7144

      А это почему не подходит?

      // админ бар только для админа и стили для него
      if( ! current_user_can('administrator') ) show_admin_bar( false );
      Ответить3.4 года назад #
      • campusboy3081 cайт: www.youtube.com/c/wpplus

        Вот бы я знал! smile Говорю же, все эти штуки, что ходят по сети, мы перепробовали. Что-то переопределяет. Стоит мультисайт, на основном сайте есть Вукомерц, он способен переопределять, но на втором сайте он не разрешен. Но даже используя коды для Вукомерца, я ничего не добился. Интересно, что я установил себе на тестовый мультисайт, повторил структуры и поставил те же плагины и тему, добившись идентичности на первый взгляд. У меня все коды эти работаю, в том числе и самое лучшее решение, на мой взгляд:

        // админ бар только для админа и стили для него
        if( ! current_user_can('administrator') ) show_admin_bar( false );

        А у товарища ничего не пашет, ни коды ни специальные плагины из репозитория по этой теме. Потратил на решение часов 5 (искал функции, которые могли бы переопределять отображения тулбокса), потом надоело искать и создал код, который написал выше).

        -1
        Ответить3.4 года назад #
  • petrozavodsky773 cайт: alkoweb.ru

    А есть на сайте возможность оставлять описание хуков и фильтров ?

    Ответить3 года назад #
    • Kama7144

      Нет, я думал сделать но чет руки не дошли. Функции никто не добавляет, кроме вас - 0,0000...1% посетителей только. Вообще я это сделаю, как время будет.

      Пока можно в комментарий прям сюда, или в функцию с пометкой что это хук, я в хуки перекину...

      Ответить3 года назад #
      • petrozavodsky773 cайт: alkoweb.ru

        Прямо я один что ли за всю историю в функциях отметился?

        Я как раз думал фильтер the_editor описать может ещё что-то рядом найду, завтра тогда уже скину, если не забуду.

        Я думаю что полезным делом занимаюсь потому что сам пользуюсь сайтом вместо стандартной документации

        Ответить3 года назад #
        • Kama7144

          Ну, не один, еще парочка пользователей описали по несколько функций. Вот самый активный в этом плане: http://wp-kama.ru/profile?user=3

          В любом случае, тебе спасибо, что не только пользуешься!

          Я сейчас еще подумываю открыть возможность редактировать сами тексты для юзеров с рейтингом выше скажем 50. Это с последующей проверкой конечно. Но вот не знаю насколько стоит на это время тратить. Поэтому, тебе вопрос такой, возникали такие мысли у тебя, что-то куда-то дописать или поправить?

          Ответить3 года назад #
  • Григорий cайт: srt.ru

    Уважаемый Kama! Подскажите пожалуйста, где раздобыть такой же список хуков, но для WooCommerce? Или подскажите как добавить (или чем цепляться) произвольное поле на страницу редактирования категории товара?

    Ответить2.8 года назад #
    • campusboy3081 cайт: www.youtube.com/c/wpplus

      Привет. Если по вопросу произвольных полей, то поставьте плагин ACF. При создании произвольного поля там можно указать в каком type post выводить это поле. А насчет хуков для WooCommerce, то можно открыть папку с плагином на жёстком диске и с помощью TotalComander функцией поиска по тексту прогнать, ища add_filter и add_action. Так список и нарисуется. Хотя он уже есть на сайте разработчиков - хуки для WooCommerce.

      1
      Ответить2.8 года назад #
  • @ Andrey

    Тимур, здравствуйте! Если не сложно, скажите, пожалуйста, чем принципиально отличается admin_enqueue_scripts и admin_print_scripts? Спасибо! smile

    1
    Ответить2.6 года назад #
    • Kama7144

      Логикой отличаются:

      • в admin_enqueue_scripts надо подключать функции, которые подключают скрипты, например через wp_enqueue_script(). Т.е. тут скрипты подключаются, но пока не выводятся

      • в admin_print_scripts можно сразу выводить скрипты в том числе просто html код скрипта в теге <script>. Т.е. это событие срабатывает в момент когда скрипты выводятся на экран.

      По факту, оба эти события вызываются рядом, вот кусок кода как они вызываются в файле wз-admin/admin-header.php:

      /* Enqueue scripts for all admin pages. $hook_suffix The current admin page. */
      do_action( 'admin_enqueue_scripts', $hook_suffix );
      
      /* Fires when styles are printed for a specific admin page based on $hook_suffix. */
      do_action( "admin_print_styles-$hook_suffix" );
      
      /* Fires when styles are printed for all admin pages. */
      do_action( 'admin_print_styles' );
      
      /* Fires when scripts are printed for a specific admin page based on $hook_suffix. */
      do_action( "admin_print_scripts-$hook_suffix" );
      
      /* Fires when scripts are printed for all admin pages. */
      do_action( 'admin_print_scripts' );
      
      /**
       * Fires in head section for a specific admin page.
       *
       * The dynamic portion of the hook, `$hook_suffix`, refers to the hook suffix
       * for the admin page.
       */
      do_action( "admin_head-$hook_suffix" );
      
      /* Fires in head section for all admin pages. */
      do_action( 'admin_head' );

      Только в некоторых случаях их вызов отделяется, там что-то с виджетами связано...

      1
      Ответить2.6 года назад #
  • Максим

    Красавчик) Очень классно представил инфу.
    Если бы еще список хуков был с ссылками на описание, вообще огонь.

    1
    Ответить2.4 года назад #
    • Kama7144

      Спасибо, спасибо! thank_you

      Да вот ссылки на описание этих хуков всех было бы хорошим началом для описания всех хуков. Кое что уже описано, но мало... Возможно наберусь терпения и как будет время опишу все это дело...

      1
      Ответить2.4 года назад #
  • Gavrick

    Спасибо большое

    Ответить1.8 года назад #
  • Alex

    Здравствуйте, Тимур!
    Большое спасибо за ваш труд!
    Подскажите, пожалуйста, как можно сделать такую вещь:
    надо каждому пользователю показывать (кроме всего прочего общего) персональную страницу (иди запись - не принципиально). Остальные пользователи не должны видеть эту страницу.
    Сам что-то не могу додуматься.
    Спасибо!

    Ответить1.8 года назад #
    • Kama7144

      Создай страницу, в зависимости от ID юзера выводи там разный контент... Если юзер не авторизован не выводи ссылку на эту страницу, если неавторизованный зайдет на нее напрямую, там будет пусто... Где хранить контент для каждого юзера? Наверное в данных каждого юзера (метаполях см. add_user_meta() )...

      Ответить1.8 года назад #
  • Максим

    Тимур, круто все!!!
    Не подсткажешь, как уйти от привязки к домену?
    К примеру - разрабатываю дома на локалке для клиента сайт. Использую OpenServer. Называю папку к примеру clientdomain.loc/ и при установке вордпресс также указываю этот домен. Естественно домен записывается в базу, а также при редактировании контента, добавления медиаматериалов через стандартный загрузчик вордпресс, добавления ссылок движок формирует полные абсолютные ссылки типа http : // clientdomain.loc/wp-content/uploads/...
    Какой фильтр можно использовать в админке, чтобы при сохранении постов, записей и всех остальных сущностей, а также при загрузке материалов в базу сохранялись ссылки без домена? (например "/wp-content/uploads/...")

    1
    Ответить1.5 года назад #
    • Максим

      Сделал небольшой велосипед.
      Сначала на самое первое событие вешаем функцию

      function define_url(){
        if ( !defined('WP_HOME') ){
      	define('WP_HOME','http://'.$_SERVER['HTTP_HOST']);
        }
        if ( !defined('WP_SITEURL') ){
      	define('WP_SITEURL','http://'.$_SERVER['HTTP_HOST']);
        }
      }
      add_action('muplugins_loaded','define_url', -10);

      либо в файле wp-config.php устанавливаем константы

      define('WP_HOME','http://'.$_SERVER['HTTP_HOST']);
      define('WP_SITEURL','http://'.$_SERVER['HTTP_HOST']);

      Далее создаем функцию фильтрации

      function filter_url($url){
        if(is_array($url)){
      	foreach($url as $k => $v){
      	  $url[$k] = filter_url($v);
      	}
        } else {
      	$url = str_replace(WP_SITEURL, '', $url);
        }
        return $url;
      }

      Использую ее в фильтрах

      add_filter('wp_insert_attachment_data','del_domain_from_url');
      add_filter('load_image_to_edit_attachmenturl', 'del_domain_from_url');
      add_filter('attachment_link', 'del_domain_from_url');
      // Пожалуй, главный фильтр
      add_filter('wp_insert_post_data', 'del_domain_from_url');
      // а также эти фильтры
      add_filter('get_sample_permalink', 'del_domain_from_url');
      add_filter('edit_post_link', 'del_domain_from_url');
      add_filter('preview_post_link', 'del_domain_from_url');
      add_filter('get_avatar_url', 'del_domain_from_url');
      add_filter('theme_file_uri', 'del_domain_from_url');
      add_filter('template_directory_uri', 'del_domain_from_url');
      add_filter('theme_root_uri', 'del_domain_from_url');
      add_filter('content_url', 'del_domain_from_url');
      
      function del_domain_from_url($link) {
        return filter_url($link);
      }
      
      1
      Ответить1.5 года назад #
      • Kama7144

        Опасный немного велосипед... Но если все работает, то это хорошо... А для создания относительных ссылок есть функция wp_make_link_relative()

        Ответить1.5 года назад #
        • Максим

          Блин, классная функция. Сразу не нашел ее. Тогда вместо замены подстроки в функции можно сделать проверку, содержит ли значение текущий домен, а потом передавать строку в функцию. Суть в том, чтобы все, что летит в базу (при загрузке файлов, сохранении постов и т.п.) очищалось именно от текущего домена. Ведь в посте может быть ссылка и на другой ресурс, а эта функция чистит от домена с протоколом абсолютно все ссылки.
          А фильтр get_sample_permalink используется лишь для удобства в админке.

          Ответить1.5 года назад #
Здравствуйте, !     Войти . Зарегистрироваться