Фрагменты кода WordPress и программные решения

Последнее обновление: 4 октября, 2020

wordpress, wpml

Вывод основных данных (title description …)

Вывода названия категории (текст без ссылки):

<?php single_cat_title() ?>

Для вывода названия категории в виде ссылки можно использовать код:

<?php the_category(', ') ?>

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

<?php echo category_description( $category_id ); ?>

Запроса вывода описания категории материала конкретной рубрики (где N — номер категории):

<?php echo category_description(N); ?>

Вывод даты

<?php the_date('d.m.Y'); ?>

При использовании на странице с выводом записей в цикле информация о дате выведется только для первой статьи за это число.

Вывод названия категории материала

<?php the_category(', ') ?>

Вывод меток к материалу

<?php the_tags( 'Метки к статье: ', ', ', '.' ); ?>

Три блока в одиночных скобках:

  1. Выводится перед первой меткой.
  2. Между метками.
  3. После списка меток.

Вывод пользовательской таксономии

$terms = get_the_terms( $post->ID , 'instruction_tag' ); 
foreach ( $terms as $term ) {
    $term_link = get_term_link( $term, 'instruction_tag' );
    if ( is_wp_error( $term_link ) )
        continue;
    echo '<a href="' . $term_link . '">' . $term->name . '</a> ';
}

Вывод миниатюры

Код для файла, где будет выводиться миниатюра (index.php, single.php, category.php и т.д.):

<?php if(has_post_thumbnail()): ?>
<?php echo get_the_post_thumbnail(get_the_ID(), 'category-thumb'); ?>
<?php else: ?>
<img src="http://placehold.it/675x385" alt="">
<?php endif; ?>

Код для файла functions.php:

if (function_exists( 'add_theme_support' ))
{
add_theme_support( 'post-thumbnails' );
set_post_thumbnail_size( 50, 50, true );
}
if ( function_exists( 'add_image_size' ) ) {
//add_image_size( 'main-thumb', 769, 323, true );
add_image_size( 'category-thumb', 675, 385, true );
}

Указание названия шаблона

В начале файла с кодом страницы нужно указать название шаблона страницы:

<?php /* Template Name: TemplateName */ ?>

Указание пути к файлам темы

<?php bloginfo('stylesheet_directory'); ?>

Произвольные поля

Вывод произвольного поля (для текущей страницы или записи):

<?php the_field('FieldName'); ?>
Получение произвольного поля (для текущей страницы или записи) в переменную:
<?php $VarFieldName = get_field("FieldName"); ?>

Получение и вывод произвольного поля из страницы с указанным ID (в примере ID = 10):

<?php echo $VarFieldName = get_field(FieldName, 10); ?>

Вывод информации в случае, если произвольное поле не пустое:

<?php if ( get_field("FieldName") != '') { echo 'something'; } ?>

Вывод группы произвольных полей

<?php
  if( get_field('manager-contacts') )
  {
    while( has_sub_field('manager-contacts') )
    { 
      echo get_sub_field('manager-name');    
    }
  }
?>

Подключение файла php

<?php require_once 'dir/FileName.php'; ?>

Панель администратора

Для того, чтобы появилась панель администратора и подгрузились стандартные функции WP нужно вставить wp_head и wp_footer в соответствующих местах на странице:

<!DOCTYPE html>
<html>
    <head>
    ...
        <?php wp_head(); ?>
    </head>
    <body>
    ...
        <?php wp_footer(); ?>
    </body>
</html>

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

Перед выводом меню, следует добавить соответствующую функцию в файл functions.php:

if (function_exists('add_theme_support')) {
    add_theme_support('menus');
};

В месте, где мы хотим вывести меню, необходимо вставить код:

<?php wp_nav_menu( array('menu' => 'MenuName' )); ?>

Выводим статьи нужной нам категории

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

<?php
  $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
  $custom_args = array(
    'post_type' => 'post',
    'category_name' => 'CategoryName',
    'posts_per_page' => 10,
    'paged' => $paged
    );
  $custom_query = new WP_Query( $custom_args );
  if ( $custom_query->have_posts() ) : while ( $custom_query->have_posts() ) : $custom_query->the_post();
?>

  <!-- ссылка на полную версию -->
  <?php the_permalink() ?>
  <!-- вывод поля из Произвольные поля -->
  <?php the_field('FieldName'); ?>
  <!-- вывод тегов через слеш -->
  <?php the_tags( '', ' / ', '' ); ?>
  <!-- вывод даты -->
  <?php echo get_the_date( 'F'.' '.'d'.', '.'Y', '', ''); ?>

<?php
  endwhile;
  endif;
?>
    
<!-- pagination -->
<?php
  if (function_exists(custom_pagination)) {
    custom_pagination($custom_query->max_num_pages,"",$paged);
  }
?>
<?php wp_reset_postdata(); ?>

А этот код потребуется вставить в functions.php

