Skip to content


Тонкая настройка WordPress

Настраиваем wordpress

Полезные советы по работе с WordPress


В этой статье освещены следующие темы:

  1. Столкнулся с проблемой: когда пытался обновить wordpress до последней версии через админку, кликая по ссылке "обновить автоматчески", получал ошибку примерно такого содержания: "за 30 секунд скачано только 1700000 байт из 2600000, неудача". Оказалось, что шейпер на входящий трафик моего хостера не позволял за 30 секунд (а именно такой timeout был установлнен по умолчанию) стянуть весь диструбитив wordpress-а. Чтобы поменять этот тайм-аут, нужно в файле wp-admin/includes/file.php найти строку
    $response = wp_remote_get($url, array('timeout' => 30));

    и поменять ее, например, на

    $response = wp_remote_get($url, array('timeout' => 60));

    Таким образом, мы вдвое увеличили время ожидания отработки запроса.

    Дополнение от 2010-01-24. Начиная с версии 2.9.1, таймаут по умолчанию уже установлен в 300 сек (или 5 минут). Так что теперь эта проблема будет встречаться намного реже.

  2. Отложенная публикация в wordpress 2.7. Чтобы заметки, запланированные на публикацию в будущем таки появлялись в блоге, нужно в cron добавить вызов скрипта wp-cron.php c параметром check. Значение параметра легко определить, временно добавив перед строкой
    if ( $_GET['check'] != wp_hash('187425') );

    что-то типа

    echo(wp_hash('187425'));

    Тогда, набрав в адресной строке броузера http://<вашблог>/wp-cron.php, можно увидеть значение хеша (46cbe1674da1d2888104482d6ed4f87f). Следовательно, из крона обращаться к http://<вашблог>/wp-cron.php?check=46cbe1674da1d2888104482d6ed4f87f. Естественно, для предотвращения DoS-атак лучше заменить стандартную последовательность 187425 на что-то другое. В WordPress 2.8.2 в файле wp-cron.php уже нет такой проверки, поэтому достаточно его просто вызывать без параметров, например добавив в системный cron что-то такое:

    wget http://avz.org.ua/wp-cron.php -O /dev/null 2> /dev/null
  3. Чтобы удалить из базы данных ревизии постов (промежуточные их версии, которые образовываются в результате внесения изменений и дополнения постов), нужно выполнить такой простой SQL-запрос:
    DELETE FROM wp_posts WHERE post_type='revision';

    Есть еще и более изящный и правильный метод удаления черновых заметок, который описан ниже в комментариях. Другие возможные значения поля 'post_type' – attachment, page, post (для версии 2.8.4). Чтобы вообще запретить создание ревизий, нужно в файл wp-config.php добавить строку

    define('WP_POST_REVISIONS', false);
  4. Если нужно, чтобы вверху над каждым постом отображался один и тот же блок HTML-кода, можно сделать так. Находим файл /wp-content/themes/<имя_темы>/content/content-default.php, и вставляем в него перед вот этой 25-ой строкой
     content-default.php
    

    нужный нам html-блок. Этот блок удобно заключить в конструкцию <div id="myblock">...</div> и в файле со стилями CSS определить атрибуты для нашего блока. CSS-файл находится в директории /wp-content/themes/<имя_темы>/css/ и имеет имя, совпадающее с именем темы и расширение .css. Пример опеределения атрибутов:

    div#myblock {padding-top: 10px; text-align: center}
  5. Если хотим, чтобы блоки с программным кодом красиво выделялись, как в этом посте – качаем и устанавливаем plugin Highlight Source Pro. Поддерживает более 90 языков, включая HTML, PHP, Perl, bash, CSS. Пример использования можно посмотреть на скриншоте.
  6. Если при установке плагинов WordPress ничего не качает и вместо этого спрашивает "информацию для соединения", как на этом скриншоте, то это означает, что он не может получить доступ на запись в каталог /wp-content/plugins и надо проверить права доступа. Запрашиваемая информация для соединения – это атрибуты доступа к FTP-серверу, на котором работает WordPress. Это таким образом WordPress пытается пойти по обходному пути когда видит, что у него нет прямого доступа к файловой системе.
  7. Если нужно отключить авто-замену двойного дефиса на красивое тире (а это бывает нужно, например, при публикации документации по linux-командам, ключи (параметры) которых часто именно и начинаются с '--', т.е. двух дефисов подряд), то нужно немного модифицировать код функции wptexturize. Для этого этот код
    /wp-includes/formatting.php
    $static_characters = array_merge(array('---', ' -- ', '--', ' - ', 'xn–', '...', '``', '\'s', '\'\'', ' (tm)'), $cockney);
    $static_replacements = array_merge(array('—', ' — ', '–', ' – ', 'xn--', '…', $opening_quote, '’s', $closing_quote, ' ™'), $cockneyreplace);
    

    меняем на этот код:

    /wp-includes/formatting.php
    $static_characters = array_merge(array('---', ' - ', 'xn–', '...', '``', '\'s', '\'\'', ' (tm)'), $cockney);
    $static_replacements = array_merge(array('—', ' – ', 'xn--', '…', $opening_quote, '’s', $closing_quote, ' ™'), $cockneyreplace);
    

    Похоже, что и в этой же функции происходит замена трех точек на unicode-символ троеточия и еще какие-то манипуляции с кавычками.

    Update от 2014-12-11: Все вышесказанное, начиная с версии 4.0, уже не актуально, так как formatting.php переписали почти с нуля и ранее упомянутого кода там уже нет. Более идеологически правильный способ избавиться от авто-замены (если честно, меня она просто ужасно бесит – я хочу видеть текст именно в том виде, в котором я его написал) – это добавить в начало файла
    /wp-content/themes/<ИМЯ_ВАШЕЙ_ТЕМЫ>/functions.php вот такой код:

    remove_filter ('the_content', 'wptexturize');
    remove_filter ('comment_text', 'wptexturize');
    remove_filter ('single_post_title', 'wptexturize');
    remove_filter ('the_title', 'wptexturize');
    remove_filter ('the_excerpt', 'wptexturize');

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

  8. Если WordPress живет на сервере с Apache, то для запрета выполнения PHP- и CGI-скриптов в директории, куда wordpress сохраняет пользовательские файлы (/wp-content/uploads), достаточно положить туда файл .htaccess следующего содержания:
    /wp-content/uploads/.htaccess
    <FilesMatch "\.(phtml|php3?|pl|cgi)$">
      Deny from all
    </FilesMatch>

    Это весьма рекомендуется сделать, поскольку снижает риск успешного взлома в случае, если злоумышленнику каким-то образом удастся загрузить php-shell или другие инструменты для своих темных делишек – запустить он их так просто не сможет. Также очень рекомендуется по возможности запрещать в firewall-е установку исходящих соединений с сервера хостинга на удаленные ресурсы.

  9. Для изменения пароля пользователя (например, если он был успешно забыт) достаточно одного простого SQL-запроса. Например, чтобы установить для пользователя admin пароль Gyhusdf3f, делаем так:
    UPDATE wp_users SET user_pass=MD5('Gyhusdf3f') WHERE user_login='admin';
  10. По-умолчанию в исходном коде страниц сайта присутствует META-тег generator, в котором указывается версия WordPress. Выглядит он примерно так:
    <meta name="generator" content="WordPress 3.5.1" />

    Чтобы его убрать, ищем в директории с темой файл functions.php и вставляем в него ближе к началу (но после открывающего тега <?php) следующее:

    /wp-content/themes/theme_name/functions.php
    remove_action('wp_head', 'wp_generator');
    

