Выводим миниатюры для записи по умолчанию с помощью has_post_thumbnail()

В хорошо продуманных темах в отсутствие миниатюры у записи выводится изображение по умолчанию. Для таких случаев нужно изменить код функции the_post_thumbnail() следующим:

if(has_post_thumbnail()) {
    the_post_thumbnail();
}
else {
    echo '<img src="'.get_template_directory_uri().'/images/default-thumb.jpg" alt="'.get_the_title().'" class="default-thumb" />';
}

Таким образом можно сохранить целостность внешнего вида темы.

Добавлено: 04 Мая 2018 07:46:03 Добавил: Андрей Ковальчук

Изменяем фавиконку для панели администратора с помощью is_admin()

Данный код может быть полезен, когда вы работаете с большим количеством открытых закладок в вашем блоге. В таком случаем можно немного изменить фавиконку и сохранить ее как adminfav.ico – например, фавиконка панели администратора может иметь другой цвет фона.

Остается только добавить код в файл functions.php:

function admin_favicon() {
    if(is_admin()) {
        echo '<link rel="shortcut icon" href="'.get_bloginfo('url').'/adminfav.ico" />';
    }
}
add_action('admin_head','admin_favicon');

Добавлено: 04 Мая 2018 07:45:35 Добавил: Андрей Ковальчук

Формируем список заголовков записей (вместо полного содержания) в архиве на основе дат с помощью is_date()

Иногда списка заголовков более чем достаточно на определенных страницах архива – например, для архива на основе дат. С помощью условного тега is_date() можно выкинуть лишнее из основного цикла , кроме заголовка.

Данная техника требует внимания, так как фалы archive.php различаются в каждой теме. (А если в вашей теме есть файл date.php, вам следует редактировать его). Найдите основной цикл в коде и меняйте его следующим образом:

if(is_date()) {
    // Если тема использует  заголовки h2 для записей, используйте h2. Если - h1, используйте h1.
    echo '<h2>'.the_title().'</h2>';
} else {
    // ...
    // Оригинальный код в основном цикле
    // ...
}

Добавлено: 04 Мая 2018 07:44:52 Добавил: Андрей Ковальчук

Скрываем автоматически генерированную цитату с помощью has_excerpt()

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

function full_excerpt() {
    if (!has_excerpt()) {
        echo '';
    } else {
        echo get_the_excerpt();
    }
}

Добавляем его в файл functions.php и заменяем реализацию the_excerpt() на full_excerpt().

Добавлено: 04 Мая 2018 07:44:22 Добавил: Андрей Ковальчук

Удаляем определенные элементы со страницы 404 с помощью is_404()

Самый простой код из всех, приведенных в данной статье. Нужно просто заключить “определенные элементы” в приведенный ниже код (например, рекламные блоки)!

if(!is_404()) {
    // Здесь размещаются "определенные элементы".
}

Добавлено: 04 Мая 2018 07:43:50 Добавил: Андрей Ковальчук

Выводим имя автора на странице предварительного просмотра с помощью is_preview()

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

function preview_warning() {
    if(is_preview()) {
        echo '<div id="preview-warning">Вы находитесь на странице предварительного просмотра!<div>';
    }
}
add_action('the_content','preview_warning');

Конечно, нужно еще добавить код в файл style.css, для формирования текста предупреждения:
#preview-warning {
    background:#800;
    line-height:50px;
    font-size:30px;
    font-weight:bold;
    text-align:center;
    position:fixed;
    bottom:0;
}

Добавлено: 04 Мая 2018 07:43:14 Добавил: Андрей Ковальчук

Раздел “Еще из данной категории” для записи в специальной категории с помощью in_category()

Иногда требуется организовать раздел “Еще из данной категории” для определенной категории (и только для нее). Допустим, у вас есть категория “Новости” и другие категории не подходят для раздела, который нужно создать. Условный тег in_category()поможет решить задачу:

