Самые полезные сниппеты Wordpress, PHP, JS и MySQL

Updated 25 June 2022

Самые полезные сниппеты WordPress, коротких фрагменты кода для улучшения функциональности сайтов.

Contents

Что за сниппеты WordPress?

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

Как правило сниппеты – это функции, которые мы используем либо в файле functions.php темы, либо в файлах плагинов. Количество возможностей безгранично, а скорость работы высокая.

Сниппеты WordPress в IDE
Сниппеты WordPress в IDE

Удаляем поле “вебсайт” из формы комментариев

Сниппет, который удалит из формы комментариев поле “сайт” (англ. – website).

function wpsamurai_remove_website_field( $fields ) {
    unset( $fields['url'] );
    return $fields;
}
 
add_filter( 'comment_form_default_fields', 'wpsamurai_remove_website_field' );
Внимание! Не всегда сниппеты WordPress работают как хочется, так и в данном случае в некоторых темах форма комментариев может быть изменена разработчиком, а ее вывод кастомизирован.

Проверяем наличие миниатюры у записи

Данный сниппет состоит всего из трех строк, если не планируется добавлять какой-либо дополнительной функциональности.

<?php if ( has_post_thumbnail() ) {
    the_post_thumbnail();
}; ?>

Можно немного усложнить данный сниппет с использованием else:

<?php if ( has_post_thumbnail() ) { ?>

    <p><?php echo the_post_thumbnail_url(get_the_ID(),'thumbnail'); ?></p>

<?php } else { ?>

    <p>No image</p>

<?php }; ?>

Вставляем footer (подвал) в тему

Вставка подвала на все основные страницы сайта на WordPress делается простым сниппетом.

Этот сниппет нужно добавить в те файлы темы, где вы хотите видеть шапку:

<?php get_footer(); ?>

Вставляем header (шапку) в тему

Вставка блока шапки на все основные страницы сайта на WordPress делается простым сниппетом.

Этот сниппет нужно добавить в те файлы темы, где вы хотите видеть шапку:

<?php get_header(); ?>

Данный код, конечно, не входит в сниппеты WordPress в классическом понимании, но новичкам этот код знать нужно.

Стандартный цикл

Сниппет ниже – это стандартный цикл WordPress по выводу записей на сайте.

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

// здесь вывод статей, тегов и т.п.

<?php endwhile; ?>

<?php else :

    _e( 'Простите, здесь пока ничего нет.', 'textdomain' );

endif; ?>

Данный цикл применяется в файлах темы, например, в архивах (archive.php) или в файле одной записи (single.php).

Вывод заголовка рубрики

<?php single_cat_title( __( 'Currently browsing -> ', 'textdomain' ) ); ?>

Отключаем создание миниатюр изображений определенных размеров

add_filter( 'intermediate_image_sizes', 'delete_intermediate_image_sizes' );
function delete_intermediate_image_sizes( $sizes ){
	// размеры которые нужно удалить
	return array_diff( $sizes, [
		'medium_large',
		'large'
	] );
}

Вывод стандартной пагинации

<?php the_posts_pagination( array(
    'prev_next' => false, 
    'screen_reader_text' => false,
    'type' => 'list'
)); ?>

MySQL: смена домена сайта через

При переносе сайта на другой домен часто приходится пользоваться таким решением.

UPDATE wp_options SET option_value = replace(option_value, 'http://domain.ru', 'http://newdomain.ru') WHERE option_name = 'home' OR option_name = 'siteurl';

UPDATE wp_posts SET guid = replace(guid, 'http://domain.ru','http://newdomain.ru');

UPDATE wp_posts SET post_content = replace(post_content, 'http://domain.ru', 'http://newdomain.ru');

UPDATE wp_postmeta SET meta_value = replace(meta_value,'http://domain.ru','http://newdomain.ru');

Выводим список всех записей, содержащих конкретные произвольные поля

Код позволяет вывести список всех записей с настраиваемым полем “Short_Link”, отсортированный по значению пользовательского поля “Comment_Count”, которое не исключает никаких “post_type” и предполагает, что каждая запись имеет только одно поле для Short_Link и одно для Comment_Count.

<?php
 
$meta_key1 = 'Short_Link';
$meta_key2 = 'Comment_Count';
 
