Up-sait.ru

Создание и продвижение сайтов

Up-sait.ru

Создание и продвижение сайтов

Кастомный тип записи wordpress и кастомная таксономия

Кастомный тип записи wordpress и кастомная таксономия

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

add_action('init', 'register_post_types');
function register_post_types(){

//кастомная таксономия
register_taxonomy('objectcat', array('object'), array(
    'label'                 => 'Рубрики объектов',
    'labels'                => array(
      'name'              => 'Рубрики объектов',
      'singular_name'     => 'Рубрики объектов',
      'search_items'      => 'Искать рубрики',
      'all_items'         => 'Все рубрики',
      'parent_item'       => 'Родит. рубрика',
      'parent_item_colon' => 'Родит. рубрика:',
      'edit_item'         => 'Редактировать рубрику',
      'update_item'       => 'Обновить рубрику',
      'add_new_item'      => 'Добавить рубрику',
      'new_item_name'     => 'Заголовок',
      'menu_name'         => 'Рубрики объектов',
    ),
    'description'           => 'Рубрики для объектов',
    'public'                => true,
    'show_in_nav_menus'     => true,
    'show_tagcloud'         => false,
    'hierarchical'          => true,
    'rewrite'               => array( 'hierarchical' => false ),//включает или отключает добавление таксономии в url
    'show_admin_column'     => true,//выводит таксономию в админке
    'show_ui'               => true,
    'query_var' => true,
  ) );
// Кастомный тип записи
register_post_type('object', array(
    'label'  => 'Объект',
    'labels' => array(
      'name'               => 'Объекты',
      'singular_name'      => 'Объект',
      'add_new'            => 'Добавить новый',
      'add_new_item'       => 'Введите заголовок',
      'edit_item'          => 'Редактирование объекта',
      'new_item'           => 'Новый объект',
      'view_item'          => 'Посмотреть объект',
      'search_items'       => 'Искать объект',
      'not_found'          => 'Объектов не найдено',
      'not_found_in_trash' => 'В корзине объектов не найдено',
      'parent_item_colon'  => '',
      'menu_name'          => 'Объекты',
    ),
    'description'         => 'Объекты',
    'public'              => true,
    'publicly_queryable'  => true,
    'exclude_from_search' => false,
    'show_ui'             => true,
    'show_in_menu'        => true,
    'show_in_admin_bar'   => true,
    'menu_position'       => 23,
    'menu_icon'           => 'dashicons-plus-alt', 
    'capability_type'   => 'post',
    'map_meta_cap'      => true,
    'hierarchical'        => false,
    'supports'            => array('title','thumbnail'),
    'taxonomies'          => array('objectcat', 'localcat'),
    'has_archive'         => true,
    'rewrite'             => array('slug' => 'objects', 'with_front' => false),
    'query_var'           => true,
  ) );
}
// Фильтрация записей по таксономиям
function danilin_add_taxonomy_filters() {
global $typenow;
// таксономии
$taxonomies = array('portfolio_category','portfolio_client');
// пользовательский тип данных
if( $typenow == 'portfolio' ){
foreach ($taxonomies as $tax_slug) {
$tax_obj = get_taxonomy($tax_slug);
$tax_name = $tax_obj->labels->name;
$terms = get_terms($tax_slug);
if(count($terms) > 0) {
echo "<select name='$tax_slug' id='$tax_slug' class='postform'>";
echo "<option value=''>$tax_name</option>";
foreach ($terms as $term) {
echo '<option value='. $term->slug, $_GET[$tax_slug] == $term->slug ? ' selected="selected"' : '','>' . $term->name .' (' . $term->count .')</option>';
}
echo "</select>";
}
}
}
}
add_action( 'restrict_manage_posts', 'danilin_add_taxonomy_filters' );

Для редактирования в шаблонах сайта нужно создать файлы single-кастомный_тип_записи.php
taxonomy-кастомная_таксономия.php

Убираем слаг ( slug) таксономии

function true_post_type_rewrite()
{
  global $wp_rewrite;
  // в данном случае мой тип записей был - Услуги (objectcat)
  // этот код позволит перезаписать урлы
  // параметры add_rewrite_tag('%название_тега%', '%маска_символов%', '%url_параметр%')
  $wp_rewrite->add_rewrite_tag("%objectcat%", '([^/]+)', "objectcat=");
  $wp_rewrite->add_permastruct('objectcat', '%objectcat%');
}
add_action('init', 'true_post_type_rewrite');

function true_rewrite_conflicts($request)
{
  if (!is_admin())
    $request['post_type'] = array('objectcat', 'post', 'page'); // перечисляем типы записей с подобной структурой пермалинков
  return $request;
}
add_filter('request', 'true_rewrite_conflicts');

После обновляем страницу (пересохраняем) Настройки постоянных ссылок.

Добавление название таксономии в урл кастомной записи

/ЯРЛЫК КАТЕГОРИИ ТОВАРА/ЯРЛЫК ТОВАРА/

//добавляем к урл записи таксономию
add_filter('post_link', 'true_post_type_permalink', 20, 3);
add_filter('post_type_link', 'true_post_type_permalink', 20, 3);

function true_post_type_permalink($permalink, $post_id, $leavename)
{

  $post_type_name = 'post_gotovoe_resenie'; // название типа записи, вы можете найти его в админке или в функции register_post_type()
  $post_type_slug = 'post_gotovoe_resenie'; // часть URL товаров, не всегда совпадает с названием типа записи!
  $tax_name = 'objectcat'; // ну это понятно, название таксономии - категории товаров

  $post = get_post($post_id); // получаем объект поста по его ID

  if (strpos($permalink, $post_type_slug) === FALSE || $post->post_type != $post_type_name) // не делаем никаких изменений, если тип записи не соответствует или если URL не содержит ярлык tovar
    return $permalink;

  $termini = wp_get_object_terms($post->ID, $tax_name); // получаем все категории, к которым принадлежит данный товар


  if (!is_wp_error($termini) && !empty($termini) && is_object($termini[0])) // и делаем перезапись ссылки, только, если товар находится хотя бы в одной категории, иначе возвращаем ссылку по умолчанию
    $permalink = str_replace($post_type_slug, $termini[0]->slug, $permalink);

  return $permalink;
}


add_filter('request', 'true_post_type_request', 1, 1);

function true_post_type_request($query)
{
  global $wpdb; // нам немного придётся поработать с БД

  $post_type_name = 'post_gotovoe_resenie'; // указываем тут название типа записей товара
  $tax_name = 'objectcat'; // а также название таксономии - категории товаров

  $yarlik = $query['attachment']; // после того, как мы изменили ссылки товаров в предыдущей функции, WordPress начал принимать их за страницы вложений

  // а теперь давайте получим ID товара, ярлык которого соответствует запросу на странице
  $post_id = $wpdb->get_var(
    "
		SELECT ID
		FROM $wpdb->posts
		WHERE post_name = '$yarlik'
		AND post_type = '$post_type_name'
		"
  );

  $termini = wp_get_object_terms($post_id, $tax_name); // товар должен находиться в категории (одной или нескольких)


  if (isset($yarlik) && $post_id && !is_wp_error($termini) && !empty($termini)): // изменяем запрос, если всё ок

    unset($query['attachment']);
    $query[$post_type_name] = $yarlik;
    $query['post_type'] = $post_type_name;
    $query['name'] = $yarlik;

  endif;

  return $query; // возвращаем результат
}
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вас также может заинтересовать:
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *