Блог Страница 191

Изменение цикла и сайдбара в стандартной теме

0

В данной статье мы несколько абстрагируемся от jQuery и покажем, каким образом можно изменить отображение записей в цикле. Помимо этого, мы также внесем некоторые интересные коррективы в сайдбар.

Изменение цикла

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

С помощью свободно распространяемого векторного редактора с открытым исходным кодом IncSkape я сделал иконку, стилизованную под календарь. В верхней части иконки будет располагаться день, а в нижней – три буквы месяца. Размеры изображения составили примерно 32х32 пикселей. Вместо incSkape вы можете использовать любой другой графический редактор по своему усмотрению – GIMP, Photoshop, Illustrator и т.д. Самые ленивые могут скачать уже готовые варианты иконок в Сети.

Для того чтобы установить созданный календарный фон в тему и отформатировать вывод даты, нам понадобится изменить цикл. Откроем файл loop.php и найдем в нем строку <div class=”entry-meta”>.

Для начала закомментируем вызов произвольной PHP функции twentyten_posted_on и добавим на ее место следующий фрагмент кода:

...
<div>
<?php //twentyten_posted_on();//comment this out ?>
<small>
<?php the_time('d') ?&gt;<br/>
<span><?php the_time('M') ?></span>
</small>
</div><!-- .entry-meta -->
...

Дата выводится на экран с помощью тега шаблона the_time. Формат представления даты может регулироваться различными параметрами, передаваемыми в тег шаблона.

Нам необходимо вывести день (число) и месяц (трехбуквенная аббревиатура). Параметры тега the_time не позволяют добавлять фрагменты HTML кода, поэтому нам придется собирать дату “по частям”, с помощью двух отдельных вызовов the_time. Также нужно удостовериться, что выбранный стиль отображения будет применяться только в данном цикле, исключая любые другие вхождения HTML тега <small>. Для этого мы создали произвольный класс date для тегов <small>, расположенных в цикле. Помимо всего прочего, мы обернули вывод месяца в тег <span>, что позволит нам получить дополнительный контроль над его представлением. В итоге мы пришли к следующему фрагменту кода:

...
 <small>
 <?php the_time('d') ?><br/>
 <span><?php the_time('M') ?></span>
 <!-- by <?php the_author() ?>-->
 </small>
 ...

Теперь откроем файл style.css и добавим в него стилевые правила, отвечающие за вывод даты на экран. Для начала мы установим отступ 40px в заголовках h2, чтобы оставить место под дату. Затем мы поднимем дату на 25px вверх, чтобы она находилась вровень с заголовком. Также мы применим различные стилевые правила для цвета, размера и некоторых других параметров отображения даты.

В итоге стили будут выглядеть следующим образом:

...
/*----------twentyten chapter 3 customizations------------*/
.home .post .entry-title{
padding-left: 40px;
}
.post small.date{
display:block;
background: url(images/dateBackground.png) no-repeat;
margin-top: -25px;
padding-top: 4px;
width: 32px;
height: 32px;
font-size: 20px;
line-height: 12px;
text-align: center;
color: #eee;
}
.post small.date span{
font-size: 10px;
color: #666;
}
...

Результат можно увидеть на следующем скриншоте:

Неплохо, не правда ли?

Изменение сайдбара

Работа с сайдбаром будет на порядок проще. Все, что мы сделаем – это немного изменим представление списков.

Откроем файл sidebar.php в редакторе. Для того чтобы применить определенные стили к сайдбару, нам понадобится добавить новый класс. Назовем его .currentsidebar. Этот класс необходимо применить к спискам ul, которые принадлежат к классу “xoxo”: <ul class=”xoxo”>. Ищем указанную конструкцию в файле sidebar.php (она встретится два раза – приблизительно на 12 строке и на 51) и вносим в нее следующие изменения:

...
<ul class="xoxo currentsidebar">
...
<ul class="xoxo currentsidebar">
...

Теперь откроем файл style.css и внесем в него стили, отвечающие за представление класса .currentsidebar:

...
.currentsidebar li{
    padding: 0;
    margin: 15px 0 20px 0;
}
.currentsidebar li ul li{
    list-style: none;
  padding: 5px 0; margin: 0 0 0 -15px; border-bottom: 1px solid #ddd;
  font-size: 105%;
}
...

Результат показан на скриншоте.

jQuery плагин для постепенного появления дочернего div блока