А напоследок посмотрите на тенденции потребления памяти wordpress-oм:

Потребление памяти wordpress-ом предыдущих версий

Потребление памяти wordpress-ом различных версий

Posted in Веб-приложения.

Tagged with , .


6 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. Namstesee says

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

  2. Igor Bredikhin says

    >> DELETE FROM wp_posts WHERE post_type = «revision»;
    не совсем правильно

    Лучше так
    DELETE `p`, `pm`, `c`, `tr`
    FROM `wp_posts` AS `p`
    LEFT JOIN `wp_postmeta` AS `pm`
    ON `p`.`ID` = `pm`.`post_id`
    LEFT JOIN `wp_comments` AS `c`
    ON `p`.`ID` = `c`.`comment_post_ID`
    LEFT JOIN `wp_term_relationships` AS `tr`
    ON `p`.`ID` = `tr`.`object_id`
    WHERE
    `p`.`post_type` = ‘revision’;

  3. Admin says

    Похоже на то.
    запрос DELETE FROM wp_posts WHERE post_type = "revision" находит 46 строк. А при выполнении запроса, предложенного Igor Bredikhin, mysql сказал "92 rows affected", то есть в 2 раза больше. Посты после этого проверил - вроде все на месте, ничего лишнего не удалилось.

  4. Igor Bredikhin says

    Запрос
    DELETE FROM wp_posts WHERE post_type = «revision»
    оставляет осиротевшими связанными записи в wp_postmeta и wp_term_relationships

  5. Елена says

    Интересно, я попробую.

  6. Admin says

    Кстати, еще полезняшка недавно пригодилась: если при обновлении WP пишет "Another update is currently in progress" и это напрягает, то можно выполнить такой SQL-запрос:

    DELETE FROM wp_options WHERE option_name='core_updater.lock'

    Чтобы wordpress "забыл", что он уже обновляется и чтобы можно было запустить процесс с нуля еще раз.

You must be logged in to post a comment.