Записи с меткой ‘плагины’

  • Модифицируем галерею Wordpress

    8

    Для сайта с рецептами приготовления блюд с иллюстрациями каждого шага, потребовалась простая и наглядная система добавления шагов-рисунков с кратким описанием каждого шага. В стандартной галерее вордпресса (шорткод GALLERY) уже реализован весь необходимый функционал: можно пачкой загружать фотки, прописывать к ним названия, описания и выводить в нужном порядке. Однако есть несколько «НО»:

    • невозможно в галерее вывести описание к изображению, его можно вывести только в шаблоне приложений, типа image.php, но нам нужно вывести их на странице самого поста.
    • невозможно как-то значительно влиять на дизайн галереи, мы не можем, например, физически переместить заголовок изображения выше самого изображения (по умолчанию заголовок идет как подпись под картинкой)

    В общем, разработчикам вордпресса есть еще над чем работать, надеюсь, в третьей ветке значительным изменениям подвергнется и стандартная галерея, тогда можно будет со спокойной душой выкинуть тормознутые галереи-плагины типа «NextGEN Gallery». Кстати, используя данный плагин вполне возможно выполнить поставленную задачу, однако такое решение выглядит несколько туповато, учитывая что все необходимые возможности уже реализованы в стандартной галереи, и все дело лишь в ее внешнем виде. Зачем изобретать велосипед, если можно просто его модернизировать?

    Модернизируем наш «велосипед»

    Любителям на досуге пописать плагинчики для вордпресса конечно же известны функции add_shortcode и remove_shortcode, первая регистрирует, а вторая удаляет регистрацию  шорткода. Шорткоды, если кто не знает, это специальные кодовые слова, которые можно прописывать прямо в теле статьи, и которые вызывают какую-то функцию. Например, шорткод CAPTION служит для вставки изображения с подписью, а шорткод GALLERY — необходимую нам стандартную галерею вордпресс.

    Нам нужно всего лишь переписать функцию вывода на экран галереи и сделать так, чтобы шортег GALLERY вызывал именно нашу функцию, а не стандартную. Сделать это проще, чем вы можете подумать =)

    В первую очередь нам нужно отключить стандартную функцию галереи. Открываем файл functions.php, и вставляем в конец файла (до знака «?>») строку:

    remove_shortcode('gallery');

    Затем нам нужна новая функция вывода галереи. Крутые программисты наверняка напишут ее сами, но лично мне нужно всего лишь добавить пару фишек к стандартной галерее, поэтому я просто немного изменю стандартную функцию, текст которой находится в файле wp-includes/media.php и называется gallery_shortcode. Файл большой, поэтому воспользуйтесь функцией поиска.

    Для версии вордпресс 2.9.2 эта функция выглядит так:

    function gallery_shortcode($attr) {
    	global $post, $wp_locale;
     
    	static $instance = 0;
    	$instance++;
     
    	// Allow plugins/themes to override the default gallery template.
    	$output = apply_filters('post_gallery', '', $attr);
    	if ( $output != '' )
    		return $output;
     
    	// We're trusting author input, so let's at least make sure it looks like a valid orderby statement
    	if ( isset( $attr['orderby'] ) ) {
    		$attr['orderby'] = sanitize_sql_orderby( $attr['orderby'] );
    		if ( !$attr['orderby'] )
    			unset( $attr['orderby'] );
    	}
     
    	extract(shortcode_atts(array(
    		'order'      => 'ASC',
    		'orderby'    => 'menu_order ID',
    		'id'         => $post->ID,
    		'itemtag'    => 'dl',
    		'icontag'    => 'dt',
    		'captiontag' => 'dd',
    		'columns'    => 3,
    		'size'       => 'thumbnail',
    		'include'    => '',
    		'exclude'    => ''
    	), $attr));
     
    	$id = intval($id);
    	if ( 'RAND' == $order )
    		$orderby = 'none';
     
    	if ( !empty($include) ) {
    		$include = preg_replace( '/[^0-9,]+/', '', $include );
    		$_attachments = get_posts( array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
     
    		$attachments = array();
    		foreach ( $_attachments as $key => $val ) {
    			$attachments[$val->ID] = $_attachments[$key];
    		}
    	} elseif ( !empty($exclude) ) {
    		$exclude = preg_replace( '/[^0-9,]+/', '', $exclude );
    		$attachments = get_children( array('post_parent' => $id, 'exclude' => $exclude, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    	} else {
    		$attachments = get_children( array('post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    	}
     
    	if ( empty($attachments) )
    		return '';
     
    	if ( is_feed() ) {
    		$output = "\n";
    		foreach ( $attachments as $att_id => $attachment )
    			$output .= wp_get_attachment_link($att_id, $size, true) . "\n";
    		return $output;
    	}
     
    	$itemtag = tag_escape($itemtag);
    	$captiontag = tag_escape($captiontag);
    	$columns = intval($columns);
    	$itemwidth = $columns > 0 ? floor(100/$columns) : 100;
    	$float = $wp_locale->text_direction == 'rtl' ? 'right' : 'left'; 
     
    	$selector = "gallery-{$instance}";
     
    	$output = apply_filters('gallery_style', "
    		<style type='text/css'>
    			#{$selector} {
    				margin: auto;
    			}
    			#{$selector} .gallery-item {
    				float: {$float};
    				margin-top: 10px;
    				text-align: center;
    				width: {$itemwidth}%;			}
    			#{$selector} img {
    				border: 2px solid #cfcfcf;
    			}
    			#{$selector} .gallery-caption {
    				margin-left: 0;
    			}
    		</style>
    		<!-- see gallery_shortcode() in wp-includes/media.php -->
    		<div id='$selector' class='gallery galleryid-{$id}'>");
     
    	$i = 0;
    	foreach ( $attachments as $id => $attachment ) {
    		$link = isset($attr['link']) && 'file' == $attr['link'] ? wp_get_attachment_link($id, $size, false, false) : wp_get_attachment_link($id, $size, true, false);
     
    		$output .= "< {$itemtag} class='gallery-item'>";
    		$output .= "
    			< {$icontag} class='gallery-icon'>
    				$link
    			";
    		if ( $captiontag && trim($attachment->post_excerpt) ) {
    			$output .= "
    				< {$captiontag} class='gallery-caption'>
    				" . wptexturize($attachment->post_excerpt) . "
    				";
    		}
    		$output .= "";
    		if ( $columns > 0 && ++$i % $columns == 0 )
    			$output .= '<br style="clear: both" />';
    	}
     
    	$output .= "
    			<br style='clear: both;' />
    		</div>\n";
     
    	return $output;
    }

    Эту функцию нужно просто вставить в файл functions.php вашей темы и внести нужные вам изменения. Скорее всего потребуются небольшие знания PHP. Я всего лишь добавил следующий код:

    		if (trim($attachment->post_content) ) {
    			$output .= "
    				< {$captiontag} class='gallery-description'>
    				" . wptexturize($attachment->post_content) . "
    				";
    		}

    сразу после:

    		if ( $captiontag && trim($attachment->post_excerpt) ) {
    			$output .= "
    				< {$captiontag} class='gallery-caption'>
    				" . wptexturize($attachment->post_excerpt) . "
    				";
    		}

    Благодаря этой вставке, в галерее теперь будут отображаться описания к файлам. Все просто!

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

    'exclude'    => ''

    На:

    'exclude'    => get_post_meta($post->ID, '_thumbnail_id', 1)

    Теперь нужно снова включить шортаг GALLERY, но уже с нашей функцией. Кстати, название функции необходимо изменить, иначе это вызовет фатальную ошибку (старая функция галереи все еще доступна в файле media.php, и я не советую ее удалять!) Просто переименуйте функцию из gallery_shortcode в, например, new_gallery_shortcode.

    Чтобы шортаг снова заработал, добавьте в functions.php строку:

    add_shortcode('gallery', 'new_gallery_shortcode');

    Она должна быть после remove_shortcode и нашей новой функции.

    Кстати, не обязательно отключать функцию стандартной галереи, можно сделать все тоже самое, но в add_shortcode написать, например:

    add_shortcode('new_gallery', 'new_gallery_shortcode');

    Тем самым мы создадим новый шорткод NEW_GALLERY и сможем его использовать при написании поста (ставлять придется ручками, в режиме HTML. Таким макаром можно связать любую функцию с шорткодом, какую захотите!

    Вот, собственно, и все =) Сохраняем файл и смотрим результат! Для людей, немного знакомых с программированием, не будет проблемой дописать любые фишки к стандартной галерее, и значительно расширить ее функционал, без всяких плагинов.

  • Ускоряем вордпресс в десятки раз!

    3

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

    Как правило в таких ситуациях простой опимизации бывает мало (хотя несомненно необходимо трезво оценить свой сайт и понять, без каких «фишек» он сможет обойтись) Но чаще всего требуются радикальные меры – кеширование.

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

    В блоггерской среде большой популярностью пользуется плагин WP Super Cache, и неспроста! Он действительно отлично стравляется с кешированием, после установки этого плагина блог начинает просто летать! Однако, лично меня он оттолкнул процессом своей установки: десять не самых простых для технически не очень подкованного блоггера шагов. Поэтому я начал искать альтернативу и в итоге сузил выбор до двух кешей: Maxsite Cache и плагина Really Static.

    Maxsite Cache порадовал меня простотой установки и тем, что он по результатам тестов практически ничем не уступает WP Super Cache, при этом он простой и легкий, как и все сделанное Максом.

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

    • Пока вы залогинены, кэш автоматически отключается для тех страниц, на которые вы будете заходить. В это время ваши посетители будут видеть последнюю актуальную версию. После того, как вы поработаете в админ-панели нажмите ссылку Выход. Тем самым вы укажете скрипту, что вам можно отображать страницы из кэша. До тех пор, пока вы этого не сделаете, вы будете считаться залогиненным.
    • Корректная работа с посторонними скриптами, которые меняют входящий URL, в частности т.н. защита продажных ссылок (антиобнаружитель продажных ссылок).
    • При создании нового комментария происходит сброс кэша только текущей страницы.
    • Произвольная ссылка для ручного сброса кэша.
    • Произвольный формат вывода статистики кэша. Можно отключить ссылку на мой сайт.
    • Отслеживание некоторых «особеностей» WordPress, вроде запоминания полей комментаторов. В кэше будут «чистые» поля форм.
    • Можно задать список адресов, которые не нужно кэшировать.
    • Встроенная статистика позволяет отследить процент «попаданий» кэша.
    • Отслеживание 404-страниц. Они не попадают в кэш.
    • Кэш автоматически сбрасывается каждые 4-е часа. Можно указать произвольное время.

    Установка проходит легко и просто, дастаточно создать папку кеша с нужными правами и вставить пару строк в файл index.php вордпресса.

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

    Второй кеш называется Really Static, то есть «действительно статический». Реализован он в виде плагина что безусловно удобно, однако это не значит, что его установка проще, чем скрипта Макса. К сожалению, она скорее сложнее, придется немного разобраться.

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

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

    Really Static куда более гибкий плагин кеша, чем скрипт Макса, например можно отключить кеш для отдельных шаблонов, не кешировать категории или теги. А еще порадовала возможность разместить свой реальный блог абсолютно в любом месте, хоть на своей локальной машине (с выходом в сеть, естественно) плагин умеет загружать статику по FTP на любой другой сервер! То есть, желающие выпендриться могут держать вордпресс-блог на хостинге без PHP/MySQL, просто нужно установить вордпресс на своем компьютере и в момент публикации/редактирования быть в сети.

    Ну и главное достоинство Really Static – он бесплатный.

    В заключение хочу сказать, что я лично не делал тестов на предмет выяснения какой из кешев самый-самый, так как не задавался целью максимально снизить нагрузку. Оба кеша делают примерно одно и тоже – сначала генерируют, а потом отдают посетителям готовые к употреблению HTML-файлы. Скажу лишь, что прежде чем выбрать, я установил оба кеша на разные сайты, и понял, что оба примерно одинакого снижают нагрузку (раз так в 60-70 ;) Выбор свой я остановил на Really Static так как он бесплатный, более функциональный и на мой взгляд перспективный.

    Ах, да, совсем забыл! Оба кеша естественно не справляются с динамическим содержимым вроде последних десяти комментариев в сайдбаре и пому подобных фишек, просто потому, что комментарии могут появляться каждую минуту, и придется каждую минуту сбрасывать кеш полностью (сайдбар-то как правило на всех страницах одинаковый) – пропадает вообще смысл в кешировании. Однако, если вас не смущает то, что данный блок будет обновляться скажем раз в час или реже – смело ставьте!

    И для любителей Сапы и прочих ссылочных бирж – кеш вряд ли отрицательно скажется на уровне вашего дохода, просто настройте кеш так, чтобы он полностью обновлялся до того, как робот биржи появится на сайте – оптимально часа четыре или меньше. У меня за три недели использования Really Static не было ни одного error’а по вине плагина.