function more_from_category($cat_ID) {
    if(in_category($cat_ID) {
        $posts = get_posts('numberposts=5&category='.$cat_ID);
        $output = '<h3>Еще из данной категории</h3>';
        $output.= '<ul>';
        foreach($posts as $post) {
            $output.= '<li><a href="'.get_the_title().'">'.get_permalink.'</a></li>';
        }
        wp_reset_query();
        $output.= '</ul>';
        echo $output;
    }
}

Делаем функцию такой, какая требуется для задачи и добавляем ее в файл functions.php. Затем открываем файл single.php и помещаем код (<?php more_from_category(123); ?>) туда, где должен появляться раздел.

Добавлено: 04 Мая 2018 07:42:30 Добавил: Андрей Ковальчук

Добавляем код CSS и JS на определенную страницу с помощью is_page()

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

function extra_assets() {
    if(is_page(123)) { // '123' - идентификатор страницы, которая нуждается в дополнительных файлах
        wp_enqueue_script('my-script', get_template_directory_uri().'/some/path/in/your/theme/folder/script.js');
        wp_enqueue_style('my-style', get_template_directory_uri().'/some/path/in/your/theme/folder/style.css');
    }
}
add_action('wp_head','extra_assets');

Как и в первом примере, код нужно добавить в файл functions.php. (Нужно изменить число “123” на реальный идентификатор страницы!)

Добавлено: 04 Мая 2018 07:41:54 Добавил: Андрей Ковальчук

Выводим сообщение на главной странице с помощью is_front_page()

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

Сначала нужно скачать плагин ColorBox jQuery. Берем файл colorbox.min.js из папки “colorbox/colorbox” и colorbox.css (вместе с соответствующей папкой “images”) и размещаем их в папке “colorbox” в своем проекте.

Затем создаем файл colorbox.load.js, чтобы загрузить всплывающее информационное окно. Размещаем данный файл также в папке “colorbox”:

jQuery(document).ready(function($) {
    var $popup = $("#mypopup");
    $.colorbox({href:$popup});
});

После чего размещаем код HTML всплывающего окна (с идентификатором “mypopup” для CSS) внутри файла index.php вашей темы и скрываем его в файле style.css (с помощью кода “#mypopup {display:none;}“).
function front_popup() {
    if(is_front_page()) {
        // загрузить colorbox.min.js
        wp_enqueue_script('colorbox-js', get_template_directory_uri().'/colorbox/colorbox.min.js',array('jquery'));
        // загрузить colorbox.load.js
        wp_enqueue_script('colorbox-load-js', get_template_directory_uri().'/colorbox/colorbox.load.js',array('colorbox-js'));
        // загрузить colorbox.css
        wp_enqueue_style('colorbox-css', get_template_directory_uri().'/colorbox/colorbox.css');
    }
}
add_action('wp_head','front_popup');

Копируем данный код в файл functions.php!

Примечание: для того, чтобы закрыть всплывающее окно, нужно добавить ссылку в код всплывающего окна. Например, такую:
<a href="javascript:$.colorbox.close();">Закрыть</a>

Добавлено: 04 Мая 2018 07:41:16 Добавил: Андрей Ковальчук

Интроспекция и отражение в PHP

В данном уроке описывается использование функции интроспекции в PHP и Reflection API для получения информации о классах, интерфейсах, свойствах и методах. Такие действия нужны для составления полной картины о коде в момент выполнения и создания сложных приложений.

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

Интроспекция в PHP позволяет проверить классы, интерфейсы, методы и свойства. В PHP имеется большое количество функций, которые можно использовать для решения таких задач. Мы представим краткий обзор некоторых классов, методов и функций PHP с примерами их использования. Также в уроке будет представлен API, который имеет функционал очень близкий к интроспекции - Reflection API.

Функции интроспекции PHP
В первом примере демонстрируются полезные функции интроспекции PHP. Их можно использовать для получения основной информации о классе - имя, имя родительского класса и так далее.

class_exists() – проверяет определение класса
get_class() – возвращает имя класса объекта
get_parent_class() – возвращает имя родительского класса объекта
is_subclass_of() – проверяет, имеется ли в родителях объекта заданный класс
Пример кода PHP, который содержит определение для классов Introspection и Child, а также выводит информацию, полученную с помощью перечисленных выше функций:

<?php
class Introspection
{
    public function description() {
        echo "Я супер класс для класса Child.\n";
    }
}
 
class Child extends Introspection
{
    public function description() {
        echo "Я класс " . get_class($this) , ".\n";
        echo "Я потомок класса " . get_parent_class($this) , ".\n";
    }
}
 
if (class_exists("Introspection")) {
    $introspection = new Introspection();
    echo "Имя класса : " . get_class($introspection) . "\n";
    $introspection->description();
}
 
if (class_exists("Child")) {
    $child = new Child();
    $child->description();
 
    if (is_subclass_of($child, "Introspection")) {
        echo "Да, " . get_class($child) . " является подклассом Introspection.\n";
    }
    else {
        echo "Нет, " . get_class($child) . " не является подклассом Introspection.\n";
    }
}

Выше приведенный код выведет:
Имя класса: Introspection
Я супер класс для класса Child.
Я класс Child.
Я потомок класса Introspection.
Да, Child является подклассом Introspection.

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

Методы get_class() и get_parent_class() возвращают имя класса объекта или его родителя соответственно. Оба метода принимают в качестве аргумента объекты.

Метод is_subclass_of() получает объект и строку, в которой содержится имя родительского класса, а возвращает логическое значение результата проверки принадлежности объекта родительскому классу.

Во втором примере определяется интерфейс ICurrencyConverter и класс GBPCurrencyConverter и выводится информация с помощью ниже перечисленных функций.

get_declared_classes() – возвращает список всех объявленных классов
get_class_methods() – возвращает имена методов класса
get_class_vars() – возвращает свойства класса
interface_exists() – проверяет, определен или нет интерфейс
method_exists() – проверяет, определен или нет метод
<?php
interface ICurrencyConverter
{
    public function convert($currency, $amount);
}
 
class GBPCurrencyConverter implements ICurrencyConverter
{
    public $name = "GBPCurrencyConverter";
    public $rates = array("USD" => 0.622846,
                          "AUD" => 0.643478);
    protected $var1;
    private $var2;
 
    function __construct() {}
 
    function convert($currency, $amount) {
        return $rates[$currency] * $amount;
    }
}
 
if (interface_exists("ICurrencyConverter")) {
    echo "Интерфейс ICurrencyConverter определен.\n";
}
 
$classes = get_declared_classes();
echo "Доступны следующие классы:\n";
print_r($classes);
 
if (in_array("GBPCurrencyConverter", $classes)) {
    print "Определен класс GBPCurrencyConverter.\n";
 
    $gbpConverter = new GBPCurrencyConverter();
 
    $methods = get_class_methods($gbpConverter);
    echo "Доступны следующие методы:\n";
    print_r($methods);
 
    $vars = get_class_vars("GBPCurrencyConverter");
    echo "Доступны следующие свойства:\n";
    print_r($vars);
 
    echo "Метод convert() есть в классе GBPCurrencyConverter: ";
    var_dump(method_exists($gbpConverter, "convert"));
}

Код выдаст результат:

Интерфейс ICurrencyConverter определен.
Доступны следующие классы:
Array
(
    [0] => stdClass
    [1] => Exception
    [2] => ErrorException
    [3] => Closure
    [4] => DateTime
    [5] => DateTimeZone
    [6] => DateInterval
    [7] => DatePeriod
    ...
    [154] => GBPCurrencyConverter
)

Определен класс GBPCurrencyConverter.
Доступны следующие методы:
Array
(
    [0] => __construct
    [1] => convert
)

Доступны следующие свойства:
Array
(
    [name] => GBPCurrencyConverter
    [rates] => Array
        (
            [USD] => 0.622846
            [AUD] => 0.643478
        )
)

Метод convert() есть в классе GBPCurrencyConverter: bool(true)
Метод interface_exists() очень похож на метод class_exists(), который обсуждался ранее. Он проверяет, определен или нет заданный интерфейс. В качестве параметров он получает имя интерфейса и логическую переменную для автозазгрузки (опционально).

Метод get_declared_classes() возвращает массив имен всех определенных классов. В зависимости от загруженных библиотек результат может быть разным.

Метод get_class_method() получает экземпляр объекта или строку с именем нужного класса в качестве аргумента, а возвращает массив имен методов, которые определены в классе.

Обратите внимание на различие определенных в классе ICurrencyConverter свойств и списком, возвращаемым методом get_class_vars() (вывелись только $name и $rates). Частные и защищенные свойства пропускаются.

Reflection API
PHP поддерживает отражение с помощью Reflection API. Reflection API предлагает существенно больше классов и методов для решения задач отражения. Класс ReflectionClass является основным классом API и используется для получения информации о классах, интерфейсах, методах и всех компонентов классов. Отражение очень легко применять в своем коде.

Ниже приводится пример использования отражения с определениями интерфейса ICurrencyConverter и классов Child и GBPCurrencyConverter:
<?php
$child = new ReflectionClass("Child");
$parent = $child->getParentClass();
echo $child->getName() . " является подклассом " . $parent->getName() . ".\n";
 
$reflection = new ReflectionClass("GBPCurrencyConverter");
$interfaceNames = $reflection->getInterfaceNames();
if (in_array("ICurrencyConverter", $interfaceNames)) {
    echo "GBPCurrencyConverter реализует ICurrencyConverter.\n";
}
 
$methods = $reflection->getMethods();
echo "Доступны следующие мтоды:\n";
print_r($methods);
 
if ($reflection->hasMethod("convert")) {
    echo "Метод convert() есть в классе GBPCurrencyConverter.\n";
}

Код выдаст следующий результат:

Child является подклассом Introspection.
GBPCurrencyConverter реализует ICurrencyConverter.

Доступны следующие методы:
Array
(
    [0] => ReflectionMethod Object
        (
            [name] => __construct
            [class] => GBPCurrencyConverter
        )
 
    [1] => ReflectionMethod Object
        (
            [name] => convert
            [class] => GBPCurrencyConverter
        )
 
)

Метод convert() есть в классе GBPCurrencyConverter.
Метод getInterfaceNames() возвращает массив с именами интерфейсов, которые реализует класс. Метод getParentClass() может вернуть объект ReflectionClass, представляющий родительский класс, или значение false, если родителя нет. Для получения имени объекта ReflectionClass используется метод getName().

Метод getMethods() возвращает массив имен методов и может принимать опциональный аргумент - битовую маску из значений ReflectionMethod::IS_STATIC, IS_PUBLIC, IS_PROTECTED, IS_PRIVATE, IS_ABSTRACT, и IS_FINAL для фильтрации списка.

Reflection API предоставляет разработчику отличную реализацию отражения, с помощью которой можно создавать очень сложные приложения, такие как ApiGen.

Добавлено: 03 Мая 2018 12:05:22 Добавил: Андрей Ковальчук

HTML карта сайта на WordPress

Карта сайта HTML (в отличие от карты сайта XML) часто упоминается как полезный для SEO инструмент. Кроме того, она очень нравится читателям, которым удобно пользоваться ею для перехода к нужному материалу.

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

В действительности, очень полезно использовать карту сайта HTML как часть темы. В таком случае карту сайта можно использовать и на странице WordPress для ошибки 404. Чтобы сделать карту сайта HTML частью темы надо создать папку partials в папке вашей темы. В папке partials создаем файл с именем sitemap.php.

Копируем в него следующий код и правим его в соответствии со структурой своего сайта:

<h2 id="authors">Authors</h2>
<ul>
<?php
wp_list_authors(
  array(
    'exclude_admin' => false,
  )
);
?>
</ul>
  
<h2 id="pages">Страницы</h2>
<ul>
<?php
// Страницы, которые надо исключить из карты сайта добавляем к exclude здесь
wp_list_pages(
  array(
    'exclude' => '',
    'title_li' => '',
  )
);
?>
</ul>
  
<h2 id="posts">Заметки</h2>
<ul>
<?php
// Категории, которые надо исключить, добавляем к exclude здесь
$cats = get_categories('exclude=');
foreach ($cats as $cat) {
  echo "<li><h3>".$cat->cat_name."</h3>";
  echo "<ul>";
  query_posts('posts_per_page=-1&cat='.$cat->cat_ID);
  while(have_posts()) {
    the_post();
    $category = get_the_category();
    // Ссылку на заметку выводим только один раз, даже если она указана в нескольких категориях
    if ($category[0]->cat_ID == $cat->cat_ID) {
      echo '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
    }
  }
  echo "</ul>";
  echo "</li>";
}
?>
</ul>

Теперь там, где нужно вывести HTML карту сайта в теме WordPress вставляем следующий код:
<?php get_template_part('/partials/sitemap'); ?>
 
<br>

Шаблон страницы для HTML карты сайта
Чтобы сделать шаблон для карты сайта нужно скопировать файл page.php и переименовать копию в page-sitemap.php. Затем открываем его и ниже вызова функции the_content(); добавляем упомянутый ранее вызов get_template_part(). Теперь переходим в начало файла и после открывающего тега <?php (но перед вызовом get_header()), добавляем комментарий:
/*
Template Name: Карта сайта HTML
*/

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

Добавлено: 03 Мая 2018 12:00:15 Добавил: Андрей Ковальчук

«Хлебные крошки» без плагина

Ну и на закуску, вот фрагмент кода с помощью которого на блоге можно организовать так называемые «хлебные крошки», это дополнительный элемент навигации, когда отображается путь в виде ссылок на страницы выше рангом на страницу категории и главную. Примерно вот так (Главная->Категория 1->Название статьи). Данный фрагмент кода необходимо вставить в файл function.php Вашей темы:

<?php
function the_breadcrumb() {
      echo '<ul id="crumbs">';
   if (!is_home()) {
      echo '<li><a href="';
      echo get_option('home');
      echo '">';
      echo 'Главная';
      echo "</a></li>";
      if (is_category() || is_single()) {
         echo '<li>';
         the_category(' </li><li> ');
         if (is_single()) {
            echo "</li><li>";
            the_title();
            echo '</li>';
         }
      } elseif (is_page()) {
         echo '<li>';
         echo the_title();
         echo '</li>';
      }
   }
   elseif (is_tag()) {single_tag_title();}
   elseif (is_day()) {echo"<li>Архив за "; the_time('F jS, Y'); echo'</li>';}
   elseif (is_month()) {echo"<li>Архив за "; the_time('F, Y'); echo'</li>';}
   elseif (is_year()) {echo"<li>Архив за "; the_time('Y'); echo'</li>';}
   elseif (is_author()) {echo"<li>Архив автора "; echo'</li>';}
   elseif (isset($_GET['paged']) && !empty($_GET['paged'])) {echo "<li>Архив"; echo'</li>';}
   elseif (is_search()) {echo"<li>Результат поиска"; echo'</li>';}
   echo '</ul>';
}
?>

Что использовать эти «хлебные крошки», добавляем в файлы (archive.php, category.php, page.php, single.php, search.php) следующую функцию:
<?php the_breadcrumb(); ?>

Внешний вид «хлебных крошек» оставляет желать лучшего) Поэтому Вам придется поработать над стилями!

Добавлено: 03 Мая 2018 07:06:55 Добавил: Андрей Ковальчук

Исключить записи с главной страницы

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

<?php
function excludeCat($query) {
  if ( $query->is_home ) {
    $query->set('cat', '-3,-5,-23');
  }
  return $query;
}
add_filter('pre_get_posts', 'excludeCat');
?>

Где 3,5 и 23 это ID категорий.

Добавлено: 03 Мая 2018 07:06:13 Добавил: Андрей Ковальчук

PHP код в тексте

Бывает при написании статьи нужно вставить код PHP, но если его просто вставить то он не отобразиться. Чтобы этого избежать используем следующий фрагмент, его необходимо добавить в файл function.php темы:

<?php
function bbcode( $attr, $content = null ) {
        $content = clean_pre($content); // Очистите предварительно теги
        return '< pre">< code>' .
                str_replace('<', '&lt', $content) . // Заменить символ <
                '< /code>< /pre>';
    }
add_shortcode('code', 'bbcode'); ?>


Не забудьте убрать пробелы в тегах!
А работает это следующим образом, в месте где необходимо вставить PHP код, выделяем его вот так:
[ code]<?php echo "Hello"; ?>[ /code]

ВНИМАНИЕ! Я добавил 2 лишних пробела чтобы показать как это работает, но при использовании их надо убрать! Первый пробел после первой квадратной скобки, второй пробел после третьей квадратной скобки.

Добавлено: 03 Мая 2018 07:04:54 Добавил: Андрей Ковальчук

Добавить кнопку Google +1

Достаточно долго искал пути решения этой проблемы, ставил разные плагины, коды. Но ничего лучше чем просто вставить вот этот код в файл single.php, так и не нашел.

<g:plusone size="medium"></g:plusone>

Для работы кнопочки необходимо подключиться к google, добавляем следующую строку в файл header.php:
<script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>

Добавлено: 03 Мая 2018 07:03:50 Добавил: Андрей Ковальчук