0

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

...
//устанавливаем новую функцию плагина: authorHover
jQuery.fn.authorHover = function(applyTo) {
  return this.each(function(){
  //в цикле if/else проверяем, был ли передан параметр
  //если никакого параметра не передано, находим дочерний div
  if(applyTo){
    obj = applyTo
  }else{
    obj = "div"; 
  }
  //скрываем дочерний div или переданный селектор
  jQuery(this).find(obj).hide();
  //Для основного обернутого набора устанавливаем hover
  jQuery(this).css("cursor", "pointer").hover(function(){
      //изменяем стили дочернего div или переданного селектора
      //и применяем к нему эффект постепенного появления 
  jQuery(this).find(obj).css("position","absolute")
    .css("margin-top","-10px").css("margin-left","-10px")
    .css("width","400px")
    .css("border", "1px solid #666").fadeIn("slow");
      }, function(){
//постепенное исчезновение дочернего селектора
        jQuery(this).find(obj).fadeOut("slow");
      });
   });
};

Теперь, когда мы создали скрипт jQuery плагина, давайте проверим его работу в нашей теме. Все, что нам потребуется сделать, это подключить новый плагин, названный jquery.authover.js, к теме. Следующий сниппет необходимо разместить ниже хука wp_head:

...
<script type="text/javascript">
jQuery(function(){
  jQuery(".authorName").authorHover();
});
</script>
...

Два следующих скриншота демонстрируют постепенное появление блока div:

Untitled

0

Фильтры форм jQuery

0

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

