Хак для WordPress, решающий проблему HTTP 404

Что такое HTTP 404 все знают. Но не всегда это отсутствие самой страницы, файла. Кто работает с WordPress, могли сталкиваться с проблемой примерно следующего характера.

Из какой-то части своего блог/сайта на WordPress отправляется ajax-запрос на отдельный php файл. На сайте включены permalinks. Файл возвращает ответ, все хорошо, но с ошибкой 404. Поэтому ваш скрипт не обрабатывает ответ, даже если там все ок. Это часто проявляется на серверах lighttpd.

Ковырять без того уродливые конфиги lighttpd, пробовать mod_magnet и lua скрипты для настройки пермалинков — это геммор еще тот, тем более, для не знающего человека. WordPress в принципе в состоянии сам решить все эти проблемы.

Для тех, кто испытывал(ет) аналогичную проблему, делюсь простым решением:

add_filter('status_header', 'rw_hack_404', 10);
function rw_hack_404($c) {
	if (defined('HACK_404')) {
		$header = '200';
		$text = get_status_header_desc($header);
		$protocol = $_SERVER['SERVER_PROTOCOL'];
		if ('HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol)
			$protocol = 'HTTP/1.0';
		return "$protocol $header $text";
	}
	else {
		return $c;
	}
}

Копируем, вставляем в functions.php. А в файле для запроса в самое начало добавляем:

define('HACK_404', true);
require($_SERVER['DOCUMENT_ROOT'].'/wp-blog-header.php');
# ваш код

Все!

Самые красивые дороги в мире

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

Детские коляски. Купить коляску для вашего чада в Украине.
Фирменные бытовые фильтры для воды по доступным ценам. Специальные системы очистки воды.
Вакансии, предложения, работа Севастополь. Доски объявлений.

Рейтинг лучших для жизни стран в мире

Для тех, кто сомневался. Чили на 30ом месте (первая из Лат. американских стран в списке), Перу 42ое, Уругвай 44, Мексика 45, Аргентина 46, Бразилия 48, Россия 51.

Подробнее тут (англ).

Постовые

Профессиональные тренажеры для дома в спортивном магазине UA Fitness.
Качественная одежда для рыбаков, кемпинговое снаряжение.
Модная летняя женская обувь из США и Европы со скидкой.

Объявления. Ищутся попутчики для путешествия по Аргентине

Делаю кросс-пост одной моей хорошей знакомой.

Друзья! 8 хороших людей собрались в ноябре в путешествие по Аргентине, но по уважительной причине теперь их всего 5, они веселы, умны, любят путешествия, программа составлена индивидуальная и очень интересная, в общем все хорошо, но им нужны попутчики, человека 3-5.

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

Программа такая: история и танго в Буэнос-Айресе — кайманы и капибары на болотах Ибера — иезуитские руины и водопады Игуасу — те же водопады с бразильской стороны (благо отменили визу) — Сальта и археология ущелья Умауака — двухдневное сафари на уникальных грузовиках Мовитраках по Альтиплано с подъемом на 4300м — трекинг по леднику Перито-Морено в Калафате — заповедник Лос-Гласьярес — наблюдение китов вблизи п-ва Вальдес, пингвинов на мысе Томбо и тысяч других животных и птиц — Б-А.

Писать сюда contacto@imaginasur.cl или мне в личку и я свяжу вас с кем нужно.

Смог в Москве. Романтика VS Апокалипсис

Кто-то ноет, что все плохо, кто-то пожары тушит, а кто-то снимает. Пред-пятничный креатив на тему смога. Оба ролика офигенны.

Романтика
YouTube Preview Image

Брутальная версия
YouTube Preview Image

Постовые

Международные контейнерные перевозки грузов, перевозка опасных грузов.
Интернет трейдинг с минимальными рисками. Начни зарабатывать прямо сейчас.
Morpher — is new software protection copy service. Keep you software secure.

Улучшаем функцию вывода заголовка wp_title ()

Принимая во внимание рекомендации и фидбеки к примеру функции для сео-заголовков, публикую код улучшенной функции.

function seo_title() {
	global $page, $paged;
	$sep = " | "; # разделитель
	$newtitle = get_bloginfo('name'); # заголовок по умолчанию

	# Страница поста ##################################
	if (is_single() || is_page())
		$newtitle = single_post_title("", false);

	# Категории ######################################
	if (is_category())
		$newtitle = single_cat_title("", false);

	# Таги ###########################################
	if (is_tag())
	 $newtitle = single_tag_title("", false);

	# Результаты поиска ################################
	if (is_search())
	 $newtitle = "Результаты поиска: " . $s;

	# Taxonomy #######################################
	if (is_tax()) {
		$curr_tax = get_taxonomy(get_query_var('taxonomy'));
		$curr_term = get_term_by('slug', get_query_var('term'), get_query_var('taxonomy')); # current term data
		# if it's term
		if (!empty($curr_term)) {
			$newtitle = $curr_tax->label . $sep . $curr_term->name;
		} else {
			$newtitle = $curr_tax->label;
		}
	}

	# Добавить номер страницы, если нужно
	if ($paged >= 2 || $page >= 2)
			$newtitle .= $sep . sprintf('Страница %s', max($paged, $page));

	# Home & Front Page ########################################
	if (is_home() || is_front_page()) {
		$newtitle = get_bloginfo('name') . $sep . get_bloginfo('description');
	} else {
		$newtitle .=  $sep . get_bloginfo('name');
	}
	return $newtitle;
}

Заменять стандартную функцию wp_title () на нашу мы теперь не будем, а добавить фильтр там же в functions.php:

add_filter('wp_title', 'seo_title');

Изменения и дополнения:

  • Более читабельный код.
  • get_bloginfo ('name') ушло в конец функции.
  • В Home & Front Page добавил описание блога.
  • Добавил номера страниц в wp_title () там, где нужно.
  • Разделитель в отдельной переменной.
  • Убрал лишний текст из заголовков.
  • Вывод функции теперь через add_filter ()

Пример функции для seo-заголовков в WordPress 3+

Я не люблю прибегать к лишним плагинам, которые не факт, что хорошо написаны. Поэтому в своих шаблонах я использую код, написанный собственными ручками. В том числе, для генерирования сео-заголовков в «шапке». Делюсь с читателями примером исходничка.

function seo_title() {
	$std_title = get_bloginfo('name'); # задаем новый заголовок по умолчанию

	/* главная */
	if (is_home()) { $newtitle = $std_title; }
	/* пост или статичная страница  */
	if (is_single() || is_page()) { $newtitle = single_post_title("", false) ." - ".$std_title; }
	/* просмотр категории */
	if (is_category()) { $newtitle = "Вы просматриваете архивы категории <<" . single_cat_title("", false). ">> на " .$std_title; }
	/* просмотр архивов по тагу */
	if (is_tag()) { $newtitle = "Вы просматриваете архивы по тагу <<" .single_tag_title("", false). ">> на " .$std_title; }
	/* результаты поиска */
	if (is_search()) { $newtitle = "Результаты поиска по запросу '" . $s. "' - " .$std_title; }
	/* custom taxonomy & term */
	if (is_tax()) {
		$curr_tax = get_taxonomy(get_query_var('taxonomy'));
		$curr_term = get_term_by('slug', get_query_var('term'), get_query_var('taxonomy')); # current term data
		# if it's term
		if (!empty($curr_term)) {
			$newtitle = $curr_tax->label . " >> ". $curr_term->name ." - " .$std_title;
		} else {
			$newtitle = $curr_tax->label ." - " .$std_title;
		}
	}
	return $newtitle;
}

Эту функцию можно совершенствовать до беспредела на ваше усмотрение. А использование очень простое. Во-первых, скопируйте ее в functions.php. И потом исправьте в header.php таг title на следующее:

<title><?php echo seo_title(); ?></title>

Улучшенная функция и ее обсуждение теперь по этой ссылке. Спасибо!

Чили вдоль и поперек: Новости экспедиции

Час за часом, день за днем, время идет, мир на месте не стоит и организация съемок для чилийской экспедиции идет полным ходом. Есть хорошие новости, есть и плохие. Начну с последнего.

К сожалению, одна из компаний потенциальных спонсоров, на которую я лично возлагал очень большие надежды не сможет проспонсировать ни в каком виде мою поездку и съемки передачи. Хотя по сути нужно было только треккинг экипировка на двоих членов экипажа. Жаль.

Также чилийский Ford был упущен временем и теперь стало на одного автогиганта меньше.

Теперь немного позитива.

Я не случайно использую слово «экспедиция» в этом посте, так как съемки передачи уже переросли в настоящую этнографическую экспедицию. В сотрудничестве с одной крупной маркетинговой компанией в Чили съемки моей передачи были проработаны в более интересный, креативный и потенциально прибыльный проект — этнографическая экспедиция Чили 2010, которая будет делаться в рамках культурного обмена между Россией и Чили.

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

И если все срастется как планируется, то проект будет офигенно интересный. Реально, сейчас в разработке очень много идей для этой поездки. Есть все предпосылки, что поездка будет освещаться онлайн через twitcam и другие онлайн-средства.

В ближайшем посте я расскажу о плане поездке, поделюсь идеями, маршрутом и некоторыми наработками. А пока удаляюсь на дальнейшие поиски партнеров и спонсоров.

Если кто-то работает в таких компаниях, как Sony, Canon, Nikon, автодилеры, туристические компании и заинтересованы в сотрудничестве, то пишите мне на почту или звоните в скайп: slaffster и попытаемся найти общие интересы и выгоды.

Не скрою, есть огромное желание потестировать фото и видео технику, в том числе новую соньку и Canon 7D :)

