WordPress: часто используемые запросы и решения

Instructions

Вывод основных данных (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 постов.

Предыдущий пост Следующий пост