:input jQuery(“form:input”).css(“background”, “#f60”); Заносит в выборку все элементы ввода, текстовые области, кнопки и элементы выбора для форм
:text jQuery(“form:text”).css(“background”, “#f60”); Заносит в выбору все элементы ввода, которые имеют тип text
:password jQuery(“form:password”).css(“background”, “#f60”); Заносит в выборку все элементы ввода, которые имеют тип password
:radio jQuery(“form:radio”).css(“background”, “#f60”); Заносит в выборку все элементы ввода, которые имеют тип radio
:checkbox jQuery(“form:checkbox”).css(“background”, “#f60”); Заносит в выборку все элементы ввода, которые имеют тип checkbox
:submit jQuery(“form:submit”).css(“background”, “#f60”); Заносит в выборку все элементы ввода, которые имеют тип submit
:image jQuery(“form:image”).css(“background”, “#f60”); Заносит в выборку все изображения (классифицируется как фильтр для форм, однако используется и для регулярных изображений)
:reset jQuery(“form:reset”).css(“background”, “#f60”); Заносит в выборку все элементы ввода, которые имеют тип reset
:button jQuery(“form:button”) .css(“background”, “#f60”); Заносит в выборку все элементы ввода, которые имеют тип button
:file jQuery(“form:file”).css(“background”,”#f60″); Заносит в выборку все элементы ввода, которые имеют тип file

В следующем примере я использовал подсветку для текстовых полей формы и кнопки submit, как показано на изображении:

...
jQuery(":text, :submit").css("background", "#f60");
...

Фильтры контента jQuery

0

Следующие фильтры, с которыми мы будем работать, это фильтры контента. Фильтры контента позволяют задать выборку, основываясь на различных типах элементов и информации. Самый полезный, на мой взгляд, фильтр контента, который я часто применяю в WordPress – это фильтр :has(). Я часто нуждаюсь в выборе элементов, которые что-либо включают в себя; к примеру, теги a, которые включают в себя изображения img, или теги p, включающие в себя пункты li, и т.д. Фильтр :has() позволяет задать выборку элементов, основанную на необходимом включении.

Другой полезный фильтр, :content(), позволяет задать выборку элементов, содержащих в себе некоторый текст. С этим фильтром нужно быть очень осторожным. Вы должны быть уверены в том, что правильно задаете элементы и текст выборки. Определение вида …(p:contains(‘my text’))… может быть слишком размытым для страницы с огромным количеством контента. Тем самым, jQuery может значительно увеличить загрузку страницы или попросту зависнуть, разыскивая все элементы с определенным текстом. Следующее определение ..(#divIdName .className a:contains(‘my text’))… является более корректным, поскольку jQuery понадобится разыскивать текст в пределах элементов с конкретным идентификатором и классом.

:has(selector) jQuery(“.post:has(.entry)”) .css(“background”, “#f60”); Заносит в выборку элементы, включающие в себя как минимум один заданный элемент.
:contains(text) jQuery(“.post:contains(‘Hello world’)”).css(“background”, “#f60”); Заносит в выборку элементы, содержащие определенный текст. Примечание: текст чувствителен к регистру!
:empty jQuery(“:empty’)”) .css(“background”, “#f60”); Заносит в выборку элементы, которые не имеют дочерних. Включает в себя текстовые узлы.
:parent jQuery(“:parent’)”) .css(“background”, “#f60”); Заносит в выборку элементы, которые являются родителями других элементов. Включает в себя текстовые узлы.

Для примера давайте посмотрим на сайдбар стандартной темы. Сайдбар включает в себя некоторые элементы, которые не обозначены специальным идентификатором или классом. Если я хочу получить список ul, который находится под заголовком Meta, я могу использовать фильтры :has() и :contains().

...
jQuery(".widget-area li:has(h3:contains('Meta')) ul")
.css("background", "#f60");
...

Результат следующего кода представлен на изображении:

Фильтры видимости jQuery

0

Фильтры, связанные с видимостью элементов, используются более редко, нежели все остальные. Однако, поскольку они входят в стандартный API селекторов/фильтров, мы не можем оставить их без рассмотрения.

Большую часть времени вы будете работать с видимыми элементами. Однако иногда можно столкнуться с необходимостью получения различных скрытых элементов (к примеру, скрытых полей формы). Чтобы осуществить это, вы можете использовать фильтр :hidden. Любые преобразования, которые вы будете производить над скрытыми элементами, останутся незамеченными для вас (если вы, конечно, не измените статус элемента на «видимый»).

:hidden jQuery(“form:input:hidden”) .css(“background”, “#f60”); Фильтр для элементов, которые имеют значение display, равное none, значение type, равное hidden, или обладают явно заданными значениями ширины и высоты, равными 0.
:visible jQuery(“div .post:visible”) .css(“background”, “#f60”); Фильтр для всех элементов, которые являются видимыми.

Управление HTML-элементами, атрибутами и контентом

0

С помощью функций jQuery вы можете работать с различными атрибутами определенных объектов (к примеру, изменять путь к изображениям, редактировать названия классов и идентификаторов и т.д.).

.attr jQuery(“.post”) .attr(); Получает значение атрибута у первого выбранного элемента.
.removeAttr jQuery(“.post a”) .removeAttr(“href”); Удаляет атрибут у каждого из выбранных элементов

Управление элементами и контентом

Раздел Управления в jQuery’s API довольно обширен, однако, опять же, мы затронем лишь некоторые из функций, которые, на мой взгляд, наиболее востребованы в WordPress. К примеру, если вы хотите использовать различные эффекты выезжания или расширения, вам понадобится элемент, который будет обрабатывать возникшее событие. Такой подход избавит вас от необходимости добавлять к каждой записи кнопки управления. С помощью jQuery вы можете размещать и удалять контент, а также различные HTML-элементы, без ручного редактирования кода в шаблонах WordPress.

.append(html & text) jQuery(“.post”) .append(“<b>post ends here</b>”);< Добавляет заданный контент в конец каждого выбранного элемента.
.appendTo(selector) jQuery(“<b>post ends here</b>”).appendTo(” .post”); Делает то же самое, что и предыдущая функция.
.prepend(html & text) jQuery(“.post”) .prepend(“<b>post starts here</b>”);< Добавляет заданный контент в начало каждого выбранного элемента.
.prependTo(selector) jQuery(“<b>post starts here</b>”).prependTo(” .post”); Делает то же самое, что и предыдущая функция.
.after(string) jQuery(“.post”) .after(“<b>This goes after</b>”); Добавляет заданный контент после каждого выбранного элемента и за его пределами.
.insertAfter(selector) jQuery(“<b>This goes after</b>”).insertAfter(” .post”); Делает то же самое, что и предыдущая функция.
.before(string) jQuery(“.post”) .after(“<b>This goes before</b>”); Добавляет заданный контент перед каждым выбранным элементом и за его пределами.
.insertBefore(selector) jQuery(“<b>This goes before</b>”).insertBefore(” .post”); Делает то же самое, что и предыдущая функция.
.wrap(html or functionName) jQuery(“.post”).wrap(“<div class=”.fun” />”); Обертывает каждый выбранный элемент заданным фрагментом кода. Вы можете создать функцию, которая будет выполнять указанное действие.
.wrapAll(HTML) jQuery(“.post”).wrapAll(“<div class=”.fun” />”); Функция похожа по своему действию на предыдущую, единственная разница лишь в том, что она обертывает все выбранные элементы целиком, а не каждый по отдельности.
.wrapInner(selector) jQuery(“.post”).wrapInner(“<div class=”.fun” />”); Функция размещает указанный фрагмент кода внутри каждого выбранного элемента, оборачивая дочерние элементы или любой текст.
.html(HTML & text) jQuery(“.post”) .html(“<h2>Replacement Text</h2>”); Функция производит замену контента и дочерних элементов выбранных пунктов на контент, указанный в параметре.
.text(text only–HTML chars will be escaped) jQuery(“.post”) .text(“Replacement Text”); Функция похожа по действию на предыдущую, но работает только с текстом. Любые HTML символы будут преобразованы в ASCII-коды.
.empty(selector) jQuery(“.post”).empty(” .entry”); Удаляет любой контент и дочерние элементы у выбранного элемента. Сам элемент остается.
.remove(selector) jQuery(“.post”).remove(); Функция действует аналогично предыдущей, с той лишь разницей, что удаляет и сам элемент.
.clone(selector) jQuery(“.post”).clone(); Создает копию выбранных элементов.

Ниже представлен пример простого использования функции .append():

...
jQuery(".post").append("<div style='text-align:right; border-bottom: 1px solid #333'>End of Post</div>");
...

В результате каждая запись получит следующее обрамление:

Управление CSS и элементами DOM

0

В прошлых статьях мы рассмотрели, каким образом можно создать необходимые выборки. Теперь же мы перейдем к их управлению. Мы можем устанавливать и изменять стилевые правила CSS, а также работать непосредственно с элементами DOM. Начнем мы с управления CSS.

Управление CSS

Благодаря моим предыдущим примерам, вы уже знакомы с функцией css(). Данная функция используется для присвоения стандартных CSS правил, таких как background (фон), border(рамка) и т.д. Любое правило, существующее в CSS таблицах, всегда можно установить через функцию css(). Помимо этого, с помощью данной функции вы также можете найти и получить различные CSS правила.

Attributes API jQuery включает в себя и другие, не менее полезные функции, предназначенные для манипулирования CSS стилями. Три следующие функции – addClass, .removeClass и .toggleClass – предлагают богатые возможности по приданию динамичности вашему WordPress сайту. Рассмотрим подробнее функции для управления CSS стилями:

.css(‘property’, ‘value’) jQuery(“.post”) .css(“background”, “#f60”); Добавляет или изменяет CSS правила у выбранных элементов
.addClass(‘className’) jQuery(“.post”) .addClass(“sticky”); Добавляет класс или несколько классов к каждому из выбранных элементов
.removeClass(‘className’) jQuery(“.post”) .removeClass(“sticky”); Удаляет класс или несколько классов у каждого из выбранных элементов
.toggleClass(‘className’, switch-optional) jQuery(“.post”) .toggleClass(“sticky”); Переключает класс или несколько классов у выбранных элементов в зависимости от их текущего состояния. Если класс уже существует, он будет удален, иначе – добавлен.
.hasClass(‘className’) jQuery(“.post”) .hasClass(“sticky”); Возвращает логическое значение true или false, если указанный класс (или несколько классов) существуют у каждого из выбранных элементов.

В качестве примера мы сделаем все записи в блоге прилепленными, т.е. присвоим им класс .sticky с помощью функции addClass():

...
jQuery(".post").addClass("sticky");
...

Результат представлен на изображении:

Создание сворачивающихся разворачивающихся записей в WordPress с помощью функций анимации jQuery

0

Отлично, мы с вами вплотную подошли к созданию нашего первого проекта. Несмотря на внешнюю простоту реализации, он потребует от нас использования практически всего изученного ранее материала. Мне всегда нравилась возможность WordPress <!–more->, которая позволяет получать “сжатые” варианты записей – так называемые цитаты (анонсы), выводимые на основной странице с записями. Ее удобство ни в коем случае мной не оспаривается. Я лишь хочу привести пример ситуации, в которой использование <!–more-> не позволяет достичь нужного результата. Допустим, что мой блог обладает довольно короткими записями, и я хочу, чтобы пользователь увидел как можно больше заголовков без необходимости использовать прокрутку страницы (мы отвлечемся от реальности и предположим, что все заголовки записей ужасно интересны и привлекательны). Каким образом я должен это реализовать?

Наилучшее решение – предложить пользователю развернуть запись, которая заинтересовала его. Вы, вероятно, видели данную возможность на многих сайтах. В частности, указанное jQuery-решение пользуется неизменной популярностью для представления FAQ-записей и пресс-релизов.

Давайте посмотрим, каким образом мы можем сделать это в своей теме. Для начала создадим чистый файл custom-jquery.js в папке с темой.

Первое, что нам понадобится сделать, это скрыть контент наших записей:

jQuery(".post .entry-content").hide();

Затем мы должны создать некоторый элемент управления, который даст возможность пользователям ресурса увидеть скрытый контент. Элемент управления должен иметь интуитивное представление, чтобы человек мог догадаться, что от него требуется в данной ситуации. Добавлять элементы управления к каждой записи вручную через редактор слишком неэффективно (к сожалению, я сталкивался на некоторых сайтах именно с такой реализацией). Мы могли бы привязать элементы управления к странице post.php, однако они отображались бы даже в том случае, если пользователь отключил поддержку Javascript в своем браузере. В конце концов, мы желаем усовершенствовать страницу, и это стоит помнить!

Если посетитель откроет наш сайт в мобильном браузере без поддержки Javascript, либо в браузерах вида text-only или text-to-speech, он должен увидеть контент в своем первоначальном виде, без всяких дополнительных функциональных элементов. Для добавления нашего элемента управления мы будем использовать jQuery. Если Javascript будет отключен, пользователь не увидит никаких усовершенствований.

jQuery(".post").after("<div class='openIt' style='border-top: 1px 
solid #666; color: #036; text-align:right; cursor:pointer;'>Expand</
div>");

Теперь нам потребуется лишь подходящий способ для скрытия и отображения контента записей:

jQuery(".openIt").click(function() {
  jQuery(this).prev(".post").find(".entry").slideToggle("slow");
});

Наконец, добавим инструкции для .openIt div:

jQuery(".openIt").toggle(function(){
        jQuery(this).html("Close")},
      function(){
        jQuery(this).html("Expand")
    });
...

Задача выполнена. Мы получили наше первое полезное jQuery усовершенствование для WordPress. Выглядеть оно будет следующим образом:

Связываем jQuery с WordPress

0

Начиная с WordPress 2.7, многие библиотеки Javascript, в том числе и jQuery, стали по-новому подключаться к теме: через Script API, посредством удобной функции wp_enqueue_script.

Регистрация jQuery в WP-темах

Вы можете активировать jQuery в WordPress двумя различными способами. Первый из них основывается на размещении приведенного ниже кода в файле header.php перед закрывающим тегом </head>.

<?php wp_enqueue_script("jquery"); ?>
<?php wp_head(); ?>
<script type="text/javascript">
//add jQuery code here
jQuery(document).ready(function() {
jQuery("p").click(function() {
alert("Hello world!");
});
});
</script>

Альтернативный вариант: зарегистрировать wp_enqueue_script в файле functions.php. Если ваша тема не имеет functions.php, достаточно создать такой файл и поместить его в корневую директорию, где находятся остальные файлы шаблона темы. Просто добавьте следующий код в файл functions.php:

<?php wp_enqueue_script('jquery');/*this registers jquery*/
function jq_test(){ /*This is your custom jQuery script*/
?>
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery("p").click(function() {
alert("Hello world!");
});
});
</script><?php
}
add_filter('wp_head', 'jq_test');/*this adds your script to the wp_
head() hook in the header.php file and ensures your custom jQuery
script is run*/
?>

Обход проблем с регистрацией jQuery

Первые мои попытки подключения jQuery через wp_enqueue_script неизменно заканчивались неудачей. Библиотека отказывалась работать. После длительного изучения WordPress Codex, я смог выделить для себя следующие факты:

  • Если вы подключаете библиотеку jQuery в файле header.php, удостоверьтесь в том, что функция wp_enqueue_script находится выше, чем функция wp_head. Произвольный jQuery-код должен идти под функцией wp_head.
  • Если вы регистрируете wp_enqueue_script в functions.php, удостоверьтесь, что ее объявление находится перед всеми остальными функциями, которые загружаются через add_filter в wp_head.