$postids = $wpdb->get_col( $wpdb->prepare( 
    "
    SELECT      key1.post_id
    FROM        $wpdb->postmeta key1
    INNER JOIN  $wpdb->postmeta key2
                ON key2.post_id = key1.post_id
                AND key2.meta_key = %s
    WHERE       key1.meta_key = %s
    ORDER BY    key2.meta_value+(0) ASC
    ",
        $meta_key2,
    $meta_key1
) ); 
 
if ( $postids ) 
{
    echo "List of {$meta_key1} posts, sorted by {$meta_key2}";
    foreach ( $postids as $id ) 
    {
        $post = get_post( intval( $id ) );
        setup_postdata( $post );
        ?>
        <p>
            <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>">
                <?php the_title(); ?>
            </a>
        </p>
        <?php
    }
}
?>

Ограничиваем количество слов в отрывках (excerpt)

function custom_excerpt_length( $length ) {
        return 20;
    }
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );

WordPress: выводим количество статей в категории

Один из блоков кода, который входит в топ “самые полезные сниппеты WordPress”. Используется часто, особенно раньше.

// $ID заменяем на ID нужной категории с кавычками, например: '38'

<?php 
$cat_count = get_category($ID);
echo $cat_count->count; 
?>

WordPress: вставляем код после каждого H2 в контенте

Разберемся с одним из вариантов того, как можно вставить небольшой кусок кода в статьях после каждого заголовка H2. Часто возникает необходимость вставить div с небольшим количеством содержимого сразу после закрывающегося тега h2 в одиночных записях WordPress. Это может быть реклама или какой-то блок внимания.

Такая проблема решается небольшим сниппетом. Можно это сделать с помощью фильтра the_content. Код можно поместить в файл functions.php вашей темы. Для более подробной информации по этому фильтру можно посмотреть WordPress Codex.

function add_content_after_h2($content){
    if (is_single()) {
        $div = '<div>small bit of content</div>';
        $content = preg_replace('/(<\/h2>)/i', '\1'.$div, $content);
    }
    return $content;
}

add_filter('the_content', 'add_content_after_h2');

WordPress: вставляем контент после определенного количества абзацев

Если сниппеты WordPress и позволяют избежать установки плагинов, то этот блок кода является одним из тех случаев. Благодаря ему я вставляю личную рекламу на сайт там где хочу или блоки кода от Google Adsense. При этом я не устанавливаю громоздкие плагины.

<?php
// Insert ads after second paragraph of single post content.
add_filter( 'the_content', 'prefix_insert_post_ads' );
function prefix_insert_post_ads( $content ) {

	$ad_code = '<div>Ads code goes here</div>';

	if ( is_single() && ! is_admin() ) {
		return prefix_insert_after_paragraph( $ad_code, 2, $content );
	}
return $content;
}
 
// Parent Function that makes the magic happen
function prefix_insert_after_paragraph( $insertion, $paragraph_id, $content ) {
	$closing_p = '</p>';
	$paragraphs = explode( $closing_p, $content );
	foreach ($paragraphs as $index => $paragraph) {

		if ( trim( $paragraph ) ) {
			$paragraphs[$index] .= $closing_p;
		}

		if ( $paragraph_id == $index + 1 ) {
			$paragraphs[$index] .= $insertion;
		}
	}
	
	return implode( '', $paragraphs );
}

WordPress: исключаем категории из поиска

Рассмотрим как можно исключить статьи из определенных категорий, которые не должны появляться в результатах поиска WordPress.

function exclude_category_from_search($query) {
	if ($query->is_search) {
		$query->set('cat', '-XXX');
	}
	return $query;
}
add_filter('pre_get_posts','exclude_category_from_search');

Добавляем данный сниппет в файл functions.php и меняем XXX на ID нужной нам категории, чтобы получилось, например, так:

$query->set('cat', '-1');

Также можно исключить несколько категорий:

$query->set('cat', '-24,-45,-52');

Не забывайте знак минус (-) перед каждым числом.

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

Исключаем страницы из поиска

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

Мы можем просто полностью исключить все страницы из результатов поиска следующим сниппетом:

function exclude_posts_from_search($query) {
	if ($query->is_search) {
		$query->set('post_type', 'post');
	}
	return $query;
}
add_filter('pre_get_posts','exclude_posts_from_search');

По-сути, мы просто добавили строчку, которая отвечает за ограничения по типу записи:

$query->set('post_type', 'post');

Теперь вы можете сами управлять своими результатами поиска на WordPress.

Убираем кнопку “В корзину” или “Купить” в категориях Woocommerce

Добавляем сниппет в файл functions.php вашей темы.

remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );

Преобразование формата даты из mysql

Сниппет PHP, который преобразует дату в нормальный формат типа mm/dd/yy H:M (AM/PM), dd.mm.YY H:i или любой другой.

// $datetimeFromMysql выглядит примерно так: 2014-01-31 13:05:59
$time = strtotime($datetimeFromMysql);
$myFormatForView = date("m/d/y g:i A", $time);
// $myFormatForView будет выглядеть так: 01/31/14 1:05 PM
$goodTime = date("d.m.Y H:i", $time);
// $goodTime будет выглядеть так: 05.09.2020 09:58

Вставляем $variable или $_POST в таблицу mysql

Когда вы используете {}, вам не нужно оборачивать значение в ‘ ‘:

mysql_query("INSERT INTO users (column 1, column2) VALUES ('{$_POST[value1]}', '{$_POST[value2]}')");

Изменение названия самой таблицы MySQL

RENAME TABLE `table` TO `table_new_name`;

WordPress: обновленная дата статьи

Эти сниппеты WordPress используются все чаще, так как Google любит понимать актуальность контента.

<?php if ( get_the_modified_time() != get_the_time()) { ?>
<?php echo the_modified_time('j F Y в H:i '); ?>
<?php }; ?>	

Или короткая версия:

<?php if ( get_the_modified_time() != get_the_time()) : echo the_modified_time('j F Y в H:i '); endif; ?>

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

WordPress: отображаем заголовок категории с номером страницы пагинации

Сниппеты WordPress такого плана также направлены больше на улучшение SEO, чем на улучшение функциональности сайта, чтобы было меньше дублированного контента на страницах проектов.

<?php if ( is_category() && !is_paged() ) { ?>
    <h1><?php single_cat_title(); ?></h1>				
<?php } elseif ( is_category() && is_paged() ) { ?>
    <h1><?php single_cat_title(); ?> - Страница <?php echo get_query_var('paged') ;?></h1>
<?php }; ?>

Защита файлов плагина от прямого доступа

<?php 
    if ( ! defined( 'ABSPATH' ) ) {
        exit; // выйти если обращаются напрямую
    }
?>

Предотвращает пользователям прямой доступ к вашим .php-файлам по URL. Иначе, если ваш файл содержит некоторые операции ввода/вывода, он может быть вызван (злоумышленником), и это может привести к неожиданному поведению.

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

Использование:

  • может быть размещен в верхней части любого из ваших PHP-файлов (темы и плагинов);
  • может быть размещен в верхней части вашего wp-config.php.

ABSPATH – это константа PHP, определяемая WordPress в нижней части wp-config.php:

/* That's all, stop editing! Happy blogging. */

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

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

Если вы используете этот фрагмент в верхней части вашего файла wp-config.php, вы остановите выполнение wp-config.php, потому что ABSPATH на тот момент еще не был определен. А другие файлы, зависящие от wp-config.php, не будут работать (т.е. вы сломаете свой сайт).

Этот сниппет широко используется PHP-файлами плагинов и тем только условно. Теоретически это означает, что вы можете добавить свою собственную константу в нижней части wp-config.php, и вы получите тот же практический результат.

Ваш wp-config.php:

if ( !defined('MY_CONSTANT') )
    define('MY_CONSTANT', 'fool');

Ваш файл темы или плагина:

<?php 
    if ( ! defined( 'MY_CONSTANT' ) ) {
        exit; // выйти если обращаются напрямую
    }

Более подробно об этом почитать можно на официальном сайта PHP в справке по синтаксису констант и волшебным константам.

WordPress: перевести слово “Reply”

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

function wpsamurai_comment_reply_text( $link ) {
    $link = str_replace( 'Reply', 'Ответить', $link );
    return $link;
}
add_filter( 'comment_reply_link', 'wpsamurai_comment_reply_text' ); ?>

Javascript: проверяем существование функция перед ее вызовом

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

if (typeof yourFunctionName == 'function')
{
 yourFunctionName(); 
}

WordPress: убираем название статьи из хлебных крошек Yoast

