Переключатель стилей JavaScript в Wordpress

Я пытаюсь реализовать простой переключатель стилей на основе Toggle в Wordpress. Решение изначально было написано для HTML. Его можно найти здесь.

Там можно найти необходимые файлы .js. Посмотрите комментарии Витча ниже, чтобы исправить одну ошибку в файле stylesheetToggle.js.

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

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

Все файлы находятся в корне папки моей темы, для простоты.

Я добавил это в свой functions.php:

function wpb_adding_scripts() {
wp_register_script('stylesheetToggle', get_template_directory_uri() . '/stylesheetToggle.js', array('jquery'),'1.1', false);
wp_enqueue_script('stylesheetToggle');
}

add_action( 'wp_enqueue_scripts', 'wpb_adding_scripts' );   

function wpb_adding_styles() {
wp_register_style('contrast', get_stylesheet_directory_uri() . '/contrast.css');
wp_enqueue_style('contrast');
wp_register_style('white', get_stylesheet_directory_uri() . '/style.css');
wp_enqueue_style('white');
}

add_action( 'wp_enqueue_scripts', 'wpb_adding_styles' );  

Затем в своем index.php я добавил (вверху, над get_header(); ?>):

<?php wp_enqueue_script("stylesheetToggle"); ?>

В моем header.php я добавил:

<link rel="stylesheet" type="text/css" href=" ... /style.css" title="white">
<link rel="alternate stylesheet" type="text/css" href=" ... /contrast.css" title="contrast">
<?php wp_enqueue_script("stylesheetToggle"); ?>

ПРИМЕЧАНИЕ. URL-адреса таблиц стилей должны быть абсолютными путями.

Это также входит в header.php, между концом «головы» и началом «тела»:

<script>
jQuery.noConflict();
  jQuery(document).ready(function($) {
  $(function()
    {
        // Call stylesheet init so that all stylesheet changing functions 
        // will work.
        $.stylesheetInit();

        // This code loops through the stylesheets when you click the link with 
        // an ID of "toggler" below.
        $('#toggler').bind(
            'click',
            function(e)
            {
                $.stylesheetToggle();
                return false;
            }
        );

        // When one of the styleswitch links is clicked then switch the stylesheet to
        // the one matching the value of that links rel attribute.
        $('.styleswitch').bind(
            'click',
            function(e)
            {
                $.stylesheetSwitch(this.getAttribute('rel'));
                return false;
            }
        );
    }
);
});
</script>

В моем соответствующем файле шаблона я добавил:

<a href="#" id="toggler">Focus mode</a>

РЕЗУЛЬТАТ: теперь это работает благодаря Витчу и Дэвиду.

URL страницы: http://thiscouldbeparadise.org/change/

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


person Ian Douglas    schedule 06.08.2014    source источник


Ответы (2)


Я просмотрел ваш URL и думаю, что вижу проблему...

Попробуйте изменить строку 25 кода styleswitcher с:

$('link[@rel*=style][title]')

To:

$('link[rel*=style][title]')

Я думаю, что @ больше не нужен в последних версиях jQuery и может вызывать проблемы (я написал код переключателя стилей, но это было много лет назад, и с тех пор jQuery сильно изменился). Дайте мне знать, когда вы обновите свой URL-адрес, и при необходимости я обновлю свою копию скрипта, чтобы другие люди не столкнулись с той же проблемой...

Я также заметил, что на вашей странице я в настоящее время не вижу две таблицы стилей («по умолчанию» и «контрастность»), которые вы пытались добавить. Убедитесь, что вы правильно добавляете их на страницу...

person vitch    schedule 07.08.2014
comment
Спасибо, Вич. Я изменил его, а также добавил свой css по умолчанию в functions.php с именем white (см. мой исходный пост выше). Я изменил header.php, чтобы отразить это. Прямо сейчас нажатие режима фокусировки, который является моим переключателем, ничего не делает. Но он не прыгает по странице, как раньше, и это хорошо. - person Ian Douglas; 07.08.2014
comment
Попытался добавить '‹link rel=white type=text/css href=/style.css title=white› ‹link rel=contrast type=text/css href=/contrast.css title=contrast›' на page.php, single .php, index.php и _page-cover-wrap.php (где находится переключатель режима фокусировки). Не имеет значения. - person Ian Douglas; 07.08.2014
comment
Я вижу, что код был дважды выведен на вашу страницу! Если вы просмотрите исходный код и найдете ‹ссылку, вы сможете увидеть, где... Кроме того, они должны иметь rel="alternate stylesheet", а не rel="white", как вы сделали... - person vitch; 07.08.2014
comment
Наличие «‹link rel=stylesheet type=text/css href=/style.css title=white› ‹link rel=alternate stylesheet type=text/css href=/contrast.css title=contrast›» в любом месте приводит к слишком большому количеству переадресаций. ошибка. Я пробовал несколько комбинаций. Чтобы уточнить: а) Это должно быть в header.php, в теге head, верно? б) Он тоже должен быть где-то на моей странице. Я попытался вставить single.php, page.php и _post-cover-wrap.php, где появляется режим Focus, предполагаемый переключатель. После изменения ссылки на таблицу стилей и альтернативную таблицу стилей я получаю ошибку перенаправления. - person Ian Douglas; 07.08.2014
comment
Нужен ли мне код в index.php (см. мой исходный вопрос выше), а также вызов скрипта в header.php? - person Ian Douglas; 07.08.2014
comment
Витч, я обнаружил, что вам не нужно помещать код Link rels в single.php для работы переключателя. Header.php достаточно. Мне просто нужны были абсолютные URL-адреса. Теперь переключается отлично, и куки работают. Мне нужно исправить только одну ошибку ERR_TOO_MANY_REDIRECTS, которая замедляет сканирование сайта. - person Ian Douglas; 07.08.2014
comment
Для ERR_TOO_MANY_REDIRECTS я только что посмотрел в веб-инспекторе, и похоже, что вы пытаетесь загрузить таблицу стилей по адресу thiscouldbeparadise.org/wp-content/themes/ink-child/, которого не существует. И, вероятно, что-то не так с настройкой страницы ошибки 404 в WordPress. Я бы предложил задать еще один вопрос об этих проблемах, поскольку он не связан с первоначальным вопросом. - person vitch; 07.08.2014
comment
Спасибо, Витч, за всю твою помощь. Теперь работает. Я только что создал файл ink-child/contrast.css. Как ни странно, в файлах моей темы нигде нет упоминаний об этом. Я искал. Я также искал все плагины и базу данных. Поэтому я не могу представить, как загружается этот файл. Он по-прежнему отображается в Source в Chrome и Firefox даже после очистки кеша страниц. Во всяком случае, переключатель работает, и страница загружается нормально, только с небольшой ошибкой Jetpack. Спасибо еще раз - person Ian Douglas; 07.08.2014

у вас ошибка в скриптах wp_enqueue

wp_enqueue_script('stylesheetToggle.js');

должно быть

wp_enqueue_script('stylesheetToggle');

также файл, который вы загружаете, не должен конфликтовать с jquery, самый простой способ сделать это - заменить каждый символ $ словом jQuery в ваших файлах (два файла, которые вы ставите в очередь).

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

Также проверьте файлы js с помощью jsfiddle, у него есть удобная кнопка подсказки (для этого в коде js нет php vars).

Отправьте ответ, если у вас все еще есть проблемы.

