WordPress Support

Обманываем спам-скрипты, не давая им регистрироваться в вашем блоге.

Добавлено 6 марта 2010 в категорию Плагины.

В предыдущей статье я описал свои проблемы с удалением кучи зарегистрированных спам-юзеров в блоге, пришло время избавится от регистрации спам-юзеров таким же кардинальным образом, как я избавился от спам-комментариев. Естественно подразумевается, что и регистрации в блоге и написание комментариев осуществляется спам-скриптами, так как защититься от ручного спама весьма и весьма проблематично. Но ручной спам это лишь тысячная доля от всего спама и беспокоиться о нем вряд ли стоит. Метод защиты от авто-регистраций в блоге аналогичен методу защиты от спам-комментариев – будем использовать подмену полей. Причем вся эта защита займет у вас максимум 5 минут, да и то половина из этих 5 минут уйдет на обновление файла wp-login.php на сервере вашего хостера.

За авторизацию и регистрацию в блоге на WordPress отвечает файл wp-login.php. Подменять мы будем поле user_login, оно много где используется в этом скрипте, но нас интересует только регистрация, все остальное мы оставим в первоначальном виде. Открываем файл wp-login.php и ищем строчку:

399
$user_login = $_POST['user_login'];

заменяем ее на:

399
400
401
$user_login = $_POST['user_login'];
	if(!empty($user_login)) wp_die('Спаму нет!');
$user_login = $_POST['real_user_login'];

теперь находим:

414
415
416
417
<p>
	<label><?php _e('Username') ?><br />
	<input type="text" name="user_login" id="user_login" class="input" value="<?php echo esc_attr(stripslashes($user_login)); ?>" size="20" tabindex="10" /></label>
</p>

и заменяем эти строки на:

414
415
416
417
418
419
420
421
<div style="display: none;"><p>
	<label><?php _e('Username') ?><br />
	<input type="text" name="user_login" id="user_login" class="input" value="<?php echo esc_attr(stripslashes($user_login)); ?>" size="20" tabindex="10" /></label>
</p></div>
<p>
	<label><?php _e('Username') ?><br />
	<input type="text" name="real_user_login" id="user_login" class="input" value="<?php echo esc_attr(stripslashes($user_login)); ?>" size="20" tabindex="10" /></label>
</p>

Вот, собственно, и все. Что мы сделали? Мы добавили новое текстовое поле для ввода логина под именем "real_user_login", а старое поле "user_login" сделали невидимым. И встроили проверку на заполненность этого невидимого текстового поля. В итоге получается, что человек не заметит ни малейшей разницы при регистрации в блоге, а вот спам-скрипт заполнит именно поле "user_login" и получит ошибку регистрации "Спаму нет!". Для полной уверенности в том, что спам-регистрации больше не пройдут измените название поля "real_user_login" на любое другое, не содержащее слово "user_login".

Но что делать, когда за авторизацию и регистрацию в блоге отвечает сторонний плагин? Например, популярный плагин Themed Login and Register? Да абсолютно тоже самое, по аналогии с приведенным хаком. В качестве примера приведу изменения и для Themed Login and Register, открываем файл плагина themed-logreg.php и ищем строчку:

869
<label for="user_login"><?php _e('Username:') ?></label><br /> <input type="text" name="user_login" id="user_login" size="20" maxlength="20" value="<?php echo wp_specialchars($user_login); ?>" /><br /></p>

заменяем ее на:

869
870
871
872
<div style="display: none;">
<label for="user_login"><?php _e('Username:') ?></label><br /> <input type="text" name="user_login" id="user_login" size="20" maxlength="20" value="<?php echo wp_specialchars($user_login); ?>" /><br />
</div>
<label for="user_login"><?php _e('Username:') ?></label><br /> <input type="text" name="real_user_login" id="user_login" size="20" maxlength="20" value="<?php echo wp_specialchars($user_login); ?>" /><br /></p>

теперь находим:

783
$user_login = sanitize_user( $_POST['user_login'] );

и заменяем на:

783
784
785
$user_login = sanitize_user( $_POST['user_login'] );
	if(!empty($user_login)) wp_die('Спаму нет!');
$user_login = sanitize_user( $_POST['real_user_login'] );

Вот и все. Таким образом можно исправить любые плагины, которые отвечают за регистрацию пользователей в блоге. Проверить работу данного хака очень легко – удалите текст style="display: none;" из div‘а и попробуйте зарегистрироваться, заполнив первое поле "Логин". Если вы все сделали правильно, то зарегистрироваться вы не сможете.

Напоминаю: от уже зарегистрированных спам-юзеров вы можете избавится с помощью плагина Clean Up Users, а от спам-комментариев с помощью этого метода.

Плагин "WP Sliding Login" добавлят всплывающую форму авторизации.

Добавлено 4 марта 2010 в категорию Плагины.