Что удивительно для новичков – это то, что сниппеты WordPress позволяют менять некоторую функциональность сторонних плагинов, как в данном примере с плагином Yoast.

function adjust_single_breadcrumb( $link_output) {
	if(strpos( $link_output, 'breadcrumb_last' ) !== false ) {
		$link_output = '';
	}
   	return $link_output;
}
add_filter('wpseo_breadcrumb_single_link', 'adjust_single_breadcrumb' );

WordPress: Добавляем иконку поиска в пункт меню

Функция позволяет добавить в меню WordPress иконку поиска в конец списка.

function add_search_form($items, $args) {
          if( $args->theme_location == 'primary' ){
          $items .= '<li><a class="search-icon"><i class="fas fa-search"></i></a></li>';
          }
        return $items;
}
add_filter('wp_nav_menu_items', 'add_search_form', 10, 2);

Самое простое – добавить данную функцию в файл functions.php вашей темы.

Иконку можно дальше сделать кликабельной и выводить либо модальное окно, либо переадресовывать на страницу/форму поиска.

WordPress: вывод всех статей по категориям на одной странице

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

<?php
	//for each category, show all posts
	$cat_args=array(
	  'orderby' => 'name',
	  'order' => 'ASC'
	   );
	$categories=get_categories($cat_args);
	  foreach($categories as $category) {
	    $args=array(
	      'showposts' => -1,
	      'category__in' => array($category->term_id),
	      'caller_get_posts'=>1
	    );
	    $posts=get_posts($args);
	      if ($posts) {

	        echo '<h2>' . $category->name.'</h2>';     

	        foreach($posts as $post) {
	          setup_postdata($post); ?>
	          <p><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></p>
	          
	        <?php 
	        } // foreach($posts
	      } // if ($posts
	    } // foreach($categories
	?>

Wordpess: отключаем srcset адаптивных изображений

Начиная с версии 4.4 в WordPress добавили функцию для автоматической обработки адаптивных изображений.

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

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

function digapp_disable_srcset( $sources ) {
    return false;
}
 
add_filter( 'wp_calculate_image_srcset', 'digapp_disable_srcset' );

Просто вставьте этот простой фрагмент кода в файл functions.php своей темы и ваши изображения будут работать как в WP 4.3 и ранее.

WordPress: цикл для вывода постов определенной категории

<?php query_posts('cat=5'); ?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
   <?php the_content(); ?>
<?php endwhile; endif; ?>

Если вы используете данный цикл, например, как дополнительный на странице, который запускается перед основным циклом на вашей странице, то не забудьте сбросить цикл, иначе он нарушит основной цикл.

<?php wp_reset_query(); ?>

Вывод количества статей в категории в меню WordPress

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

Для отображения количества статей категории в главном меню, добавляем следующий код в файл функций functions.php вашей темы:

add_filter('the_title', 'digapp_number_posts_the_title', 10, 2);
function digapp_number_posts_the_title($title, $post_ID)
    {
        if( 'nav_menu_item' == get_post_type($post_ID) )
    {
        if( 'taxonomy' == get_post_meta($post_ID, '_menu_item_type', true) && 'category' == get_post_meta($post_ID, '_menu_item_object', true) ){
            $category = get_category( get_post_meta($post_ID, '_menu_item_object_id', true) );
            $title .= sprintf('<sup class="posts-number">%d</sup>', $category->count);
        }
    }
    return $title;
}

Рекомендую установить дочернюю тему перед добавлением кода.

WordPress: добавляем SVG в качестве иконок в меню

Ниже приведу решение проблемы, когда нам в меню WordPress нужно вставить к пункту меню картинку SVG.

Вы можете использовать фильтр wp_nav_menu_items для поиска и замены определенной строки, которую вы вручную вставляете в название пункта меню в разделе меню WordPress.

Добавьте строку %FANCY_SVG% в название пункта меню в админке WordPress. Например, так:

%FANCY_SVG% Новости

Определите фильтр следующим образом в файле functions.php вашей темы:

function find_replace_my_fancy_svg( $items, $args ) {
    $items = str_replace(
        '%FANCY_SVG%', 
        '<svg width="27" height="27" xmlns="http://www.w3.org/2000/svg"><g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g transform="translate(-15 -18)" fill="red"><path id="Rectangle" d="M15 18h27v27H15z"/></g></g></svg>',
        $items
    );
    
    return $items;
}
add_filter( 'wp_nav_menu_items', 'find_replace_my_fancy_svg', 10, 2 );

В сниппете выше заменяем SVG-картинку на свою, т.е. <svg>...</svg>.

Хочу предостеречь. У вас могут возникнуть проблемы с отображением пункта меню из-за разных кавычек при выводе SVG. Проблема решается экранированием кавычек.

На моем сайте сверху я использовал данный метод для пункта меню “Заказать”. Вставлял код SVG-картинки таким образом:

<svg xmlns=\'http://www.w3.org/2000/svg\' width=\'20\' height=\'20\' viewBox=\'0 0 24 24\'><path fill=\'#66806A\' d=\'M23.334 11.96c-.713-.726-.872-1.829-.393-2.727.342-.64.366-1.401.064-2.062-.301-.66-.893-1.142-1.601-1.302-.991-.225-1.722-1.067-1.803-2.081-.059-.723-.451-1.378-1.062-1.77-.609-.393-1.367-.478-2.05-.229-.956.347-2.026.032-2.642-.776-.44-.576-1.124-.915-1.85-.915-.725 0-1.409.339-1.849.915-.613.809-1.683 1.124-2.639.777-.682-.248-1.44-.163-2.05.229-.61.392-1.003 1.047-1.061 1.77-.082 1.014-.812 1.857-1.803 2.081-.708.16-1.3.642-1.601 1.302s-.277 1.422.065 2.061c.479.897.32 2.001-.392 2.727-.509.517-.747 1.242-.644 1.96s.536 1.347 1.17 1.7c.888.495 1.352 1.51 1.144 2.505-.147.71.044 1.448.519 1.996.476.549 1.18.844 1.902.798 1.016-.063 1.953.54 2.317 1.489.259.678.82 1.195 1.517 1.399.695.204 1.447.072 2.031-.357.819-.603 1.936-.603 2.754 0 .584.43 1.336.562 2.031.357.697-.204 1.258-.722 1.518-1.399.363-.949 1.301-1.553 2.316-1.489.724.046 1.427-.249 1.902-.798.475-.548.667-1.286.519-1.996-.207-.995.256-2.01 1.145-2.505.633-.354 1.065-.982 1.169-1.7s-.135-1.443-.643-1.96zm-12.584 5.43l-4.5-4.364 1.857-1.857 2.643 2.506 5.643-5.784 1.857 1.857-7.5 7.642z\'/></svg>

Как видно из примера выше – кавычки я экранировал вот так – \'.

Решение было найдено на старом добром Stackoverflow, а с проблемами вывода боролся сам 🙂

WordPress: изменяем текст “Оставить комментарий”

Разберемся как изменить текст “Оставить комментарий” (Leave a comment) в WordPress через functions.php. Этот текст можно изменить с помощью фильтра WordPress comment_form_defaults.

В следующем коде просто замените Custom leave a comment на свой собственный текст:

add_filter('comment_form_defaults', 'set_my_comment_title', 20);
function set_my_comment_title( $defaults ){
  $defaults['title_reply'] = __('Custom leave a comment', 'customizr-child');
  return $defaults;
}

WordPress: вывод списка категорий пользовательской таксономии

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

Чтобы получить список пользовательских таксономий, вы можете использовать функцию get_terms() для создания цикла:

<?php 

// Get the taxonomy's terms
$terms = get_terms(
    array(
        'taxonomy'   => 'your-taxonomy',
        'hide_empty' => false,
    )
);

// Check if any term exists
if ( ! empty( $terms ) && is_array( $terms ) ) {
    // Run a loop and print them all
    foreach ( $terms as $term ) { ?>
        <a href="<?php echo esc_url( get_term_link( $term ) ) ?>">
            <?php echo $term->name; ?>
        </a><?php
    }
} 

WordPress: убираем Block Library CSS

Редактор Gutenberg, который является редактором по умолчанию для последних версий WordPress, использует специальные библиотеки CSS для управления блоками на фронтенде вашего сайта. Если вы используете этот новый редактор WP, он автоматически добавит код CSS этой библиотеки на ваш сайт.

<link rel='stylesheet' id='wp-block-library-css'  href='https://site.com/wp-includes/css/dist/block-library/style.min.css' type='text/css' media='all' />

