Все записи автора Profer

программист

Меняем админку

Наверняка многие сталкивались с проблемой разделения прав, если на блоге открыта свободная регистрация для того, чтобы люди что-то писали или постили свои статьи. Часть функционала реализует Role Manager, он позволяет существующими ролями, добавлять или убирать полномочия, изменять уровень и создавать новые роли и способности. Но если необходимо, например, ограничить возможность пользователя постить только в определённые категории или убрать определённые элементы в меню админки, то тут нужны другие решения, именно их мы и рассмотрим. Для ограничения доступа к рубрикам можно воспользоваться плагином Level2Categories. На странице настроек не много, выбирается рубрика и выставляется уровень, который должен быть у пользователя, чтобы он мог постить в данную категорию (уровень пользователя можно, например, задавать через Role Manager). При публикации пользователь увидит в списке только те категории, в которые он может отпостить.

Для изменения вида админки есть отличное решение в виде плагина Adminize. Функционал его весьма широк, так что можно отточить отображение админки по своему вкусу.

Нас интересуют разделы Menu Options и Write options – Post. Первый отвечает за отображение пунктов главного меню, а второй – за отображение элементов интерфейса при публикации. Всё достаточно просто, ставим напротив не нужного нам пункта галочку у соответствующей роли, и она больше не будет отображаться в админке. Весьма удобный вариант, если , например, все посты пользователей должны быть в одной рубрике, то можно убрать отображение рубрик в плагине, а в настройках «Написание» поставить основной рубрикой для записей ту рубрику, которая вам необходима. Настроив тем самым админку, можно избавить пользователя от лишних элементов и акцентировать всё внимание только на главном, например вот так:

Важный момент: если вы захотите удалить плагин, то сперва удалите все настройки на странице с настройками плагина, иначе после удаления плагина все изменения никуда не денутся.

Расширяем регистрацию

Сегодня я расскажу, как расширить регистрацию дополнительными полями и подружить эти поля с ajax-login(удобный плагин, позволяющий выводить форму регистрации и логина непосредственно на страницу).

Для расширения регистрации я нашёл два плагина: DRegister и Register Plus.

Первый самый простой, в нём есть возможность только добавлять поля при регистрации и выбрать пункт, обязательны ли эти поля для заполнения или нет. Есть один нюанс – ключ (имя) поля плагин составляет из приставки dr_ и названия поля, которое вы введёте, но русский язык не воспринимается, поэтому я рекомендую сначала заполнить название на латинице, а потом уже поменять его на русское.

DRegister опции
Поля DRegister при регистрации
Поля DRegister в профиле пользователя

Второй обладает более расширенными настройками, среди которых такие как:

  • 1) Возможность добавления капчи
  • 2) Настройка письма уведомления пользователя
  • 3) Регистрация только по инвайт-кодам
  • 4) Вывод лицензионного соглашения
  • 5) Добавление дополнительных полей не только при регистрации, но и просто в персональные настройки пользователя.

Здесь та же проблема, что и в первом плагине, нужно писать имена полей на латинице, иначе поле останется вообще без имени.

Register Plus опции
Поля Register Plus при регистрации
Добавление дополнительных полей

После добавления нужных нам полей перейдём к ajax-login, чтобы научить его работать с ними. Открываем папку с плагином, нам понадобятся файлы ajaxlogin.js (проверяет и передаёт данные php-скриптам, а так же выводит результат в виде сообщения), al_template.php (отвечает за вывод форм на страницу) и register.php (производит регистрацию).

Сперва посмотрим как же называются наши дополнительные поля, в случае с DRegister их названия пишутся на странице настройки в виде meta_key: dr_deatelnost (dr_deatelnost и будет именем нашего поля), в плагине Register Plus имя поля будет таким же, как вы его задали, т.е если назвали Pol, то и имя будет Pol. Эти имена нам понадобятся в дальнейшем, чтобы по ним сохранять данные. а так же извлекать их впоследствии. У меня это два поля: dr_(специальность) и dr_deatelnost(деятельность).

Начнём с шаблона (al_template.php). Форма регистрации - al_registerForm, изменяем её. Она изначально была у меня изменена, т.к. подгонялась под шаблон, приведу её пример.

<div class="al_nodisplay" id="al_register">