function custom_pagination($numpages = '', $pagerange = '', $paged='') {

  if (empty($pagerange)) {
    $pagerange = 2;
  }

  /**
   * This first part of our function is a fallback
   * for custom pagination inside a regular loop that
   * uses the global $paged and global $wp_query variables.
   * 
   * It's good because we can now override default pagination
   * in our theme, and use this function in default quries
   * and custom queries.
   */
  global $paged;
  if (empty($paged)) {
    $paged = 1;
  }
  if ($numpages == '') {
    global $wp_query;
    $numpages = $wp_query->max_num_pages;
    if(!$numpages) {
        $numpages = 1;
    }
  }

  /** 
   * We construct the pagination arguments to enter into our paginate_links
   * function. 
   */
  $pagination_args = array(
    'base'            => get_pagenum_link(1) . '%_%',
    'format'          => 'page/%#%',
    'total'           => $numpages,
    'current'         => $paged,
    'show_all'        => False,
    'end_size'        => 1,
    'mid_size'        => $pagerange,
    'prev_next'       => True,
    'prev_text'       => __('< PREVIOUS'),
    'next_text'       => __('NEXT >'),
    'type'            => 'plain',
    'add_args'        => false,
    'add_fragment'    => ''
  );

  $paginate_links = paginate_links($pagination_args);

  if ($paginate_links) {
      echo '<div class="custom_pager">';
      echo $paginate_links;
      echo '</div>';
  }
}

Еще вариант:

<?php $posts = get_posts ("category=1&orderby=date&numberposts=4"); ?> 
<?php if ($posts) : ?>
<?php foreach ($posts as $post) : setup_postdata ($post); ?>
  <?php // the_field('proizvolnoe-pole'); ?>
<?php 
  endforeach;
  wp_reset_postdata();
?>
<?php endif; ?>

Категория записи

Узнаем категорию записи:

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php $temp_cat = get_the_category(); ?>
<?php $category = $temp_cat[0]->cat_name; ?>
<?php echo $category ?>
<?php endwhile; endif; ?>

Зачем так, ведь существует стандартная функция? Чтобы можно было реализовать разный вывод контента в зависимости от того, к какой категории относится запись. К примеру:

<?php
  if ($category == 'blog' ) {
    echo 'Виджет для Записи, которая относится к категории blog';
  }
  else if ($category == 'news' ) {
    echo 'Виджет для Записи, которая относится к категории news';
  }
?>

Вывод контента на различных языках (WPML + shortcodes)

<?php
wpml_e__if_language( '', 'ru' );
wpml_e__if_language( '', 'uk' );
?>
Определение текущего языка страницы:
<?php global $sitepress; $current_lang = $sitepress->get_current_language(); ?>

Вывод переключателя языка (WPML) на странице

  <?php
if ( function_exists('icl_get_languages') ) {
      $languages = icl_get_languages('skip_missing=1&orderby=code&order=asc');
      $lang_active = '';
      $langs_other = '';
  foreach ( $languages as $language ) :
    /* Перебираем все языки, устанавливаем выводимое краткое название и класс. Класс нужен (к примеру) для случаев, когда мы добавляем иконку флага. */    
    switch ($language['native_name']) {
      case 'English':
        $lang_short = 'EN';
        $lang_class = 'si_wpml_icon_eng';
        break;
      case 'Slovenčina':
        $lang_short = 'SL';
        $lang_class = 'si_wpml_icon_sl';
        break;
      case 'Русский':
        $lang_short = 'RU';
        $lang_class = 'si_wpml_icon_rus';
        break;
    }
    
    /* Проверяем, активный ли текущий язык (активный язык не должен быть ссылкой) */
              if ( $language['active'] == '1' ) { // активный
                      $lang_active = '<div class="drop-lang"><i class="'.$lang_class.'">'.$lang_short.'</i><img class="drop-down-ico" src="'.esc_url(get_template_directory_uri()).'/img/drop-ico.svg"></div><div class="drop-content">';
                  } else { // не активный
                      $langs_other .= '<div class="drop-items"><a href="'.$language['url'].'"><i class="'.$lang_class.'">'.$lang_short.'</i></a></div>';
                  }
          endforeach;
  }

/* Выводим полученную информацию */
echo $lang_active;
echo $langs_other;
  ?>

Вывод кода на определенных страницах сайта

В теме cms WordPress за шаблон страницы отвечает файл page.php.

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

<?php if(is_page(101)||is_page(102)) { ?>
any html code
<?php } else if(is_page(103)) { ?>
any html code
<?php } else { ?>
any html code
<?php } ?>

Цифры 101, 102, 103 — это ID страниц. ID страницы можно увидеть, если посмотреть на код ссылки на редактирование публикации. Для этого заходим в панель управления страницами ( ../wp-admin/edit.php?post_type=page ), наводим курсор на название страницы, ID которой мы хотим узнать и смотрим, куда ведет ссылка ( ../wp-admin/post.php?post=101&action=edit ). В том месте, где в примере цифры 101 и будет номер страницы.

Вывод последних записей WordPress

I способ

<?php wp_get_archives( array( 'type' => 'postbypost', 'limit' => 10, 'format' => 'html' ) ); ?>

II способ

<ul>
 <?php $the_query = new WP_Query( 'showposts=5' ); ?>