Вещь полезная, но иногда ненужная.

Но если вы никак не используете блоки Gutenberg, вы можете использовать следующий сниппет, чтобы удалить эту дополнительную таблицу стилей из вашей темы.

function wpassist_remove_block_library_css(){
    wp_dequeue_style( 'wp-block-library' );
} 
add_action( 'wp_enqueue_scripts', 'wpassist_remove_block_library_css' );

Сниппет добавляем в файл functions.php вашей темы, либо дочерней темы Wordpess.

Я знаю, что это всего на один запрос меньше на вашем сервере, но если вы нацелены на 5000 пользователей в день, то это на 150 тыс. запросов в месяц меньше. Если вы хотите узнать больше про ускорение WordPress, то у меня есть отдельный большой материал по этой теме.

WordPress: исключаем страницы из результатов поиска

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

По умолчанию WordPress будет включать страницы вашего сайта в результаты поиска.

Для большинства сайтов это не нужно или нежелательно. Чтобы изменить это поведение, мы можем добавить простую функцию в наш файл functions.php активной темы Вордпресс, чтобы отфильтровать эти страницы в наших результатах поиска.

Просто скопируйте и вставьте эту функцию в файл functions.php вашей темы WordPress:

/**
 * This function modifies the main WordPress query to remove 
 * pages from search results.
 *
 * @param object $query The main WordPress query.
 */
function tg_exclude_pages_from_search_results( $query ) {
    if ( $query->is_main_query() && $query->is_search() && ! is_admin() ) {
        $query->set( 'post_type', array( 'post' ) );
    }    
}
add_action( 'pre_get_posts', 'tg_exclude_pages_from_search_results' );

Эта функция делает именно то, что нам нужно. Изменяя основной запрос WordPress с помощью хука pre_get_posts, мы можем определить, что мы хотим отображать в наших результатах поиска.

В этом случае все, что мы хотим показать, – это контент из наших записей, а не из наших страниц.

Вот и всё! Просто сохраните файл и проверьте поисковый запрос у себя на сайте. Вы исключили страницы из результатов поиска WordPress.

JavaScript: заменяем элемент массива

Если у нас есть массив и нам известен индекс элемента, то мы можем заменить его содержимое простым присваиванием:

const items = ['a', 'b', 'c', 'd', 'e', 'f']
const i = 2

items[i] = '--NEW-ITEM--'

console.log(items)
//[ 'a', 'b', '--NEW-ITEM--', 'd', 'e', 'f' ]

Если вы не знаете индекса элемента, то, возможно, сначала вам понадобится найти индекс элемента массива.

MySQL: INNER JOIN для трех таблиц

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

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

Но для практики я приведу упрощенный пример использования INNER JOIN для трех простых таблиц.

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

  1. Первая таблица предназначена для статей.
  2. Вторая для Тегов к статьям.
  3. Третья для связи тегов и статей.

Третья таблица и будет нашей таблицей связкой основных двух страниц.

Первая наша таблица с видеоиграми (или статьями) будет такой:

idtitlereg_datecontent
1BioShock Infinite2016-08-08

Вторая таблица с тегами:

idname
1jennefer
2elizabeth

И третья таблица, которая определяет связь статей (видеоигр) и тегов:

post_idtag_id
12

Приведенный ниже код может вернуть все сообщения, связанные с тегом “elizabeth“:

SELECT videogame.id,
    videogame.title,
    videogame.reg_date,
    tags.name,
    tags_meta.post_id
FROM tags_meta
INNER JOIN videogame ON videogame.id = tags_meta.post_id
INNER JOIN tags ON tags.id = tags_meta.tag_id
WHERE tags.name = "elizabeth"
ORDER BY videogame.reg_date

В ближайших постах более подробно разберем INNER JOIN трех таблиц.

WordPress: меняем url в постах через mysql

Частая ситуация после переноса сайта на новый домен или в папку или на поддомен – это смена адресов (url) страниц и ссылок.

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

Допустим, что у нас сайт находился в папке / и мы решили вернуть сайт в корень. Что делать со ссылками и адресами изображений в статьях? Мы воспользуемся простейшим запросом к базе данных MySQL:

UPDATE wp_posts SET post_content = REPLACE (post_content, '/wp-content/', '/wp-content/');