<div id="al_register" class="al_nodisplay">
<h2>Регистрация</h2>
<div>
<center>
 <form name="al_registerForm" onsubmit="return false;" id="al_registerForm" action="#" method="post">
 <label><input style="width: 140px;margin-bottom:5px;color:#666;text-align:center;" value="имя пользователя" onfocus="if(this.value=='имя пользователя') this.value='';" onblur="if(this.value=='') this.value='имя пользователя';" onkeypress="return al_loginOnEnter(event);" onkeypress="return al_registerOnEnter(event);" type="text" name="user_login" size="18" tabindex="7" /></label><br />
 <label><input style="width: 140px;margin-bottom:5px;color:#666;text-align:center;" value="e-mail" onfocus="if(this.value=='e-mail') this.value='';" onblur="if(this.value=='') this.value='e-mail';" onkeypress="return al_loginOnEnter(event);" onkeypress="return al_registerOnEnter(event);" type="text" name="user_email" size="18" tabindex="8" /></label><br />
 <input type="button" style="color: #4D5159;margin-bottom:15px;width: 145px" name="submit" value="<?php _e('Регистрация'); ?>" size="18" tabindex="11" onclick="al_register();"/>
 <br/>
 <span id="al_registerMessage">пароль будет отправлен на ваш e-mail.</span><br/>

<a href="javascript:al_showLogin();">Войти</a> | <a href="javascript:al_showLostPassword();">Забыли пароль?</a>
 </form>
</center>
</div>
</div>

</div>

Выглядит так:

AjaxLogin изменённая форма регистрации

А теперь добавляем наши дополнительные поля, которые мы ввели через плагин.

... /></label><br />

<label><input style="width: 140px;margin-bottom:5px;color:#666;text-align:center;" value="ваша должность" onfocus="if(this.value=='ваша должность') this.value='';" onblur="if(this.value=='') this.value='ваша должность';" type="text" name="dr_" value="" tabindex="9"></label><br />
<label> 
<select name="dr_deatelnost" style="margin-left:5px;width: 144px;margin-bottom:5px;color:#666;text-align:center;" tabindex="10">
 <option value=""> деятельность</option>
 <option value="творческая">творческая</option>
 <option value="научная">научная</option>
 <option value=" учебная"> учебная</option>
 <option value="предпринимательская">предпринимательская</option>
 <option value="Другое">Другое</option>
</select>
</label><br />
 
 <input type="button" ...

Первое поле я сделал обычным текстовым, а второе поле с возможностью выбора, но это уже дело каждого. Оформление так же меняем как душе угодно, главное не забываем про имена (name="dr_deatelnost"), по ним мы будем получать данные.

Форма регистрации с добавленными полями

Перейдём к отлову наших данных (ajaxlogin.js). Находим строчки:

if (al_registerForm.user_email.value == '') {
 alert("Пожалуйста, введите e-mail адрес!");
 al_registerForm.user_email.focus();
 return;
}
al_sack.setVar("user_login", al_registerForm.user_login.value);
al_sack.setVar("user_email", al_registerForm.user_email.value);

добавив свои, получим:

if (al_registerForm.user_email.value == '') {
 alert("Пожалуйста, введите e-mail адрес!");
 al_registerForm.user_email.focus();
 return;
}
if (al_registerForm.dr_.value == '' || al_registerForm.dr_.value == 'ваша должность') {
 alert("Пожалуйста, введите специальность!");
 al_registerForm.user_email.focus();
 return;
}

al_sack.setVar("user_login", al_registerForm.user_login.value);
al_sack.setVar("user_email", al_registerForm.user_email.value);
al_sack.setVar("dr_", al_registerForm.dr_.value);
al_sack.setVar("dr_deatelnost", al_registerForm.dr_deatelnost.value);

Последние 2 строчки – это наши новые данные, так же я добавил проверку на незаполненость поля должности, опять таки дело творчества :).

И непосредственно сама регистрация (register.php). Снова ищем нужные нам строчки:

$user_login = sanitize_user( $_POST['user_login'] );
$user_email = apply_filters( 'user_registration_email', $_POST['user_email'] );

Добавляем после них:

$user_dr = $_POST['dr_'];
$user_deatelnost = $_POST['dr_deatelnost'];

Мы получили данные, теперь их нужно занести, ищем дальше wp_new_user_notification($user_id, $user_pass); и после неё через функцию update_option() обновляем данные по пользователю:

update_option('dr_', $user_dr);
update_option('dr_deatelnost', $user_deatelnost);

Теперь можно опробовать нашу регистрацию, данные должны вноситься в настройки пользователя, теперь осталось разобрать как их выводить. Приведу пример как это сделать на комментариях. За вывод метаданных отвечает the_author_meta(), первый параметр – имя поля, которое хотим вывести, второй – id пользователя. Вставляем в шаблон вывода комментариев (comments.php, если же комментарии выводятся через <?php wp_list_comments(‘callback=имя_функции’);?>, то идём в functions.php и ищем функцию с этим именем) в нужное место код с названием нужного нам поля(в моём случае dr_): <?php the_author_meta('description', $comment->user_id); ?>