person David    schedule 06.08.2014
comment
Спасибо, Дэвид. Я поменял очередь. Я пытался реализовать отсутствие конфликта, но я думаю, что делаю это неправильно. Нужно буквально находить/заменять $ на jQuery в каждом случае? Включая первую строку? Файл .js находится здесь: pastebin.com/wwE8674i Другой файл, который я ставлю в очередь, это файл .css. . Я проверил пути. Мне кажется, все в порядке. Я пытался заставить jsfiddle работать, но потерпел неудачу. Это здесь: jsfiddle.net/immanence/F9HLk/1 я заметил во второй функции, которую я Добавляю в functions.php у меня был wp_register_script. Я изменил это на wp_register_style. Точно так же wp_enqueue_style - person Ian Douglas; 06.08.2014
comment
нет, это нормально сделать так, как это есть в вашем файле. Проверьте консоль и начните работать с ошибками. Также get_template_directory_uri() не принимает параметры, поэтому вам нужно get_template_directory_uri().'/yourfile.php' - person David; 06.08.2014
comment
Спасибо, Дэвид. Я отредактировал свой исходный вопрос, чтобы отразить ошибки, которые теперь исправлены. Итак, выше приведен код, который я использую, и где. Я добавил / к href в моем header.php, что, похоже, устранило ошибки Too Many Redirects. На данный момент ошибок консоли нет. Но переключатель не работает. Я думаю, потому что я не назвал это. Мне, собственно, непонятно, как это назвать и где. Итак, прогресс, но еще не разрешение. Обратите внимание, что я не включаю скрипт в заголовок. Это производило перенаправления. Кроме того, теперь на странице загружается пользовательский стиль CSS, а не мой стиль по умолчанию. - person Ian Douglas; 06.08.2014
comment
удалите тег ‹script›. Также код здесь: kelvinluck.com/assets/jquery/styleswitch/toggle.html куда вы это добавили? это изменено на отсутствие конфликта? - person David; 06.08.2014
comment
Я добавил скрипт (см. мой исходный пост выше) в header.php. надеюсь правильно. Что касается кода, я не знаю, что с ним делать. Куда это должно идти? Должен ли я обернуть его: 'jQuery (document).ready (function ($) { // code. });' - person Ian Douglas; 06.08.2014
comment
попробуйте переместить его ниже заголовка в тегах скрипта. Также сделайте то же самое для no.conflict либо измените $ на jQuery, либо добавьте $ в теги функций и добавьте (jQuery). $(функция - это готовый метод документа, так что он уже есть, но если вы вызываете его до загрузки jQuery, он не знает себя. - person David; 07.08.2014
comment
Я отредактировал свой вопрос, чтобы включить этот сценарий. Я не знаю, правильно ли я это делаю. Во всяком случае, я попытался добавить в header.php. В голове и теле. Ни то, ни другое не имеет значения. - person Ian Douglas; 07.08.2014
comment
На случай, если это поможет, я добавил URL-адрес страницы в свой основной вопрос внизу. - person Ian Douglas; 07.08.2014
comment
избавиться от $.noConflict(); - person David; 07.08.2014
comment
Сделанный. Прямо сейчас этот код находится между /head и body. Я получаю ошибки в консоли Chrome, смысл которых вообще не понимаю - person Ian Douglas; 07.08.2014
comment
проверьте свои URL-адреса в ссылках на таблицы стилей, возможно, лучше создать абсолютный URL-адрес с помощью get_stylesheet_directory_uri(); или подобное. - person David; 07.08.2014
comment
Это работает, Дэвид! Большое спасибо! Я изменил все значения в header.php на абсолютные URL-адреса, но не в functions.php, так как абсолютное значение, казалось, создавало дополнительные ERR_TOO_MANY_REDIRECTS в консоли. Я все еще получаю сообщение Не удалось загрузить ресурс: net::ERR_TOO_MANY_REDIRECTS, от которого я не знаю, как избавиться. Кажется, это впервые появилось, когда я установил для Link rel значение «таблица стилей» и «альтернативная таблица стилей», как предложил Витч выше (который написал переключатель HTML). Но это необходимо для кода .js. Ошибка замедляет сканирование сайта. Это последняя ошибка, но важная - person Ian Douglas; 07.08.2014
comment
Все работает сейчас. Большое спасибо за вашу помощь. Я постараюсь отметить оба ответа (ваш и Витча) как ответы, так как оба были важны - person Ian Douglas; 07.08.2014
comment
отличная работа. Может быть, отметьте Витча, если он будет достаточно любезен, чтобы обновить ссылку на свой код и включить вызов шаблона, дружественный к wp. Возможно, таким образом вы поможете большему количеству людей. - person David; 07.08.2014
comment
Отличная идея! :) Спасибо, Дэвид! - person Ian Douglas; 07.08.2014