Заметили, что мы не прописывали отдельный домен? Мы можем заменить таким образом любой фрагмент текста статьи на нужный нам, а не только сам URL. Также приведу три основных запроса к Базе Данных, которыми пользуюсь сам на протяжении уже нескольких лет:

UPDATE wp_options SET option_value = replace(option_value, 'http://domain.ru', 'http://newdomain.ru') WHERE option_name = 'home' OR option_name = 'siteurl';

UPDATE wp_posts SET guid = replace(guid, 'http://domain.ru','http://newdomain.ru');

UPDATE wp_posts SET post_content = replace(post_content, 'http://domain.ru', 'http://newdomain.ru');
  • http://domain.ru – старый домен (*)
  • http://newdomain.ru – новый домен

* – поменяйте на свои

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

UPDATE wp_options SET option_value = replace(option_value, 'http://domain.ru', 'http://newdomain.ru') WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET guid = replace(guid, 'http://domain.ru','http://newdomain.ru');
UPDATE wp_posts SET post_content = replace(post_content, 'http://domain.ru', 'http://newdomain.ru');
UPDATE wp_postmeta SET meta_value = replace(meta_value,'http://domain.ru','http://newdomain.ru');

WordPress: делаем видео Youtube адаптивным

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

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

Код, который я приведу ниже, оборачивает iframe в div и добавляет некоторые классы. Затем CSS изменяет размер объекта до правильной пропорции 16:9.

Как обычно мы будем работать с двумя файлами нашей темы – functions.php и style.css. Скорее всего в вашей теме используются именно эти файлы. Для начала добавляем следующий код в ваш файл functions.php:

add_filter('the_content', function($content) {
	return str_replace(array("<iframe", "</iframe>"), array('<div class="iframe-container"><iframe', "</iframe></div>"), $content);
});

add_filter('embed_oembed_html', function ($html, $url, $attr, $post_id) {
	if(strpos($html, 'youtube.com') !== false || strpos($html, 'youtu.be') !== false){
  		return '<div class="embed-responsive embed-responsive-16by9">' . $html . '</div>';
	} else {
	 return $html;
	}
}, 10, 4);


add_filter('embed_oembed_html', function($code) {
  return str_replace('<iframe', '<iframe class="embed-responsive-item" ', $code);
});

Далее, мы должны добавить в файл со стилями (скорее всего в вашем случае style.css) следующие стилевые решения:

.embed-responsive {
  position: relative;
  display: block;
  height: 0;
  padding: 0;
  overflow: hidden;
}
.embed-responsive .embed-responsive-item,
.embed-responsive iframe {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 100%;
  border: 0;
}
.embed-responsive-16by9 {
  padding-bottom: 56.25%;
}

На этом всё. Больше ничего мы добавлять не будем. Совсем скоро я выложу для удобства плагин, который сделает видео Youtube адаптивными, чтобы никому не понадобилось ковыряться в файлах темы, что не всегда правильно делать, т.к. темы периодически обновляются.

WordPress: запрещаем автоматические редиректы

WordPress имеет функцию, благодаря которой он автоматически перенаправляет ваши URL, т.е. делает редирект, если считает, что адрес написан неправильно. Он подбирает самостоятельно “подходящий” url и редиректит на него.

Возьмем пример. У нас есть страница под названием my-page. Если мы обращаемся к ней по вот такому адресу:

www.mysite.com/something/my-page/

WordPress сразу же перенаправит на:

www.mysite.com/my-page/

Это происходит, т.к. по первому адресу страницы не существует и WordPress автоматом перенаправляет на второй url. Это не очень удобно, точнее – не очень контролируемый процесс даже с точки зрения SEO.

Как можно отключить эту функцию и вместо редиректа получать страницу с 404 ошибкой?

На самом деле ответ очень простой. Мы добавляем в файл functions.php вот такую строчку кода:

remove_action('template_redirect', 'redirect_canonical');

Но стоит сделать важное замечание. Если вы понаблюдаете, что происходит (через HttpFox, WireShark или аналогичный анализатор пакетов), то страницы автоматически перенаправляются с помощью 301 редиректа (“перемещено навсегда”), что является вполне подходящим поведением.

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

Будьте аккуратны. Это может повлиять на то, как WordPress обрабатывает процессы. В любом случае, – это ваш выбор, но не все уверены в том, что это хорошая идея.

