Тормоза при обновлении WordPress
13.12.2011
При обновлении WordPress до 3.3. сегодня возникла проблема с MySQL. MySQL перестал отвечать на запросы и все остальные сайты на сервере подвисли. Пришлось капать код, который производит upgrade WP. Проблема зарылась в файле в wp-admin/includes/upgrade.php:1942
// Delete duplicate options. Keep the option with the highest option_id.
$wpdb->query("DELETE o1 FROM $wpdb->options AS o1 JOIN $wpdb->options AS o2 USING (`option_name`) WHERE o2.option_id > o1.option_id");
Как можно понять из описания, удаляет дубликаты из таблицы wp_options. Всего лишь ничего… Но при большом количестве данных в этой таблице, запрос оказался слишком уж медленный. Строку пришлось закомментировать… upgrade прошел на ура!
Ускоряем WordPress. Переносим статику на отдельный домен
08.12.2011
Для ускорения сайта на WordPress (да и любого другого) рекомендуется вынести статику на отдельный cookieless домен. Это означает, что обращении за стилями и картинками, браузер не будет отправлять заголовок Cookie, который может быть довольно большим.
Например, есть сайт example.com.
Если зайти на главную страницу (http://example.com/), сервер вернет заголовки, которые будут содержать Cookie: … После загрузки html браузер начнет загружать картинки (т.е. http://example.com/wp-content/themes/classical/images/logo.jpg), стили (т.е. http://example.com/wp-content/themes/classical/style.css), скрипты и т.п. При каждом обращении браузер отправит заголовок Cookie серверу с тем значением, которое получил при загрузки главной страницы. Это увеличивает трафик и повышает нагрузку на сервер. Представьте, что у вас на сайте грузится 100 картинок, стилей и JavaScript’ов. Суммарный объем статики, может не превышать 30Кб, а при этом объем Cookie будет для всех этих файлов может оказаться 5-10Кб (0,5к*100), т.е. трафик увеличится почти на треть! Особенно это заметно, если в дизайне используется много мелких картинок.
Один из вариантов решения, который чаще всего используют – вынос статики на другой домен. Можно использовать субдомен, но это может не помочь если Cookie отправляются на домен example.com (т.е. для всех субдоменов). Домен для статики может быть обычным алиасом от главного, но для браузера это разные адреса. Замена адресов загрузки статики на работающем сайте вручную дело неблагодарное, поэтому есть простые инструменты.
1) Автозамена в html с помощью модуля Nginx ngx_http_sub_module.
Пример конфигурации:
sub_filter 'src="http://example.com/wp-content/uploads'
'src="http://static-example.com/wp-content/uploads';
sub_filter_once off;
Обратите внимание, что указываю src=», что бы сюда не попали href=» и другие атрибуты.
Минусом этого способа является то, что конфигурацию можно использовать только раз. Годится для замены в выводе всех адресов картинок, встроенных в посты. Адреса загрузки статики дизайна нужно сменить в файлах темы.
2) Автозамена с помощью модуля Apache mod_substitute
в httpd.conf (или в файле конфигурации виртуального хоста), или в .htaccess
AddOutputFilterByType SUBSTITUTE text/html
Substitute s|src="http:\/\/example\.com\/wp-content\/uploads|src="http://static-example.com/wp-content/uploads|i
Строк с Substitute можно указать несколько. Используется Regexp. Однако Апач делает это наверняка медленнее, чем Nginx.
Если же у вас используется Fast-cgi, то можно попробовать сделать замену на выводе в PHP с помощью ob_start, но тут большой минус, что при обновлении WP, утерянные строки нужно будет восстанавливать.
Пример index.php
ob_start();
/**
* Front to the WordPress application. This file doesn't do anything, but loads
* wp-blog-header.php which does and tells WordPress to load the theme.
*
* @package WordPress
*/
/**
* Tells WordPress to load the WordPress theme and output it.
*
* @var bool
*/
define('WP_USE_THEMES', true);
/** Loads the WordPress Environment and Template */
require('./wp-blog-header.php');
$contents = ob_get_contents();
on_end_clean();
echo str_replace('src="http://example.com/wp-content/uploads','http://static-example.com/wp-content/uploads',$contents);
?>
Как изменить stylesheet_url в Wordpress
04.11.2011
Столкнулся с проблемой, когда изменения в style.css темы не сразу вступают в силу из-за заголовка Expired, который добавляет nginx. Нашел простое решение динамически менять адрес файла стилей. Тогда при изменениях сразу будет загружаться последняя версия: add_filter("stylesheet_uri", "blogo_stylesheet_uri"); /** Функция добавляет к адресу стиля время последнего изменения */
Добавил такой кода functions.php:
function blogo_stylesheet_uri(){
$stylesheet_dir_uri = get_stylesheet_directory_uri();
$path = get_stylesheet_directory();
$mt = filemtime($path.'/style.css');
$stylesheet_uri = $stylesheet_dir_uri . "/style.css?".$mt;
return $stylesheet_uri;
}
При желании можно сделать адрес типа /wp-content/themes/zzz/style.1123312333.css
и прописать rewrite в nginx.conf
Выбор выделенного сервера с бесплатной установкой
24.09.2011

