Вопрос: Условно снимаем зависимость от скриптов

Обратите внимание, что я не говорю об сценариях условного постановки /удаления из очереди, я имею в виду условное удаление определенных зависимостей из существующих сценариев в очереди конец. И, пожалуйста, обратите внимание, что вопрос не зависит от плагина. Я хочу быть в курсе общих правил.

Я использовал Elementor (конструктор страниц) для внешнего интерфейса. Но это не используется на всех моих страницах. Таким образом, функция Lightbox по умолчанию, включенная в Elementor, не работает на этих страницах. Вот почему я добавил свой собственный лайтбокс по всему сайту, используя регулярное выражение $ pattern = " /<a(.*?)href=('|\")(.*?).(bmp|gif|jpeg|jpg|png)('|\")(.*?)>/i» ; подключен к фильтру the_content . Все работает нормально, но -

Там, где запущена галерея Elementor или лайтбокс, оба сценария не работают. Вызываются два лайтбокса, иногда лайтбоксы галереи конфликтуют и не работают и т. Д.

Решение 1:

Я знаю, что могу условно фильтровать the_content с помощью регулярное выражение вроде:

if( ! is_singular('cpt') ) {    return $content = preg_replace($pattern, $replacement, $content);}

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

Решение 2:

То, что сделал Elementor, это что-то, как :

wp_enqueue_script('elementor-frontend', 'link/to/frontend.js', array('elementor-dialog', 'elementor-waypoints', 'jquery-swiper'), '1.9.7', true);

Теперь я не хочу загружать функцию лайтбокса из Elementor, поэтому я попытался удалить из очереди 'elementor-dialog' :

if( is_singular('cpt') ) {    wp_dequeue_script( 'elementor-dialog' );}

Но это не работает, так как зависимости установлены в <код> 'Факир-интерфейс . Поэтому я попытался отменить регистрацию диалога:

if( is_singular('cpt') ) {    wp_dequeue_script( 'elementor-dialog' );    wp_deregister_script( 'elementor-dialog' );}

Он разрушительный, потому что он исключил frontend.js .

Как я могу изменить зависимости frontend .js (handle: 'elementor-frontend' ) на лету, чтобы я мог изменить зависимости на массив ('elementor-waypoints', 'jquery-swiper' )

<

Ответы и комментарии:

Идеальный и точный ответ. Спасибо.
Создан 12-03-2018 06:39 Mayeenul Islam


