• Как удалить хук не статического метода класса (если НЕТ доступа к $this - экземпляру класса) в WP Job Manager Applications?

    @neverenn Автор вопроса
    Новичок
    Ещё раз перебрал статью от Kama и нашёл свою ошибку.

    1. Код плагина, который добавляет функцию и action выглядел так:

    class WP_Job_Manager_Applications_Post_Types {
    
    	/**
    	 * Constructor
    	 */
    	public function __construct() {
    		add_filter( 'wpjm_the_job_title', [ $this, 'already_applied_title' ], 10, 2 );
    		add_action( 'single_job_listing_meta_after', [ $this, 'already_applied_message' ] );
    		add_action( 'init', [ $this, 'register_post_types' ], 20 );
    		if ( get_option( 'job_application_delete_with_job', 0 ) ) {
    			add_action( 'delete_post', [ $this, 'delete_post' ] );
    			add_action( 'wp_trash_post', [ $this, 'trash_post' ] );
    			add_action( 'untrash_post', [ $this, 'untrash_post' ] );
    		}
    		add_action( 'before_delete_post', [ $this, 'delete_application_files' ] );
    		add_action( 'job_applications_purge', [ $this, 'job_applications_purge' ] );
    		add_filter( 'post_class', [ $this, 'add_applied_post_class' ], 10, 3 );
    		add_action( 'transition_post_status', [ $this, 'transition_post_status' ], 10, 3 );
    	}
    ...
    }


    2. Использовал кастомные функции (Спасибо, kama!), которые помогают удалять хуки/фильтры без доступа к экземпляру класса. Вставляйте (например в functions.php) или любой другой файл, который используете для добавления подобного рода функций в теме.

    /**
     * Remove filter without access to class object (instance).
     *
     * In order to use the core WordPress remove_filter() on a filter added with the callback
     * to a class, you either have to have access to that class object, or it has to be a call
     * to a static method. This function allows you to remove filters with a callback to a class
     * you don't have access to.
     *
     * @param string       $hook_name          Filter to remove.
     * @param string|array $class_method_name  Class and Method for the filter's callback.
     *                                         Eg: [ '\Space\My_Class', 'my_method' ] OR '\Space\My_Class::my_method'.
     * @param int          $priority           Priority of the filter (default 10).
     *
     * @return bool Whether the hook is removed.
     *
     * @requires WP 4.7+
     * @author  Kama (wp-kama.com)
     * @version 1.0
     */
    function remove_object_filter( string $hook_name, $class_method_name, $priority = 10 ): bool {
    	global $wp_filter;
    
    	if( empty( $wp_filter[ $hook_name ]->callbacks[ $priority ] ) ){
    		return false;
    	}
    
    	$wp_hooks = & $wp_filter[ $hook_name ];
    	$hooks = $wp_hooks->callbacks[ $priority ];
    
    	[ $class_name, $method_name ] = is_string( $class_method_name )
    		? explode( '::', $class_method_name ) + [ '', '' ] // '\Space\My_Class::my_method'
    		: $class_method_name;
    
    	$class_name = ltrim( $class_name, '\\' ); //> \Space\My_Class >>> Space\My_Class
    
    	foreach( $hooks as $hook ){
    
    		if( ! isset( $hook['function'] ) || ! is_array( $hook['function'] ) ){
    			continue;
    		}
    
    		[ $object, $current_method ] = $hook['function'];
    
    		if( $current_method !== $method_name ){
    			continue;
    		}
    
    		$is_our_object = is_object( $object ) && get_class( $object ) === $class_name;
    
    		if( ! $is_our_object ){
    			continue;
    		}
    
    		return $wp_hooks->remove_filter( $hook_name, $hook['function'], $priority );
    	}
    
    	return false;
    }
    
    /**
     * Remove Class Action Without Access to Class Object
     *
     * @param string       $hook_name          Action to remove.
     * @param string|array $class_method_name  Class and Method for the filter's callback.
     *                                         Eg: [ '\Space\My_Class', 'my_method' ] OR '\Space\My_Class::my_method'.
     * @param int          $priority           Priority of the action (default 10)
     *
     * @return bool Whether the hook is removed.
     */
    function remove_object_action( $hook_name, $class_method_name, $priority = 10 ): bool {
    	return remove_object_filter( $hook_name, $class_method_name, $priority );
    }


    3. Удалил ненужное мне

    remove_object_action( 'single_job_listing_meta_after', [ 'WP_Job_Manager_Applications_Post_Types', 'already_applied_message' ] );


    3.1. Ещё варианты по удалению action и filter:

    remove_object_action( 'some_action_hook', [ 'My\Space\MyClass', 'my_method' ], 11 );
    remove_object_action( 'some_action_hook', [ '\My\Space\MyClass', 'my_method' ], 11 );
    remove_object_action( 'some_action_hook', [ '\\My\\Space\\MyClass', 'my_method' ], 11 );
    remove_object_action( 'some_action_hook', [ \My\Space\MyClass::class, 'my_method' ], 11 );
    remove_object_action( 'some_action_hook', '\My\Space\MyClass::my_method', 11 );
    remove_object_action( 'some_action_hook', 'My\Space\MyClass::my_method', 11 );
    
    // или аналогично для фильтров
    remove_object_filter( 'some_filter_hook', [ 'My\Space\MyClass', 'my_method' ], 11 );
    // etc...


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

    p.s. как добавить удалённый таким образом хук я не знаю.

    upd: Всё же появилась необходимость добавить удалённый хук в другом месте, для этого продублировал исходную функцию и прицепил к хуку.
    Ответ написан
    Комментировать
  • Как в grid растянуть последние элементы?

    @neverenn
    Новичок
    Была похожая история. В блоке было по 2 элемента в строке. Если элементов нечётное количество, то нужно растянуть последний на всю ширину блока.
    Решил так:
    Если в цикле нечётное количество элементов, то добавить к последнему класс "full-row".

    стили для класса:
    grid-column: 1 / span 2;
    Ответ написан
    Комментировать
  • Как исправить обрезание теней у слайдов slick js?

    @neverenn
    Новичок
    Правильное решение:
    1) С центрированием слайдов
    $('.comments__author-items').slick({
        centerMode: true,
        centerPadding: '60px'
    });


    2) Если нет необходимости центровать слайды
    .slick-list {
         padding-left: 15px;
         padding-right: 15px;
         margin-left: -15px;
         margin-right: -15px;
    }
    Ответ написан
    Комментировать
  • Slick slider перелистывает слайды в самое начало после конечного, как сделать, Чтобы он был бесконечным и не переходил назад?

    @neverenn
    Новичок
    Найдите в своём CSS файле свойства transition и попробуйте удалить.
    Применяйте этот эффект точечно к конкретным элементам.
    Проблема в нём.
    Ответ написан
    2 комментария
  • Почему Slick Slider после последнего слайдера резко перематывается на первый?

    @neverenn
    Новичок
    Проблема кроется в transition.
    Поищите его в своём CSS файле.
    Ответ написан
    Комментировать
  • Битрикс Как организовать вывод полного списка категорий на всех страницах?

    @neverenn
    Новичок
    Пример вывода списка разделов инфоблока по ID.
    Вместо SECTION_ID можно использовать ID инфоблока, т.е. IBLOCK_ID или ID подраздела раздела инфоблока.

    <ul id="liva">
    			<?$filter_7 = array('SECTION_ID'=>"34", 'ACTIVE'=>'Y');
    			$db_list_id7 = CIBlockSection::GetList(array(), $filter_7, true, Array("UF_DATE"));
    			while ($arSect = $db_list_id7->GetNext()){
    			$arSect["photo"] = CFile::GetPath($arSect["PICTURE"]);
    			?>
    
    			<li id="liver">
    				<a href="/<?=$arSect["CODE"]?>">
    					<?=$arSect["NAME"]?>
    				</a>
    			</li>
    
    			<? } ?>
    		</ul>


    Вложенность зависит от того, что вы укажете тут:
    <?$filter_7 = array('SECTION_ID'=>"34", 'ACTIVE'=>'Y');


    Если это будет инфоблок, то покажется вся иерархия категорий и разделов.
    Если это категория инфоблока, то покажется вся иерархия разделов и т.д.
    Ответ написан
    Комментировать
  • Как вывести разделы инфоблока и список элементов внутри?

    @neverenn
    Новичок
    Пример вывода списка разделов инфоблока по ID.
    Вместо SECTION_ID можно использовать ID инфоблока, т.е. IBLOCK_ID или ID подраздела раздела инфоблока.

    <ul id="liva">
    			<?$filter_7 = array('SECTION_ID'=>"34", 'ACTIVE'=>'Y');
    			$db_list_id7 = CIBlockSection::GetList(array(), $filter_7, true, Array("UF_DATE"));
    			while ($arSect = $db_list_id7->GetNext()){
    			$arSect["photo"] = CFile::GetPath($arSect["PICTURE"]);
    			?>
    
    			<li id="liver">
    				<a href="/<?=$arSect["CODE"]?>">
    					<?=$arSect["NAME"]?>
    				</a>
    			</li>
    
    			<? } ?>
    		</ul>


    Вложенность зависит от того, что вы укажете тут:
    <?$filter_7 = array('SECTION_ID'=>"34", 'ACTIVE'=>'Y');


    Если это будет инфоблок, то покажется вся иерархия категорий и разделов.
    Если это категория инфоблока, то покажется вся иерархия разделов и т.д.
    Ответ написан
    Комментировать
  • Как вывести список подкатегорий в инфоблоке?

    @neverenn
    Новичок
    Например:

    <?$filter_7 = array('IBLOCK_ID'=>"13", 'ACTIVE'=>'Y');
             $db_list_id7 = CIBlockSection::GetList(array(), $filter_7, true, Array("UF_DATE"));
             while ($arSect = $db_list_id7->GetNext()){
             $arSect["photo"] = CFile::GetPath($arSect["PICTURE"]);
             ?>
             <a class="picsposition" href="/<?=$arSect["CODE"]?>">
                <div class="picsin" style="background-image: url(<?=$arSect["photo"]?>);background-size: 80%; background-position: center;background-repeat: no-repeat;">
                </div>
                <div class="textin"><p><?=$arSect["NAME"]?></p></div>
             </a>
    
             <? } ?>
    Ответ написан
    Комментировать
  • Как вывести элементы с определенным свойством инфоблока?

    @neverenn
    Новичок
    Перед выводом компонента:
    <?$GLOBALS["FilterPopulars"] = array("PROPERTY_ATT_POPULAR_VALUE"=>"Да");?>


    В коде компонента добавить/заполнить строку
    "FILTER_NAME" => "FilterPopulars",

    FilterPopulars — название фильтра
    PROPERTY_ATT_POPULAR_VALUE — ATT_POPULAR - название свойства
    "Да" — вариант, который выставлен в настройках свойства инфоблока
    Ответ написан
    Комментировать