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

Содержание скрыть

Вставка header в файлы темы

Начнем с самого простого — вставки хедера:

<?php get_header(); ?>

Вставить footer в тему

<?php get_footer(); ?>

Убираем категорию с главной страницы

function exclude_category_home( $query ) {
if ( $query->is_home ) {
$query->set( 'cat', '-5' );
}
return $query;
}
 
add_filter( 'pre_get_posts', 'exclude_category_home' );

Получение URI каталога темы

<?php echo get_template_directory_uri(); ?>

// Пример

<img src="<?php echo get_template_directory_uri(); ?>/images/logo.png" width="" height="" alt="" />

Стандартный цикл (loop) в WordPress

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

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

<?php endwhile; ?>
<?php else :
    _e( 'Sorry, no posts matched your criteria.', 'textdomain' );
endif; ?>

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

Данный сниппет состоит всего из трех строк, если не фантазировать:

<?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 }; ?>

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

<?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 );

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

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

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

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

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

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

<?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 в справке по синтаксису констант и волшебным константам.

Перевести слово «Reply» в WordPress

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

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

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

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

Убираем название статьи из хлебных крошек 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 иконку поиска в конец списка.

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, используя сниппет, который нужно вставить в нужный файл вашей темы.

<?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
	?>

Отключаем 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 страницы мы должны в файл функций (functions.php) нашей темы добавить следующий сниппет:

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

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

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

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

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

Вставляем код после каждого H2

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');

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

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

Вставляем контент после определенного абзаца

Если вы немного разбираетесь в PHP, то данный код можно дополнить и выводить два или три блока контента.

<?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.

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`;

Стилизуем скроллбар на сайте через CSS

Добавляем в файл style.css вашей темы:

/* scrollbar */
::-webkit-scrollbar {
  width: 10px;
}

/* Track */
::-webkit-scrollbar-track {
  background: #ddd; 
}
 
/* Handle */
::-webkit-scrollbar-thumb {
  background: #aaa; 
}

/* Handle on hover */
::-webkit-scrollbar-thumb:hover {
  background: #777; 
}