Решение 1:
Здесь мы будем удалять и отменить регистрацию факир-диалог и факир-интерфейс, тогда можно будет переоформить факир-фронтенд без факир-диалог зависимостей:
// Это нужно, чтобы огонь после того, как приоритет 5 где Факир
// постановке обрабатывает скрипты. Мы в порядке, так как по умолчанию стоит 10.
add_action( 'wp_enqueue_scripts', 'wpse_elementor_frontend_scripts' );
wpse_elementor_frontend_scripts функция() {
// При необходимости добавьте охранник пункты, такие как проверка, если( ! is_singular('КПП') )...

// Залог, если Факир не имеется.
если ( ! определенными( 'ELEMENTOR_VERSION' ) ) {
возврат;
}

// Извлечения и снятие с учета факир-диалог
факир-диалог wp_dequeue_script ('' );
факир-диалог wp_deregister_script ('' );

// Извлечения и снятие с учета факир-интерфейс
факир-интерфейс wp_dequeue_script ('' );
факир-интерфейс wp_deregister_script ('' );

// Перерегистрации факир-фронтенд без факир-диалог зависимостей.
$суффикса = ( определенными( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? ": '.мин';
wp_register_script(
'факир-фронтэнд',
ELEMENTOR_ASSETS_URL . 'Яш/фронтэнд' . $суффикса . '.Яш',
[
факир-диалог//'', / / < -- мы убрали это
'факир-точки',
'в jQuery-подметалка',
],
ELEMENTOR_VERSION,
правда
);

// отладки...
//скриптов = wp_scripts();
//выхода ( print_r( $скрипты ) );
}

Решение 2:
В этом решении мы будем использовать wp_scripts (), чтобы модифицировать $wp_scripts глобальных и затем смело вычеркнуть факир-диалог.
Мы удалим факир-диалог зависимость от факир-интерфейс ручки, затем выводить из очереди факир-окно скрипт, который помещается отдельно Факир класс фронтэнд.
/**
* В Факиркласс фронтенд работает register_scripts() метод
* wp_enqueue_scripts с приоритетом 5, поэтому мы хотим, чтобы крючок после того, как это произошло.
*/
add_action( 'wp_enqueue_scripts', 'wpse_elementor_frontend_scripts_modifier', 6 );
wpse_elementor_frontend_scripts_modifier функция() {

// Настраивать гвардии положения о залоге, если мы не хотим, чтобы запустить этот код.
/*если ( ! is_singular( 'КПП' ) ) {
возврат;
}*/

// Получаем все скрипты.
$скрипты = wp_scripts();

// Залог, если что-то пошло не так.
если ( ! ( $скрипты оператор instanceof WP_Scripts ) ) {
возврат;
}

// Массив дескрипторов для удаления.
$handles_to_remove = [
'факир-диалог',
];

// Флаг, указывающий, если мы сняли ручки.
$handles_updated = ложь;

// Удалить нужные ручки от факир-фронтенд скриптов.
по каждому элементу ( $скрипты->зарегистрировано в качестве $dependency_object_id => $dependency_object ) {

если ( 'факир-фронтэнд' === $dependency_object_id ) {

// Залог, если что-то пошло не так.
если ( ! ( $dependency_object экземпляром _WP_Dependency ) ) {
возврат;
}

// Залог, если нет зависимостей по какой-то причине.
если ( пусто( $dependency_object->дэпс ) ) {
возврат;
}

// Сделайте ручку для удаления.
по каждому элементу ( $dependency_object->дэпс как $dep_key => $ручка ) {
если ( in_array( $ручкой, $handles_to_remove ) ) {
и unset( $dependency_object->депс[ $dep_key ] );
$dependency_object->дэпс = array_values( $dependency_object->дэпс ); // "переиндексировать" массив
$handles_updated = истина;
}
}
}
}

// Если мы обновили ручки, извлечения соответствующих зависимостей
// ставились в очередь отдельно Факир фронтэнд.
если ( $handles_updated ) {
факир-диалог wp_dequeue_script ('' );
факир-диалог wp_deregister_script ('' );
}
}

Путем изменения факир-фронтэнда перед dequeueing факир-диалог, мы не ненамеренно из факир-интерфейсе, когда мы из факир-диалог.
При тестировании этого кода, я осмотрел $wp_scripts глобальной (через wp_scripts ()), чтобы гарантировать, что желаемые результаты вступило в силу. Е. Г.
$скрипты = wp_scripts();
print_r( $скрипты );

Соответствующая часть скриптов до изменения:
...

[факир-диалог] => объект _WP_Dependency
(
[ручка] => факир-диалог
[источник] => http://example.com/wp-content/plugins/elementor/assets/lib/dialog/dialog.js
[дэпс] => массив
(
[0] => jQuery-интерфейс-установки
)

[Вер] => 4.1.0
[аргументы] =>
[экстра] => массив
(
[группа] => 1
)

)

[факир-интерфейс] => _WP_Dependency объекта
(
[ручка] => факир-интерфейс
[источник] => http://example.com/wp-content/plugins/elementor/assets/js/frontend.js
[дэпс] => массив
(
[0] => факир-диалог
[1] => факир-точки
[2] => в jQuery-подметалка
)

[Вер] => 1.9.7
[аргументы] =>
[экстра] => массив
(
[группа] => 1
)

)

...

Соответствующая часть скриптов после изменения:
(Обратите внимание, что факир-диалог узел был удален.)
...
[факир-интерфейс] => _WP_Dependency объекта
(
[ручка] => факир-интерфейс
[источник] => http://example.com/wp-content/plugins/elementor/assets/js/frontend.js
[дэпс] => массив
(
[0] => факир-точки
[1] => в jQuery-подметалка
)

[Вер] => 1.9.7
[аргументы] =>
[экстра] => массив
(
[группа] => 1
)

)
...

Создан 06-03-2018 11:10