Если посмотреть на функцию redirect_canonical в canonical.php, то вы также можете изменить поведение с помощью своего собственного фильтра.

В конце функции redirect_canonical() есть вызов для фильтрации окончательного ответа:

$redirect_url = apply_filters( 'redirect_canonical', $redirect_url, $requested_url );

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

WordPress: выводим количество запросов и время загрузки страницы

Рассмотрим как отображать количество запросов и время загрузки страницы в WordPress.

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

Обычно форумные движки внизу страницы отображают что-то вроде “страница загружена за N секунд при X запросах”.

На некоторых WordPress сайтах вы также можете увидеть в футере что-то вроде этого: “64 запроса за 1,248 сек”.

На самом деле всё достаточно просто, достаточно вставить следующий код куда угодно в свои файлы темы WordPress, например, footer.php:

<?php echo get_num_queries(); ?> запросов за <?php timer_stop(1); ?> секунд.

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

Вы можете вставить блок кода ниже в ваш текущий активный файл темы WordPress functions.php:

function wpse_footer_db_queries(){
    echo '<!-- '.get_num_queries().' запросов за '.timer_stop(0).' секунд. -->'.PHP_EOL;
}
add_action('wp_footer', 'wpse_footer_db_queries');

Приведенный выше блок кода будет отображать HTML-комментарий в футере вашей темы перед </body> и </html>, содержащий количество запросов к базе данных и время, которое понадобилось для получения страницы.

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

Wordrpess: вывод случайной записи произвольного типа

Приведу код, когда в WordPress нужно отобразить один случайный пост пользовательского типа на странице или в виджете в боковой панели.

<?php
  $args = array(
    'post_type'=>'testimonials', 
    'orderby'=>'rand', 
    'posts_per_page'=>'1'
  );

  $testimonials=new WP_Query($args);

  while ($testimonials->have_posts()) : $testimonials->the_post(); 
?>
    <h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
    <p><?php the_excerpt(); // or the_content(); ?></p>
<?php 
  endwhile;
  wp_reset_postdata();
?>

WordPress: добавление формы ответа к комментарию

Отвечаю на частый вопрос – как добавить форму ответа к конкретному комментарию в WordPress на который нужно ответить, если при нажатии кнопки “Ответить” (Reply), форма ответа появляется внизу страницы (под последним комментарием), а не под нужным комментарием?

  1. Убедитесь, что у вас включены древовидные (вложенные) комментарии: перейдите в “Панель управления” -> “Настройки” -> “Обсуждение” (Dashboard -> Settings -> Discussion) и включите древовидные (вложенные) комментарии, поставив галочку и указав уровень вложенности.
  2. Убедитесь, что ваша тема регистрирует скрипт comment-reply. Скорее всего он подключается в файле header.php, functions.php и т.п.

Подключение скрипта выглядит так:

<?php wp_enqueue_script( 'comment-reply' ); ?>

Этот вызов обычно обернут в условие, например:

<?php
if ( is_single() && comments_open() && get_option( 'thread_comments' ) ) {
    wp_enqueue_script( 'comment-reply' );
}
?>

Вы также можете увидеть этот код внутри функции обратного вызова, подключенной к wp_enqueue_scripts, wp_head или comment_form_before.

Для подключения скрипта comment-reply через functions.php лучше делать так:

<?php
function digapp_enqueue_comment_reply_script() {
    if ( get_option( 'thread_comments' ) ) {
        wp_enqueue_script( 'comment_reply' );
    }
}
add_action( 'comment_form_before', 'digapp_enqueue_comment_reply_script' );
?>

WordPress: убираем стили Elementor в Dom страницы сайта

Небольшая заметка о том, как убрать инлайн-стили в dom сайта на WordPress, которые вставляет плагин Elementor. Перейдите в:

Elementor -> Настройки -> Эксперименты (Elementor > Settings > Experiments)

В разделе “Текущие эксперименты” (Ongoing Experiments) отключите (установите неактивным) “Улучшенная загрузка CSS” (Improved CSS Loading).

Заключение

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

Данный материал я буду стараться дополнять и обновлять по мере выхода новых версий Вордпресса и тестирования старых блоков кода.

Published 16 June 2022
Category: Блог
Tags:

Leave a Reply

Your email address will not be published.