Подбирал сервер с 8Gb RAM и составил такую табличку, может кому пригодится.
Брал только те предложения, которые включают бесплатную установку и помесячную плату в районе 100 USD.
| Хостер | проц | RAM | HDD | IP | траф | port, Mbit/s | цена, USD | оплата | уст., час |
|---|---|---|---|---|---|---|---|---|---|
| ukrnames.com | Ahtlon II X2 | 8 | 2×250 (Raid 1) | 2 | unlim | 100 | 101 | WM | 72 |
| burst.net | Q6600 | 8 | 1Tb SATA | 5 | 5Tb | 100 | 99,95 | paypal | 72 |
| burst.net | Q9300 | 8 | 1Tb SATA | 5 | 5Tb | 100 | 99.95 | paypal | 72 |
| burst.net | Q9550 | 8 | 1Tb SATA | 5 | 5Tb | 100 | 94 | paypal | 72 |
| exima-online.net | X2 6000+ | 8 | 2×750GB (Raid 1) | 1 | 5Tb | 100 | 93 | WM | 72 |
| exima-online.net | i7-920 | 8 | 2×750GB (Raid 1) | 1 | 10Tb | 100 | 80 | WM | 72 |
| coretek.ru | Q9550 | 8 | 2×500 | 3 | 5Tb | 100 | 94 | WM | 72 |
| cadedic.ru | X3440 | 8 | 2×500 | 5 | 3Tb | 100 | 107 | WM | 72 |
| eurostream.info | X3440 | 8 | 2×1000 (Raid 1) | 1 | unlim | 100 | 95 | WM | 24 |
| eurostream.info | AMD Opteron 1356 | 8 | 2×500 (Raid 1) | 1 | unlim | 100 | 103 | WM | 72 |
| eurostream.info | Athlon II X4 | 8 | 2×750GB (Raid 1) | 1 | unlim | 100 | 75 | WM | 72 |
| server4you.com | Athlon II X4 | 8 | 2×1000 (Raid 1) | 1 | unlim | 100 | 68.99 | paypal | 24 |
| server4you.com | Athlon™ II X4 | 12 | 2×1500 (Raid 1) | 1 | unlim | 100 | 89,95 | paypal | 24 |
Здесь лишь общие критерии, при выборе еще смотрел отзывы.
А какой бы выбрали сервер Вы из этого списка?
Решение проблемы соединения mysql клиента с mysql-proxy
11.03.2011
Уже много лет существует проблема у консольного клиента mysql при соединении с сервером mysql, который запущен на локальном компьютере, но на другом порте, отличном от 3306. Например, если вы хотите соединиться с
# mysql -P 3307 -uroot-pXXX
то получите соединение с основным сервером, который запущен на стандартном порту. Программа mysql упорно игнорирует –port и -P.
В документации утверждается, что нужно указать опцию –protocol=TCP, но и это не всегда помогает. Баги висят аж с 2006 года. Разработчики кричат, что когда соединение идет на локалхост клиент всегда коннектится к mysql.sock, т.е. используется опция –protocol=socket.
Когда я установил mysql-proxy и запустил его на порту 4040, то никак не мог к нему подключиться. Пришлось поменять в конфиге mysql-proxy строки
proxy-address=127.0.0.2:4040
admin-address=127.0.0.2:4041
адреса 127.0.0.х являются алиасами к 127.0.0.1 так, что это работает отлично. Подключиться можно так:
# mysql -P 4040 -h 127.0.0.2 -uroot-pXXX
Можно еще попробовать поменять my.cnf и запустить mysql на 4040, а mysql-proxy настроить на дефолтный 3306. Может кто еще знает способы попроще?
Создаем шаблоны для своих Custom Post Types в WordPress
08.02.2011
Для продолжения создания аукциона на WordPress нам нужно:
1) Добавить список последних лотов в сайдбар
2) Добавить список категорий лотов в сайдбар
3) Добавить облако меток лотов в сайдбар
4) Создать шаблон списка лотов
5) Создать шаблон одиночной страницы лота
6) Создать шаблон страницы архива по категориям лотов
7) Создать шаблон страницы архива по меткам лотов
Приступим…
Функция для отображения последних лотов (п. 1).
Данный код нужно вставить в functions.php
-
//Последние лоты на аукционе
-
-
function latest_lots(){
-
$query = array(
-
'post_type'=>'lots',
-
'post_status'=>'publish',
-
'posts_per_page' => 10
-
);
-
//Получаем 10 последних
-
$posts = get_posts($query);
-
//выводим несортированный список
-
?><ul class="lots"><?php
-
foreach ( $posts as $post ){
-
?><li><a href="<?php echo get_permalink($post->ID);?>"><?php echo $post->post_title?></a></li><?php
-
}
-
?></ul><?
-
}
Далее добавляем в sidebar.php код (п. 2):
-
<li>
-
<h3 class="widget-title"><?php _e('Latest lots', 'twentyten');?></h3>
-
<?php latest_lots(); ?>
-
</li>
Во-первых вместо _e(’Latest lots’, ‘twentyten’); можно написать просто по-русски, тогда не потребуется редактировать файл перевода. Во-вторых можно создать Widget, что бы можно было включить блок в админке. Но на этих моментах пока не буду останавливаться подробно, т.к. про это очень много написано статей. В следующей статье займемся шаблонами для отображения самих лотов. Потребуется список дополнительных полей, поэтому всех заинтересованных приглашаю высказаться.
Вместо плагина аукциона для Wordpress – аукцион руками на Custom post types
07.02.2011
В связи с интересом к плагину для создания аукциона на блоге wordpress, который не было возможности доработать из-за недостатка времени и большого количества ошибок в оригинальной версии, я решил помочь желающим сделать аукцион руками, без плагина. Для этого предлагаю внести изменения в файлы шаблона. Нужно добавить ряд функций и несколько файлов – шаблонов отображения самого аукциона и форму добавления лота. Если в ходе обсуждений вместе придем к тому, что нужен-таки плагин, значит скомпилирую полученный код и выложу в репозитарий плагинов Wordpress.
Делать будем вместе с нуля и по шагам. Идея основана на новшестве WordPress 3.0 – Custom Types, которое позволяет добавить свои типы записей, рубрик и меток. Таким образом, мы получим тип записи – Лоты аукционов, типы категорий – Категории аукционов, типы меток – Метки аукционов. На тип данных можно выставить необходимые права, что бы зарегистрированные пользователи могли добавлять лоты, но не могли писать и редактировать записи в блоге.
Для начала нужно поэкспериментировать с типами данных, поэтому я создал демо-сайт для аукциона и добавил одну функцию в файл functions.php в теме блога.
Вот код функции:
-
-
/* Функция регистрирует:
-
@ тип записей lots, которая будет использоваться для хранения лотов аукциона,
-
@ категории и меток для лотов
-
@ выставляет права для различных типов пользователей
-
*/
-
function types_create() {
-
//Сбросить
-
flush_rewrite_rules( false );
-
//Регистрируем тип записей lots [см.: http://codex.wordpress.org/Function_Reference/register_post_type ]
-
register_post_type( 'lots', array(
-
'label' => 'Аукцион',
-
'labels' => array(
-
'name' => 'Лоты',
-
'singular_name' => 'Лот',
-
'add_new' => 'Добавить лот',
-
'add_new_item' => 'Добавить лот',
-
'new_item' => 'Добавить лот',
-
'edit_item' => 'Редактировать лот',
-
'view_item' => 'Посмотреть',
-
'search_items' => 'Поиск',
-
),
-
'capability_type' => 'post',
-
//Создаем свои правила для раздачи прав на редактирование, удаление, публикацию
-
'capabilities' => array(
-
'edit_post' => 'edit_lot',
-
'edit_posts' => 'edit_lots',
-
'delete_posts' => 'delete_lots',
-
'read' => 'read_lot',
-
'edit_published_posts' => 'edit_published_lots',
-
'delete_published_posts' => 'delete_published_lots',
-
'edit_others_posts' => 'edit_others_lots',
-
'delete_others_posts' => 'delete_others_lots',
-
'publish_posts' => 'publish_lots'
-
-
),
-
'taxonomies' => array('lot_cat','lot_tag'),
-
'hierarchical' => false,
-
'public' => true,
-
'_builtin' => false,
-
'_edit_link' => 'post.php?post=%d',
-
'query_var' => true,
-
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'custom-fields', 'comments', 'revisions' ),
-
) );
-
-
/*
-
Регистрируем категории лотов см: http://codex.wordpress.org/Function_Reference/register_taxonomy
-
*/
-
register_taxonomy('lot_cat', 'lots', array(
-
'label' => 'Категории лотов',
-
'public' => true,
-
'show_in_nav_menus' => true,
-
'show_ui' => true,
-
'hierarchical' => true,
-
'rewrite' => true,
-
));
-
/*
-
Регистрируем теги для лотов см: http://codex.wordpress.org/Function_Reference/register_taxonomy
-
*/
-
register_taxonomy('lot_tag', 'lots', array(
-
'label' => 'Метки лотов',
-
'public' => true,
-
'show_in_nav_menus' => true,
-
'show_ui' => true,
-
'hierarchical' => false,
-
'rewrite' => true,
-
));
-
-
register_taxonomy_for_object_type('lot_tag', 'lots');
-
register_taxonomy_for_object_type('lot_cat', 'lots');
-
-
$GLOBALS['wp_rewrite']->flush_rules();
-
/* Права для админа */
-
$role =& get_role('administrator');
-
$role->add_cap('edit_lot');
-
$role->add_cap('edit_lots');
-
$role->add_cap('publish_lots');
-
$role->add_cap('edit_published_lots');
-
-
/* Права для редактора */
-
$role =& get_role('editor');
-
$role->add_cap('edit_lot');
-
$role->add_cap('edit_lots');
-
$role->add_cap('publish_lots');
-
$role->add_cap('edit_published_lots');
-
-
/* Права для автора */
-
$role =& get_role('author');
-
$role->remove_cap('publish_lots');
-
$role->add_cap('unfiltered_html');
-
$role->add_cap('edit_lots');
-
$role->add_cap('edit_lot');
-
// … по аналогии можно дать права для пользователей участник и подписчик
-
-
}
-
// добавляем тип данных при инициализации блога.
-
add_action( 'init', 'types_create',0 );
После добавления этого кода в functions.php, зашел в админку и увидел пункт «Лоты«, в котором есть подразделы Лоты, Добавить лот, Категории лотов, Метки лотов. Добавил лот и получил страницу с адресом:
http://au.madweb.ru/lots/реклама-на-сайте/
Можно добавить так же другие типы рубрик, например регионы/города, типы аукциона (т.е. Английский, Голландский) и т.д. Хранить дополнительные поля, такие как стартовая цена, блиц-цена, дата начала, дата окончания и т.п. можно в произвольных полях (post_meta).
Это уже можно протестировать и перейти к следующему шагу – шаблонам. Нужно будет сделать отображение ленты лотов, шаблоны самих лотов, а так же страницы архивов по категориям и меткам лотов (и других типов рубрик, если требуется).
Жду ваших вопросов и идей по функционалу аукциона.
Интернет-магазин спортивных товаров «BOXER». Снаряжение в боксе
20.10.2010
Абсолютно все бои проводятся на прямоугольной площадке, сторонки, которой 5 и 6 метров, всякая сторона обхвачена несколькими канатами, обыкновенно, это 3-4 каната. Представленная площадка зовется ринг. Углы ринга снабжены так называемыми подушками со сменными обшивками.
Популярным снарядом есть мешок для бокса, с его подмогой можно наиболее оптимальным методом усовершенствовать личное мастерство. Основной значимостью мешка для отработки ударов, обнаруживается развитие и умножение силы, его твердости и правильности. Лучшим манером на мешке для бокса тренируются прямые удары, снизу, боковые и те, что направлены в туловище противника. боксерский мешок наполняется как можно более плотнее, наполнение может быть каким угодно, от песка, и металлические стружки, сейчас, чаще, применяют тряпье или кожаные обрезки. Наружная сторона мешка для бокса делается с очень крепких, это могут быть – кожа, кирза, ПВХ, или иные выносливые ткани.
Высота, диаметр и вес мешка для бокса не считаются неизменными единицами, 26кг до 70кг соответственно.
Следующим важным снарядом является груша для бокса, которая, груши для бокса часто более мелкие, и точка соприкосновения у груши боксерской одна, что позволяет ей обладать большей свободой движения.
Следующий снаряд, - боксерские лапы, они незаменимы для занятий с тренером. Боксерские лапы помогают вырабатывать удары прямые и их точность, еще затачивают знания боксера. Внешне, лапы боксерские выглядят как овальные подушки. Одна сторона боксерские лапы обладает крепежем, с помощью которого лапы для тренировок по боксу одеваются на руку.
Когда рассматривать удары, то можно сказать, – по предписаниям, они производятся назначенной частью руки, стиснутым кулаком, руки облачают в, боксерские перчатки, для ослабления давления на руку, предотвращения от ушибов и поломов рук.
Еще в занятиях боксом и тренировках применяют, многообразные защиты и тренировочное снаряжение, что позволяет лучшим образом подготовить спортсмена и развить его профессиональные свойства.
Куда добавить статью. Блоги для бесплатной публикации статей.
18.07.2010
Привожу несколько сайтов, на которых можно разместить статьи с прямыми ссылками бесплатно. Это не совсем каталоги статей, скорее «блоги статей». Т.е. В большинстве это блоги на WordPress и часть – новостники на Pligg. Все прекрасно знакомы с этими движками, поэтому можно приступать.
Пресс-релизы:
www.start-partnership.com
matriks.ws
www.realty-key.info/news/
www.matriks.ws
Новости:
www.is-moskvy.ru
www.vse-pishut.ru
www.business-key.com
Читать полностью »
Размещение ссылок на ваш блог в Twitter
06.05.2010
Автор блога «SMO и SEO продвижение » предлагает размещение ссылок в ряде своих микроблогов на различных сервисах, включая Twitter, friendfeed, tumblr
и т.д. А в рамках действующей акции, которая проводится специально для блоггеров, которые пишут на темы заработка, разработки, раскрутки сайтов и т.п., размещение проводится бесплатно .
Еще хочу дополнить, что недавно обнаружил новый, но уже действующий и развивающийся сервис Keepter.com, который поддерживает API, примерно такой же как Twitter.
Позже »
