Intereting Posts
Ошибка WordPress admin-ajax.php при восстановлении эскизов Многопользовательское создание поддоменов Сомнение | какова будет папка с корневым каталогом? Почему мой идентификатор страницы в блогах == Идентификатор первого сообщения? Масштабирование сайта электронной коммерции WP Breadcrumb Не связывается с правильной пользовательской строкой индекса страницы (ов) Где я должен обновлять тему в теме? Восстановить блог WordPress от неактивного имени домена Пользовательская таксономия в плагине и шаблоне Как настроить настройки для обновления при использовании кнопок управления радиокнопками Загружать несколько файлов с несколькими полями и с помощью media_handle_upload Сообщение отправляется с использованием короткого кода и init добавить столбец имен файлов в медиабиблиотеку для сортировки по Одностраничные разрывы страницы, когда сообщение составляет более 30 000 слов Должен использовать плагин, вызывающий ошибку запроса Плагин для отправки сообщений членам / спискам, но не полномасштабным бюллетеням

Как правильно добавить Javascript на страницу «Страница не найдена на PHP»?

Я пытаюсь добавить некоторые javascripts на страницу «Страница не найден» PHP, но независимо от того, сколько разных способов я пытаюсь это сделать, это что-то ломает.

Вот пример страницы для этого кода: http://www.miamirealestateguy.com/miami-property-for-sale-details/9401-COLLINS-AVE-807-SURFSIDE-FL-33154/A10077417/39/

Моя текущая страница использует приведенный ниже код, и все, что СМОТРЕТЬ правильно в браузере, но сценарии на странице нарушают мою навигацию в верхней части страницы, поэтому выпадающее меню не работает. Когда я удаляю скрипты, навигация снова работает.

введите описание изображения здесь

<?php /** * @package Serene * @since Serene 1.0 */ ?> <h1> <?php esc_html_e( 'No Results Found', 'Serene' ); ?> </h1> <?php if ( is_home() && current_user_can( 'publish_posts' ) ) : ?> <p><?php printf( __( 'Ready to publish your first post? <a href="%1$s">Get started here</a>.', 'Serene' ), esc_url( admin_url( 'post-new.php' ) ) ); ?></p> <?php elseif ( is_search() ) : ?> <p> <?php _e( 'Sorry, but nothing matched your search terms. Please try again with some different keywords.', 'Serene' ); ?> </p> <?php get_search_form(); ?> <?php else : ?> <p> <?php _e( '<p><strong>If you arrived on this page by clicking a link to a real estate listing in a search engine, the property has now been sold or is no longer available.</strong></p><br /><p><strong>You can start a new search for currently available real estate listings below.</strong></p>', 'Serene' ); ?> <br /><h2><strong>Search by Criteria:</strong></h2><div class="grey-box"><script type='text/javascript' src='http://www.idxhome.com/site/listing/search/widget/91928?style=horizontal'></script></div><br /><h2><strong>Search by Street Address:</strong></h2><div class="grey-box"><script type='text/javascript' src='http://www.idxhome.com/site/listing/searchByAddress/widget/91928'></script></div><br /><h2><strong>Search by MLS ID:</strong></h2><div class="grey-box"><script type='text/javascript' src='http://www.idxhome.com/site/listing/searchByListingId/widget/91928'></script></div><br /><h2><strong>Search by Map:</strong></h2><div class="grey-box"><script type='text/javascript' src='http://www.idxhome.com/site/map/search/widget/91928'></script></div> </p> <?php endif; ?> 

Я попытался переместить скрипты внутри этого тега, где основной HTML для текста на странице идет, но это делает, что разбивает всю страницу и ничего на ней не работает:

 <?php _e( '<p><strong>If you arrived on this page by clicking a link to a real estate listing in a search engine, the property has now been sold or is no longer available.</strong></p><br /><p><strong>You can start a new search for currently available real estate listings below.</strong></p>', 'Serene' ); ?> 

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

Спасибо!

проблема

Краткая версия

Проблема заключается не в том, как вы используете эти сценарии или где вы их размещаете, так как авторы этих сценариев писали их.

Длинная версия

Ваш скрипт «superfish», который контролирует функциональность вашего меню навигации, бросает ошибки, потому что $.browser не определен. В то время как $.browser устарел более 3 лет назад, WordPress загружает «jQuery Migrate Plugin» по умолчанию, что должно облегчить проблему, предоставляя функциональность для устаревшего кода – если один из 49 сценариев, загруженных между jQuery Migrate и Superfish, переписан $.browser почему-то: и здесь мы добираемся до мяса проблемы.