<?php while ($the_query -> have_posts()) : $the_query -> the_post(); ?>
<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<li><?php echo substr(strip_tags($post->post_content), 0, 250);?>
</li> <?php endwhile;?>
</ul>

Разное количество записей в WordPress на страницах home archive search

I способ: правка functions.php

Код для файла functions.php

function custom_posts_per_page($query){
if(is_home()){
$query->set('posts_per_page',5);
}
if(is_archive()){
$query->set('posts_per_page',10);
}
if(is_search()){
$query->set('posts_per_page',-1);
}
}
add_action('pre_get_posts','custom_posts_per_page');

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

II способ: плагин

Можно также использовать плагин с названием «Different Posts Per Page» (или cbnet Different Posts Per Page). На самом деле плагинов такого рода немало, просто этот первым попался под руку.

III способ: использование WP_Query

Ищем в index.php или другом файле темы запись похожую на:

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

Меняем её на:

<?php $top_query = new WP_Query('showposts=5'); ?>
<?php if(have_posts()) : ?>
<?php while($top_query->have_posts()) : $top_query->the_post(); $first_post = $post->ID; ?>

В указанном примере будут выводиться 5 постов.

Случайные отзывы на главной странице WP

Исходные данные:

Сайт на WordPress, создан новый тип записей (вакансии), через ACF добавлена возможность для каждой вакансии добавлять отзывы людей трудоустроенных по этой вакансии. Появилась необходимость выводить небольшое количество случайных отзывов из разных вакансий.

Один из путей решения:

  1. Пройти по всем вакансиям, выбрать из них все отзывы и поместить в массив.
  2. Случайным образом выбрать из массива N позиций и вывести их.
// устанавливаем количество выводимых отзывов
$number_of_reviews_displayed = 3;

// выбираем все отзывы из вакансий
$args = array( 'post_type' => 'oferty_pracy' );
$main_page_reviews = new WP_Query($args);
if ($main_page_reviews->have_posts()) : while ($main_page_reviews->have_posts()) : $main_page_reviews->the_post();
    if( get_field('vacansii_reviews_gallery') ) {
        while( has_sub_field('vacansii_reviews_gallery') ) {
            $all_reviews_massive[] = '<div class="ark_feed">
                 <div class="ark_photo">
                     <div class="photo" style="background-image: url('.get_sub_field('vacansii_review_userphoto').')"></div>
                 </div>
                 <div class="ark_text">
                     <div class="title">'.get_sub_field('vacansii_review_name').'</div>
                     <div class="date">'.get_sub_field('vacansii_review_date').'</div>
                     <div class="description">'.get_sub_field('vacansii_review_text').'</div>
                 </div>
             </div>';
        }
    }
    endwhile;
endif;
wp_reset_postdata();

// выбираем все отзывы со страницы с отзывами о компании
if( get_field('reviews', 373) ) {
    while( has_sub_field('reviews', 373) ) {
        $all_reviews_massive[] = '<div class="ark_feed">
             <div class="ark_photo">
                 <div class="photo" style="background-image: url('.get_sub_field('review_image').')"></div>
             </div>
             <div class="ark_text">
                 <div class="title">'.get_sub_field('review_name').'</div>
                 <div class="date">'.get_sub_field('review_date').'</div>
                 <div class="description">'.get_sub_field('review_text').'</div>
             </div>
         </div>';
    }
} 

// общее количество отзывов
$all_reviews_count = count($all_reviews_massive);

// получаем нужное количество случайных записей
$all_reviews_counts_massive = array_flip(range(1, $all_reviews_count));
$reviews_massive_number = array_rand($all_reviews_counts_massive, $number_of_reviews_displayed);

// выводим случайные записи в соответствии с генератором
for( $i=0; $i<($all_reviews_count); $i++ )
{
    echo $all_reviews_massive[$reviews_massive_number[$i]];
}

Как прикрепить к письму файл с сервера в WordPress

Обращаю внимание на то, что решение написано именно для WordPress, т.к. оно использует библиотеку движка. Итак, код:

<?php
// подключаем wp-load
require_once("wp-load.php");

// куда уйдет письмо
$user_mail = 'mailbox@yandex.ru';

// типичный заголовок письма
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=utf-8\r\n"; 
$headers .= "From: SITENAME <notice@site.ru>"."\r\n";

// тема письма
$subject = 'Сообщение с сайта site.ru';

// содержимое письма
$message = '<html>
<head>
<title>Уведомление с site.ru</title>
</head>
<body>
<p>Текст уведомления.</p>
</body></html>';

// прямой путь к подключаемому файлу
$files = ("/home/site/site.ru/www/file.pdf");

/* непосредственно отправка письма */
wp_mail($user_mail, $subject, $message, $headers, $files);
?>

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

<?php require_once("../../../../wp-load.php"); ?>

Если требуется присоединить несколько файлов, то указываем, что передаем массив элементов, и передаем данные о файлах через запятую:

$files = array(("/home/site/site.ru/www/file_1.pdf"),("/home/site/site.ru/www/file_2.pdf"));