Вывод данных в комментариях

Так же можно отправить введёные данные по почте пользователю(только в плагине Register Plus), чтоб он знал, что ввёл, а то мало ли забыл :). Достаточно заполнить форму как хочется, подставив в нужные места теги, которые будут заменяться на вводимые данные.

Изменение уведомительного письма

Так же советую не только чётко следовать инструкциям, но и поэксперементировать с плагинами и их кодом, так что удачи ;).

Разделяемый контент

Был у меня такой запрос от заказчика, чтобы контент был различный, в зависимости от того, где пользователь находится. Суть такова: на главной отображаются ссылки на новости и Статьи(соответственно рубрики «Новости» и «Статьи»), а так же список рубрик(конкретно – марки автомобилей, например «Ford»), при нажатии на которые ссылки, которые вели на общие новости и статьи, теперь должны вести на подрубрики новости и статьи из выбранной рубрики автомобиля, но есть одна особенность: новости и статьи – это подрубрики моделей авто, которые соответственно подрубрики марки (выглядит как Ford->Focus->Новости и Ford->Focus->Статьи или Ford->Mondeo->Новости и Ford->Mondeo->Статьи). Помимо этого в сайдбарах так же выводятся по 2 новости и статьи, и они соответственно должны меняться, когда заходишь в рубрику с маркой авто. Весьма интересная задачка, на мой взгляд, делаем :).

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

  • 1) главная страница (отображаем из рубрик «Новости» и «Статьи»)
  • 2) рубрики «Новости» и «Статьи» и посты в них (отображаем из рубрик «Новости» и «Статьи»)
  • 3) страницы (отображаем из рубрик «Новости» и «Статьи»)
  • 4) рубрики машин и их посты (отображаем из подрубрик «Новости» и «Статьи» конкретной марки)
  • 5) подрубрики «Новости» и «Статьи» рубрик автомобилей и их посты (отображаем из подрубрик «Новости» и «Статьи» конкретной марки)

Строим последовательно алгоритм, который и проверяет где мы находимся. Определяем ID текущей рубрики, если находимся непосредственно в рубрике, то всё просто – берём ID по названию рубрики, если же находимся в посте, то берём последовательную иерархию рубрик (по сути «хлебные крошки») и берём саму главную рубрику.

Проверка is_front_page() используется в том случае, если главная – отдельная страница, если же у вас идёт просто вывод постов, то используйте is_home(). После выполнения алгоритма id рубрики сохранится в $id1, а её урл в $cat_url. Так же мы сохранили id в глобальном массиве ($GLOBALS["figna"] :)), чтобы была возможность использовать это значение во всех файлах темы.

Теперь выводим наши ссылки соответствующим образом:

ID 1 и 59 – это номера рубрик «Новости» и «Статьи», вместо них подставте свои. Как видите к ссылке рубрики я дополнительно прикрепил параметр act, который принимает 2 значения news и posts, т.е. в зависимости от этого параметра мы будем выводить посты или новости.

Всё это я прописывал в header.php, следующим для правок идёт archive.php, здесь уже будем разбирать, что же нам надо выводить.

Первым делом отлавливаем параметр act. если его нету, то выводим как обычно. Если параметр есть, то в зависимости от его значения делаем отсев с помощью query_posts. Суть отсева прост: берём все подрубрики нашей марки и отсеиваем по значению имени равного «Новости» или «Статьи».Выглядит это так:

Вставляем это перед основным циклом вывода записей.

Теперь осталось только в сайдбарах тот же отсев сделать, алгоритм практический идентичен, только добавляем ограничение на количество постов showposts=2.

Новости выводятся так же, просто нужно слово «Статьи» поменять на «Новости». Вот таким образом и решилась задачка.

Теги, релевантные заголовку

Итак, как бы было замечательно, если бы теги выдавались не просто обычным списком по популярности, а в зависимости от того, какой заголовок в данный момент на странице. Ведь если в заголовке например название статьи, то выдавались бы тогда теги, связанные именно с этой статьей. Нет ничего сложно, достаточно немного знание php и некоторых функций wordpress. Приступим :).

Разделим задачу на два блока, первый – берём заголовок и разбиваем его на слова, второй – сравниваем получившиеся слова с нашими тегами и выводим те, которые подходят по сравнению.

Первая часть самая лёгкая. За заголовок отвечает функция wp_title, забьём её в переменную, уберём лишние знаки препинания и разбиваем на слова (полноценным словом будем считать часть текста, которая отделена от остальных пробелом).

Приступим к основной части. Чтобы получить список тегов используется функция get_tags. Для надёжности разобьём ещё и теги на слова, ведь порой теги бывают из пары слов. Алгоритм проверки сводим к следующему: необходимо проверить входит ли каждое из наших получившихся слов в название тега или наоборот, входит ли тег в слово. Например, если слово из заголовка муж, то ему соответственно подойдут теги мужчина и мужественный, действительно и обратное. Так же не забудем отсеять слова меньше 3-х букв, т.к. это обычно только предлоги, если их оставить, то от слова на выведутся все теги, содержащие этот слог(например, название, знание и др.). Во всём этом нам помогут функции eregi(ищет вхождение шаблона в строке), mb_strtolower(переводит слова к нижнему регистру в зависимости от используемой кодировки на сайте) и iconv_strlen(находит длину строки, необходимо указать кодировку).

Собственно получившийся код:

Можно добавить ещё сюда проверку, что если нет тегов, то ничего не выводим, ещё можно вместо отсева по количеству букв сделать просто отсев определённых слов, используя в str_replace массив некоторых значений, но основную мысль я донёс, а дальше уже дело вашего творчества ;).

Плагины тестирования: wbquiz и TESTME

Занялся тут вопросом: а какие есть средства для wordpress, чтобы сделать тест? Пользователь должен ответить на несколько вопросов и в итоге получить какой-то результат. Немного пошарив на просторах интернета нашёл два решения, плагины wbquiz и TESTME.

Начнём обзор с первого. Скачиваем плагин и устанавливаем следующим образом:

  • 1) копируем файлы из папки plugins в вашу папку /wp-content/plugins,
  • 2) активируем плагин в панели управления на странице плагинов,
  • 3) создаём шаблон страницы, в котором не забываем использовать стандартный цикл и строчку в нём (пример можно посмотреть в архиве example\wb_quiz_template.php) и закидываем его в папку с используемой темой,
  • 4) создаём страницу через админку, используем для неё наш шаблон,
  • 5) добавляем произвольное поле с именем question_file, а в значение подставляем путь до файла опроса, это может быть абсолютный путь со строны сервера, например Z:\home\myblog\www\wp-content\plugins\wb_quiz_questions.php, или относительный путь от папки /wp-content/plugins, т.е. если ваш файл лежит в этой же папке, то пишем просто wb_quiz_questions.php, если же уровнем выше, то ../wb_quiz_questions.php,
  • 6) собственно создаём сам опрос, используя для примера файл plugins\wb_quiz_questions.php.

Используя стандартные файлы получим такую картину: сам опрос и результат.

Опрос
Результаты опроса

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

Второй же плагин рассчитан на более широкую аудиторию и может похвастаться более широким функционалом. Судите сами:

  • 1) умеет создавать два типа тестов: тесты, где результат зависит от суммы баллов, и тТесты, где каждому ответу присваивается цифра или буква, а результат зависит от того, каких цифр или букв посетитель больше набрал,
  • 2) показывать статистику прохождения тестов (покажет самые популярные тесты, посчитает, сколько человек в день проходит тот или иной тест, а также наглядно продемонстрирует (с графиками), сколько каких ответов получили посетители для каждого теста),
  • 3) позволяет выбрать, кто может проходить тесты: все или только зарегистрированные пользователи,
  • 4) удобный редактор, такой же, как и в обычных постах, так что в описание вы сможете вставить не только текст, но и картинки и оформить так, как вам хочется. Жаль только что для вопросов редактор не используется, так что, если вы хотите вставить изображение или ссылку в вопрос, то придётся прописывать полностью теги в ручную (<img src=””> и <a href=””></a>).

Устанавливается он гораздо легче, просто скопируйте плагин в папку /wp-content/plugins, активируем в админке, и он готов для работы. Заполняем наш тест и вставляем код этого теста в нужную нам запись(например [TESTME 1]).

Редактор
Настройки
Статистика

Поставив на локал и протестив, я остался доволен, но радость долго не длилась. Установил на сайт, заполнил тест, но после прохождения теста результаты не выдавались, а просто выводился белый экран, тобишь страница не работала. Сразу возникло подозрение, что конфликтует с некоторыми плагинами, после выключения некоторых из них выяснилось, что виновником оказался HeadSpace2 (данный плагин меняет title, description, keywords). Плагин ключевой, так что ищем другой путь решения – идём рыться в коде плагина TESTME.

Место вычислено, им оказался файл testme_show.php в месте:

'.$testme_your_score_notice.'

Не хочет работать функция Num_and_Padezh (функция родительного падежа и числительного). Чтож, не смертельно нужная функция, так что можем спокойно убить её :). Меняем весь этот код на:

'.$testme_your_score_notice.'

и теперь всё замечательно работает.

Кто любит похимичить попробуйте wbquiz, ну а для всех я рекомендую TESTME.