«Скрипты виджета», описанные в вашем ответе, загружают еще больше скриптов и библиотек поверх 68 других на странице, включая различные версии компонентов jQuery и jQuery UI, которые уже загружены вашим сайтом. Сам сайт загружает jQuery v1.12.4, пока «скрипты виджета» загружают v1.9.1. Используя консоль JavaScript вашего браузера, вы можете проверить версию в памяти в конце загрузки страницы, выполнив jQuery.fn.jquery или $.fn.jquery – который на вашем сайте создает 1.9.1 .

Это выявляет проблематичную проблему – «скрипты виджета» из «idxhome» не инкапсулируются должным образом и не загружают jQuery в режиме совместимости. В результате они полностью перезаписывают window.jQuery и window.$ , window.jQuery включают в себя стирание переменной $.browser .browser, что приводит к ошибке суперфиша и нарушению навигации. Другим массивным побочным эффектом является то, что невероятно сложно определить, какой код на вашей странице выполняется, с какой версией jQuery, которая имеет большой потенциал для создания всех причудливых ошибок – особенно, поскольку версия, которую вводят idx-виджеты, почти на 4 года старше, чем загружается ваш сайт.

Как правило, вы можете использовать jQuery.noConflict() jQuery для восстановления переменных jQuery и $ global, поскольку они существовали до того, как что-то еще скрестило их (в этом случае другая библиотека jQuery, загружаемая скриптами виджета) – однако, поскольку каждый виджет idx загружает это собственная библиотека jQuery, даже «резервные копии» этих переменных указывают на неправильный код jQuery после загрузки двух или более виджета.

На стороне примечания относительно кода, который вы опубликовали, стоит отметить, что обычно нет веских оснований размещать HTML, не связанный с текстом (вещи, отличные от таких элементов, как <span> , <strong> и <em> ) внутри Функции перевода WordPress, такие как _e() , поскольку наиболее желательно, чтобы разметка оставалась неизменной независимо от активного языка.


Решения

Если у вас нет намерения изучать WordPress и веб-разработку, вы можете подумать о найме разработчика для оптимизации вашего сайта (комбинирование скриптов и таблиц стилей, удаление ненужных и избыточных, обновление версий, где это выгодно и т. Д.). Это отличный сайт, но он может использовать техническую любовь!

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

В противном случае я бы рассмотрел одно из решений: сами реализуйте виджеты (в идеале проверяйте JavaScript и HTML в удаленных файлах и создавайте короткие коды WordPress для печати более совместимых версий) вместо загрузки этих «скриптов виджета», чтобы вы могли контролировать, какие библиотеки загружаются и как они это делают.

Хаки

Я считаю, что все простые решения – это «хаки», которые добавляют клейкую ленту поверх канатной ленты, и в идеале ее следует избегать на производственной площадке . Среди них:

  • Вручную jQuery.noConflict() , сохраняя глобальные переменные jQuery перед скриптами виджета idx и восстанавливая их впоследствии. Однако, если библиотеки jQuery, вставленные сценариями idx, загружаются асинхронно, есть вероятность, что восстановление произойдет слишком рано, а библиотека idx jQuery все еще может перезаписать экземпляр сайта:

    До:

     <script type="text/javascript"> window._wpse232741_jQuery = window.jQuery; </script> 

    После:

     <script type="text/javascript"> window.jQuery = window.$ = window._wpse232741_jQuery; </script> 
  • Поскольку $.browser устарел 3+ года назад, кажется, что ваш сайт использует устаревшую версию суперфиша. Обновление его к тому, которое не полагается на $.browser должно удалить ошибку (хотя проблема конкурирующих библиотек jQuery останется).

  • Выполните скрипт jQuery Migrate (снова), ответственный за настройку jQuery.browser после скриптов виджета (хотя проблема с конкурирующими версиями еще сохраняется, и все еще есть вероятность, что если скрипты IDX, загружающие jQuery асинхронно, могли бы сломать это):

    После:

     <script type="text/javascript" src="/wp-includes/js/jquery/jquery-migrate.min.js?ver=1.4.1"></script> 
  • Вы должны иметь возможность поддерживать правильную версию jQuery, применяя jQuery.noConflict() где IDX не удалось – еще раз, если IDX jQuery загружается асинхронно, это может не сработать.

    После каждого IDX <script> Element:

     <script type="text/javascript">jQuery.noConflict(true);</script>