Если ваш WordPress подвергся атаке в последнее время

Если вы стали замечать, что ваш блог стал тормозить в последнее время. Если вы получаете фидбеки от читателей, что ссылки на отдельные записи редиректят куда-то налево. То скорее всего ваш бложик хакнули новым эксплоитом через какой-нибудь плагин. Если вас хакнули и у вас стоит последняя версия WordPress (3.+), то в дашборде в quickpress скорее всего вы увидите следующую картину:

Wordpress redirect expoit

Вариации таких урлов в теге script могут быть разные. На текущий момент известны эти:

  • ae.awaue.com/7
  • ie.eracou.com/3
  • ao.euuaw.com/9
  • ue.oeaou.com/31

Лечится в общем-то очень просто, но нужно иметь некоторые навыки по работе с базой данных и консолью. Первым делом — сделать бекапы базы данных и инсталяции WP. Далее, в базе нужно запустить следующую команду:

UPDATE wp_posts SET post_content = replace( post_content, '<script src="http://ae.awaue.com/7"></script>', ' ')

Обратите внимание на префикс wp_posts. Замените «wp_» на префикс своих таблиц (это вы ставили в wp-config.php при установке блога).

Те, кто хостятся на MediaTemple, могут проверить все свои домены разом через консоль:

cd ~/domains/ && for x in `find . -type f -perm -u+r -name "wp-config.php" 2>/dev/null`; do if mysql -u`egrep DB_USER $x | awk -F\' '{print $4}'` -hinternal-db.s`echo $HOME | awk -F/ '{print $3}'`.gridserver.com -p`egrep DB_PASSWORD $x | awk -F\' '{print $4}'` `egrep DB_NAME $x | awk -F\' '{print $4}'` -e "select post_content from `egrep table_prefix $x | awk -F\' '{print $2}'`posts;" | egrep -q "(ae\.awaue\.com/7|ie\.eracou\.com/3|ao\.euuaw\.com/9)" 2>/dev/null; then mysql -u `egrep DB_USER $x | awk -F\' '{print $4}'` -h internal-db.s`echo $HOME | awk -F/ '{print $3}'`.gridserver.com -p`egrep DB_PASSWORD $x | awk -F\' '{print $4}'` `egrep DB_NAME $x | awk -F\' '{print $4}'` -e "UPDATE `egrep table_prefix $x | awk -F\' '{print $2}'`posts SET post_content = replace(replace(replace( post_content, '<script src=\"http://ae.awaue.com/7\"></script>', ''), '<script src=\"http://ie.eracou.com3\"></script>', ''), '<script src=\"http://ao.euuaw.com/9\"></script>', '');" 2>/dev/null; echo -e "\n$x - Redirect Exploit cleaned in database `egrep DB_NAME $x | awk -F\' '{print $4}'`"; fi; done;

Если кому-то нужна помощь по лечению эксплоита, хотите проверить свой блог, то за простое «спасибо» в качестве постового у вас в блоге, помогу с удовольствием :).

Сигареткой не угостишь, чувак?

Так в большинстве стран, городах у тебя могут попросить сигаретку. В Чили я заметил одну забавную, вызывающую улыбку умиления, вещь. Уже не раз у меня подходили спросить сигаретку, даже в любимом Openbox'е. И всегда предлагают деньги, кто 100 песо, кто больше.

Так вот сейчас пока ходил обедать, подходит чувачок уличный артист и просит продать ему сигаретку и пихает деньги в руки. Судя по количеству монет, там была 1/5 стоимости пачки. Я не взял, конечно. Отмечу, что пачка Кента стоит USD4.00, а другая самая дешевая чуть более USD3.00.

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