Плагин WP Sliding Login добавляет небольшую всплывающую панельку с формой авторизации или регистрации в блоге. Не требует никаких усилий по внедрению панельки в шаблон блога: установили плагин и панелька уже выводится в самом верху вашего блога. Плагин совсем новый и недостатки у него есть: нельзя задать цвет панельки (только если вручную раскрасить .png файлы плагина), некоторые слова не переведены и надо вручную их перевести в файле плагина, а также размеры кнопок строго заданы самими картинками кнопок и некоторые слова в переводе вроде "Регистрация" банально не влезают в изображение кнопки. Но несмотря на все эти шероховатости только что выпущенного плагина пользоваться им можно уже сейчас, особенно если вы не слишком сильны в html с php и не можете сами правильно встроить плагин Themed Login Plugin в шаблон вашего блога. 

Скачиваем плагин с его домашней страницы и устанавливаем его:

1. Распаковываем архив.

2. Копируем папку wp-sliding-logindashboard-panel в /wp-content/plugins/.

3. Заходим в админку блога на вкладку "Плагины" и активируем плагин.

Никаких настроек у плагина, как я уже сказал, нет. Активировали плагин – панелька уже есть в вашем блоге. Я проверил несколько шаблонов, везде работает одинаково.

Немногие непереведенные слова в плагине вы можете сами перевести в файле wp-sliding-login-dashboard-panel.php, никаких сложностей с этим возникнуть у вас не должно.

Заметил только один существенный недостаток (хотя для кого как) в плагине: если посетитель неправильно ввел свои данные в форму регистрации и попытался войти, то его перекинет на стандартную страницу WordPress с указанием того, что он ввел неправильный логин. Мелочь, конечно, но хотелось бы, чтобы все формы авторизации были в одном стиле.

 

Автор плагина: Fay

Плагин WordPress "postMash" позволяет сортировать записи в блоге.

Добавлено 1 марта 2010 в категорию Плагины.

Я уже рассматривал плагины сортировки страниц, рубрик и ссылок, теперь настала очередь плагина сортировки записей. К сожалению, приличного плагина сортировки постов не нашлось, а postMash хоть и выполняет свою работу, но по части удобства и функций он явно не дотягивает до приличного уровня. Но, как я уже сказал, других плагинов с требуемым мной набором функций нет, придется работать именно с ним. Сначала скажу зачем он мне вообще понадобился. Есть у меня в блоге прошлогодний пост, который я думаю обновить и при этом хочу, чтобы он заново попал и на главную страницу блога и в RSS ленту. Вот так сходу сможете назвать способы это реализовать, не публикуя этот пост с новой датой? Я не смог, а новую дату у статьи ставить не хочу, так как мне не нравится видеть годовалой давности комментарии у только что опубликованной статьи.

Скачиваем плагин с его домашней страницы и устанавливаем его:

1. Распаковываем архив.

2. Копируем папку postmash в /wp-content/plugins/.

3. Заходим в админку блога на вкладку "Плагины" и активируем плагин.

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

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

60
$pageposts = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_type = 'post' ORDER BY menu_order");

на

60
$pageposts = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_type = 'post' ORDER BY menu_order DESC");

После этого заходим в "ЗаписиpostMash" и жмем кнопку "Update". Дожидаемся появления таблички "Database Updated!". Если с первого раза она не появилась, то жмем еще раз. После этого мы видим все тот же хронологический список статей. Чтобы увидеть обратный хронологический список надо еще раз зайти в "ЗаписиpostMash" (то есть обновить страницу). Увидели этот список, который начинается с последних опубликованных статей? Жмем опять на "Update" до появления "Database Updated!". Теперь и в блоге у вас все записи идут, начиная с последних опубликованных, то есть как до установки плагина вообще.

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

Отсортировали свои записи так, что некоторые из них попали на главную страницу блога? Откройте теперь RSS ленту и убедитесь, что хотя эти посты в ней присутствуют они находятся в конце списка. По вполне понятной причине – сортировка в ленте осуществляется по дате создания поста. Следовательно, весьма сомнительно, что популярные RSS читалки вроде Google Reader покажут записи с устаревшей датой. Чтобы это обойти вы должны зайти в нужные записи и заново их опубликовать, ничего в них не меняя (не меняя даты публикации в первую очередь). Это, конечно, не изменит положение постов в RSS ленте, но это изменит дату их последней модификации (WordPress запоминает последнюю дату изменения записей), а это позволит нам чуточку исправить файл feed-rss2.php, где формируется RSS лента так, чтобы вместо даты создания поста там показывалась дата его последнего изменения. Откройте feed-rss2.php и замените строчку:

39
<pubdate><?php echo mysql2date('D, d M Y H:i:s +0000', get_post_time('Y-m-d H:i:s', true), false); ?></pubdate>

на

39
<pubdate><?php echo mysql2date('D, d M Y H:i:s +0000', get_the_modified_time('Y-m-d H:i:s', true), false); ?></pubdate>

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

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

 

Автор плагина: Joel Starnes

Страница плагина: [ссылка]

Рассматриваемая версия: 1.2.0 от 12.08.2009

Совместимость с версией WordPress: 2.1 и выше.