Как посмотреть в wordpress параметр tax term
Перейти к содержимому

Как посмотреть в wordpress параметр tax term

  • автор:

ЧПУ для трех таксономий и типа записи одновременно

Очередная заметка с кодом который бесполезен для 99% пользователей WordPress. Но для 1% это будет находкой, пожалуй. Речь о ЧПУ, решение сложной задачи. Объяснений что и как в этой заметке нет, потому что это как объяснять анекдот — либо ты понимаешь, либо нет. Тот кто ко мне обратился с этой задачей, прежде попробовал несколько популярных плагинов, которые справиться с задачей не смогли: Gd custom tools (платный), Custom Post Type Permalinks (бесплатный). Увидев, что нужно сделать, я не удивился — сложно.

Задача

  • realty — Тип записи: объявления.
  • country — Многоуровневая таксономия: страна > город (Испания > Валенсия).
  • type_deal — Одноуровневая таксономия. Содержит только 2 термина: sale и rent (продажа, аренда).
  • type_realty — Многоуровневая таксономия: тип недвижимости (дома).

Создать произвольную структуру ссылок (ЧПУ) для такс и записи.

Для таксономий сделать ссылки вида:

  • dom/ estate / %country% /
  • dom/ estate / %country% / %type_deal% /
  • dom/ estate / %country% / %type_deal% / %type_realty% /

Для записи (объявлений):

  • dom/ estate / %country% / %type_deal% / %type_realty% / id-%post_id% /

Суть, сделать ЧПУ таксономий и записи полностью похожими. Чтобы можно было вручную убирать из URL последние элементы и попадать на уровень выше.

Примеры того что должно получиться в URL

Для всех трех таксономий:

  • dom/estate/spain/ — Недвижимость в Испании
  • dom/estate/spain/sale/ — Купить недвижимость в Испании
  • dom/estate/spain/sale/houses/ — Купить дом в Испании
  • dom/estate/spain/valensiya/sale/houses/ — Купить дом в Испании > Валенсия
  • dom/estate/spain/valensiya/sale-rent/ — Продажа и аренда всей недвижимости в Валенсии. Может выглядеть как dom/estate/spain/valensiya/
  • dom/estate/spain/valensiya/sale-rent/kommercheskaya/magazin/ — Продажа и аренда магазинов в Валенсии

Для каждой ссылки таксономии должна работать пагинация . /page/2/ , . /page/3/

Для записи:

Все также как и у термина, только в конце еще ID записи:

  • dom/estate/spain/valensiya/sale/houses/id-123/ . 123 — ID записи

Решение

Создаем файл в теме lib/register-ads-post-tax.php и подключаем его в functions.php темы:

require_once TEMPLATEPATH .'/lib/register-ads-post-tax.php';
 'Объявления о продаже недвижимости за рубежом.', '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' => 'Parent Объявление:', 'all_items' => 'Все объявления', 'menu_name' => 'Объявления' ), 'taxonomies' => array( 'country', 'type_realty', 'type_deal' ), 'public' => true, 'query_var' => true, 'rewrite' => false, //'rewrite' => true, //'rewrite' => array( 'slug'=>'estate/%country%/%post_id%', 'with_front'=>false, 'feeds'=>false, 'pages'=>false, 'feed'=>false, 'paged'=>false ), 'show_in_menu' => true, 'has_archive' => false, 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'custom-fields', 'revisions' ), 'show_ui' => true, 'show_in_nav_menus' => false, )); ## Изменяет ссылку на термины таксономий - 'type_deal' и 'type_realty', которая получается функцией get_term_link() ## К какой стране относится берется из URL текущей страницы add_filter('term_link', 'deal_realty_tax_link_fix', 10, 3); function deal_realty_tax_link_fix( $link, $term, $taxonomy )< if( ! in_array( $taxonomy, array('type_deal','type_realty') ) ) return $link; $uri = $_SERVER['REQUEST_URI']; if( $taxonomy == 'type_deal' )< $link = preg_replace('~^(.*?/)(?:'. implode('|', __type_deal_elements()) .')/.*~', '\1', $uri ) . $term->slug; > if( $taxonomy == 'type_realty' ) < $link = preg_replace('~^(.*?/(?:'. implode('|', __type_deal_elements()) .')/).*~', '\1', $uri ) . __build_tax_uri( $term ); >return esc_url( user_trailingslashit( home_url($link) ) ); > // фокусы со структурой ссылок if(1) < //add_action('wp', 'xxxxxxx'); // debug function xxxxxxx($wp)< print_r( get_queried_object() ); print_r( $wp ); print_r( $GLOBALS['wp_rewrite'] ); exit; >// регистрируем структуру через add_permastruct, чтобы работала структура ЧПУ для типа записи add_permastruct('realty', 'estate/%country%/%type_deal%/%type_realty%/id-%post_id%', array( 'with_front' => 0, 'paged' => 0, 'feed' => 0, 'walk_dirs' => 0, )); /* add_filter( 'query_vars', function( $vars ) < $vars[] = 'type_deal'; $vars[] = 'type_realty'; return $vars; >); */ // поправим параметры запроса - удалим 'country' и добавим 'post_type=realty', потому что '?p=208' не работает, а '?p=208&post_type=realty' работает //$this->query_vars = apply_filters( 'request', $this->query_vars ); add_action('request', 'remove_unwanted_query_vars' ); function remove_unwanted_query_vars( $vars ) < if( !empty($vars['country']) )< $_country = explode('/', $vars['country']); $vars['country'] = end( $_country ); // последний элемент >if( !empty($vars['type_realty']) ) < $_type_realty = explode('/', $vars['type_realty']); $vars['type_realty'] = end( $_type_realty ); // последний элемент >// запрос типа записи 'realty' - параметры: country, type_realty, type_deal if( isset($vars['p'], $vars['type_realty']) && $vars['post_type'] === 'realty' ) < $deal = __type_deal_elements(); if( $vars['type_deal'] == end($deal)/*'sale-rent'*/ ) unset( $vars['type_deal'] ); >return $vars; > // добавим правила перезаписи //add_rewrite_rule('^estate/.+?/(?:sale|rent|sale-rent)/.+?/([0-9]+)/?', 'index.php?p=$matches[1]&post_type=realty', 'top' ); // удалим все созданные правила перезаписи и создам новые. // $rules = apply_filters( $permastructname . '_rewrite_rules', $rules ); // do_action_ref_array( 'generate_rewrite_rules', array( &$this ) ); add_filter('realty'.'_rewrite_rules', 'delete_realty_rewrite_rules' ); function delete_realty_rewrite_rules( $rules ) < /* array( [estate/.+?/%type_deal%/%type_realty%/[0-9]+/attachment/([^/]+)/?$] =>index.php?attachment=$matches[1] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/attachment/([^/]+)/trackback/?$] => index.php?attachment=$matches[1]&tb=1 [estate/.+?/%type_deal%/%type_realty%/[0-9]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/attachment/([^/]+)/comment-page-([0-9])/?$] => index.php?attachment=$matches[1]&cpage=$matches[2] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/attachment/([^/]+)/embed/?$] => index.php?attachment=$matches[1]&embed=true [estate/(.+?)/%type_deal%/%type_realty%/([0-9]+)/embed/?$] => index.php?country=$matches[1]&%type_deal%$matches[2]&%type_realty%$matches[3]&p=$matches[4]&embed=true [estate/(.+?)/%type_deal%/%type_realty%/([0-9]+)/trackback/?$] => index.php?country=$matches[1]&%type_deal%$matches[2]&%type_realty%$matches[3]&p=$matches[4]&tb=1 [estate/(.+?)/%type_deal%/%type_realty%/([0-9]+)(?:/([0-9]+))?/?$] => index.php?country=$matches[1]&%type_deal%$matches[2]&%type_realty%$matches[3]&p=$matches[4]&page=$matches[5] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/([^/]+)/?$] => index.php?attachment=$matches[1] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/([^/]+)/trackback/?$] => index.php?attachment=$matches[1]&tb=1 [estate/.+?/%type_deal%/%type_realty%/[0-9]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/([^/]+)/comment-page-([0-9])/?$] => index.php?attachment=$matches[1]&cpage=$matches[2] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/([^/]+)/embed/?$] => index.php?attachment=$matches[1]&embed=true ) */ // должен быть до правил стран $rules = array( 'estate/(.+?)/('. implode('|', __type_deal_elements() ) /*sale|rent|sale-rent*/ .')/(.+?)/id-([0-9]+)/?$' => 'index.php?post_type=realty&p=$matches[4]&country=$matches[1]&type_deal=$matches[2]&type_realty=$matches[3]', ); return $rules; > ## добавим правила перезаписи для 'country', 'type_deal', 'type_realty' add_filter('country'.'_rewrite_rules', 'add_more_country_rewrite_rules' ); function add_more_country_rewrite_rules( $rules )< /*Array( [estate/(.+?)/page/?([0-9])/?$] => index.php?country=$matches[1]&paged=$matches[2] [estate/(.+?)/?$] => index.php?country=$matches[1] )*/ // должен быть после правил типа запии 'realty' $_first_part = 'estate/(.+?)/('. implode('|', __type_deal_elements() ) /*sale|rent|sale-rent*/ .')'; $_pade_part = 'page/?([0-9])'; $more_riles = array( "$_first_part/(.+?)/$_pade_part/?$" => 'index.php?country=$matches[1]&type_deal=$matches[2]&type_realty=$matches[3]&paged=$matches[4]', "$_first_part/$_pade_part/?$" => 'index.php?country=$matches[1]&type_deal=$matches[2]&paged=$matches[3]', "$_first_part/(.+?)/?$" => 'index.php?country=$matches[1]&type_deal=$matches[2]&type_realty=$matches[3]', "$_first_part/?$" => 'index.php?country=$matches[1]&type_deal=$matches[2]', ); $rules = array_merge( $more_riles, $rules ); //die( print_r($rules) ); return $rules; > // array( sale, rent, sale-rent ) function __type_deal_elements()< $deal_terms = get_terms(array( 'taxonomy'=>'type_deal','hide_empty'=>0, 'fields'=>'id=>slug' )); $deal_terms[] = implode('-', $deal_terms); // sale-rent return $deal_terms; > /* add_action('generate_rewrite_rules', 'delete_ads_rewrite_rules' ); function delete_ads_rewrite_rules( $that ) < [estate/.+?/%type_deal%/%type_realty%/[0-9]+/attachment/([^/]+)/?$] =>index.php?attachment=$matches[1] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/attachment/([^/]+)/trackback/?$] => index.php?attachment=$matches[1]&tb=1 [estate/.+?/%type_deal%/%type_realty%/[0-9]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/attachment/([^/]+)/comment-page-([0-9])/?$] => index.php?attachment=$matches[1]&cpage=$matches[2] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/attachment/([^/]+)/embed/?$] => index.php?attachment=$matches[1]&embed=true [estate/(.+?)/%type_deal%/%type_realty%/([0-9]+)/embed/?$] => index.php?country=$matches[1]&%type_deal%$matches[2]&%type_realty%$matches[3]&p=$matches[4]&embed=true [estate/(.+?)/%type_deal%/%type_realty%/([0-9]+)/trackback/?$] => index.php?country=$matches[1]&%type_deal%$matches[2]&%type_realty%$matches[3]&p=$matches[4]&tb=1 [estate/(.+?)/%type_deal%/%type_realty%/([0-9]+)(?:/([0-9]+))?/?$] => index.php?country=$matches[1]&%type_deal%$matches[2]&%type_realty%$matches[3]&p=$matches[4]&page=$matches[5] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/([^/]+)/?$] => index.php?attachment=$matches[1] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/([^/]+)/trackback/?$] => index.php?attachment=$matches[1]&tb=1 [estate/.+?/%type_deal%/%type_realty%/[0-9]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/([^/]+)/comment-page-([0-9])/?$] => index.php?attachment=$matches[1]&cpage=$matches[2] [estate/.+?/%type_deal%/%type_realty%/[0-9]+/([^/]+)/embed/?$] => index.php?attachment=$matches[1]&embed=true foreach( $that->extra_rules_top as $rule => $_ ) if( preg_match('~^estate/.+type_deal~', $rule) ) unset($that->extra_rules_top[$rule]); foreach( $that->rules as $rule => $_ ) if( preg_match('~^estate/.+type_deal~', $rule) ) unset($that->rules[$rule]); > */ // добавим post_type в параметры запроса, потому что просто '?p=208' почему-то не работает, а работает '?p=208&post_type=realty' //do_action_ref_array( 'parse_request', array( &$this ) ); /* add_action('parse_request', function($wp)< if( strpos($wp->matched_query, 'foo_') ) $wp->query_vars['post_type'] = 'realty'; > ); // дополнительный тег перезаписи, чтобы не учитывать add_rewrite_tag('%fake_country%', '(.+?)', '&adsfoovar_='); // adsfoovar_ - несуществующий параметр запроса, он будет удален. он не нужен. // заменим %realty% (%post_name%) на ID //global $wp_rewrite; //$wp_rewrite->extra_permastructs['realty'] = str_replace('%realty%', '%post_id%.html', $wp_rewrite->extra_permastructs['realty']); // Удалим слэш на конце, если нужно. Если слэш есть в структуре ЧПУ, то он будет добавляться и к постоянным страницам. //add_filter('user_trailingslashit', 'no_ads_trailslash', 170, 2); function no_ads_trailslash( $string, $type )< global $wp_rewrite; if( $type == 'realty' && $wp_rewrite->use_trailing_slashes && $wp_rewrite->using_permalinks() ) return untrailingslashit($string); return $string; > */ ## Отфильтруем ЧПУ произвольного типа add_filter('post_type_link', 'realty_permalink', 1, 2); function realty_permalink( $permalink, $post )< if( false === strpos($permalink, '%country%') ) return $permalink; //global $wp_rewrite; //$perm = $wp_rewrite->get_extra_permastruct('realty'); // Получаем элементы таксы 'country' $country_path = __build_tax_uri( get_the_terms( $post, 'country') ); // много уровней - asd/asd // type_realty_path $type_realty_path = __build_tax_uri( get_the_terms( $post, 'type_realty') ); // много уровней - asd/asd $type_deal_path = __build_tax_uri( get_the_terms( $post, 'type_deal') ); // один уровень - asd return strtr( $permalink, array( '%type_deal%' => $type_deal_path, '%type_realty%' => $type_realty_path, '%country%' => $country_path, '%post_id%' => $post->ID, ) ); > ## Получает цепочку из ярлыков указанного термина - вврехи пока у термина не будет родителей - 'parent/child/child' function __build_tax_uri( $terms )< if( is_wp_error($terms) || empty($terms) || ! ( is_object(reset($terms)) || is_object($terms) ) ) return 'no_terms'; // элемента таксы нет, а должен быть. $term = is_object(reset($terms)) ? reset($terms) : $terms; $path = array( $term->slug ); while( $term->parent )< $term = get_term( $term->parent ); $path[] = $term->slug; > return implode('/', array_reverse($path) ); > ## 404 страница если в URL указаны неправильные названия таксономий. ## По факту, WP затем 301 редиректит на правильный URL. add_filter('pre_handle_404', 'realty_404_test' ); function realty_404_test( $false ) < if( ! get_queried_object() ) return $false; // ничего не делает. $_404 = false; // запись объявления if( is_singular('realty') )< $post = get_queried_object(); // type_deal if( ! $_404 && ( $term_name = get_query_var('type_deal') ) && ! has_term( explode('-', $term_name), 'type_deal', $post ) ) $_404 = 1; // type_realty if( ! $_404 && ( $term_name = get_query_var('type_realty') ) && ! has_term( $term_name, 'type_realty', $post ) ) $_404 = 1; // country if( ! $_404 && ( $term_name = get_query_var('country') ) && ! has_term( $term_name, 'country', $post ) ) $_404 = 1; >// для такс if( is_tax(['type_deal','type_realty','country']) ) < // type_deal if( ! $_404 && ( $term_name = get_query_var('type_deal') ) && ! get_term_by('slug', $term_name, 'type_deal') ) $_404 = 1; // type_realty if( ! $_404 && ( $term_name = get_query_var('type_realty') ) && ! get_term_by('slug', $term_name, 'type_realty') ) $_404 = 1; // country if( ! $_404 && ( $term_name = get_query_var('country') ) && ! get_term_by('slug', $term_name, 'country') ) $_404 = 1; >if( $_404 )< global $wp_query; $wp_query->set_404(); status_header( 404 ); nocache_headers(); return 1; // обрываем следующие проверки > return $false; // ничего не делает. > > ## Такса - страна город регион register_taxonomy('country', array('realty'), array( 'labels' => array( 'name' => 'Страны', 'singular_name' => 'Страна', 'search_items' => 'Search Страны', 'popular_items' => 'Popular Страны', 'all_items' => 'All Страны', 'parent_item' => 'Parent Страна', 'parent_item_colon' => 'Parent Страна:', 'edit_item' => 'Edit Страна', 'view_item' => 'View Страна', 'update_item' => 'Update Страна', 'add_new_item' => 'Add New Страна', 'new_item_name' => 'New Страна Name', 'separate_items_with_commas' => 'Separate Страны with commas', 'add_or_remove_items' => 'Add or remove Страны', 'choose_from_most_used' => 'Choose from the most used Страны', 'not_found' => 'No Страны found.', 'menu_name' => 'Страны' ), 'hierarchical' => true, 'rewrite' => array('slug'=>'estate', 'hierarchical'=>true, 'with_front'=>0, 'feed'=>0 ), 'query_var' => true, 'public' => true, 'show_ui' => true, 'show_tagcloud' => true, 'show_admin_column' => false, 'show_in_nav_menus' => true, )); ## Такса - тип недвижимости register_taxonomy( 'type_realty', array('realty'), array( 'labels' => array( 'name' => 'Тип недвижимости', 'singular_name' => 'Тип недвижимости', 'search_items' => 'Search Тип недвижимости', 'popular_items' => 'Popular Тип недвижимости', 'all_items' => 'All Тип недвижимости', 'parent_item' => 'Parent Тип недвижимости', 'parent_item_colon' => 'Parent Тип недвижимости:', 'edit_item' => 'Edit Тип недвижимости', 'view_item' => 'View Тип недвижимости', 'update_item' => 'Update Тип недвижимости', 'add_new_item' => 'Add New Тип недвижимости', 'new_item_name' => 'New Тип недвижимости Name', 'separate_items_with_commas' => 'Separate Тип недвижимости with commas', 'add_or_remove_items' => 'Add or remove Тип недвижимости', 'choose_from_most_used' => 'Choose from the most used Тип недвижимости', 'not_found' => 'No Тип недвижимости found.', 'menu_name' => 'Тип недвижимости' ), 'public' => false, 'rewrite' => false, 'hierarchical' => true, 'query_var' => true, // query_var, чтобы запрос на термин работал. 'publicly_queryable' => true, // query_var, чтобы запрос на термин работал. 'show_ui' => true, 'show_in_quick_edit' => true, 'show_tagcloud' => false, 'show_admin_column' => false, 'show_in_nav_menus' => false, )); ## Такса - тип сделки - два типа - 'sale' и 'rent' register_taxonomy('type_deal', array('realty'), array( 'labels' => array( 'name' => 'Тип сделки', 'singular_name' => 'Тип сделки', 'search_items' => 'Search Тип сделки', 'popular_items' => 'Popular Тип сделки', 'all_items' => 'All Тип сделки', 'parent_item' => 'Parent Тип сделки', 'parent_item_colon' => 'Parent Тип сделки:', 'edit_item' => 'Edit Тип сделки', 'view_item' => 'View Тип сделки', 'update_item' => 'Update Тип сделки', 'add_new_item' => 'Add New Тип сделки', 'new_item_name' => 'New Тип сделки Name', 'separate_items_with_commas' => 'Separate Тип сделки with commas', 'add_or_remove_items' => 'Add or remove Тип сделки', 'choose_from_most_used' => 'Choose from the most used Тип сделки', 'not_found' => 'No Тип сделки found.', 'menu_name' => 'Тип сделки' ), 'public' => false, 'hierarchical' => true, // для удобности выбора 'query_var' => true, // query_var, чтобы запрос на термин работал. 'publicly_queryable' => true, // query_var, чтобы запрос на термин работал. 'rewrite' => false, 'show_ui' => true, 'show_in_quick_edit' => true, 'show_tagcloud' => false, 'show_in_nav_menus' => false, 'show_admin_column' => false, )); > ## отменим показ выбранного термина наверху в checkbox списке терминов add_filter( 'wp_terms_checklist_args', 'set_checked_ontop_default', 10 ); function set_checked_ontop_default( $args ) < // изменим параметр по умолчанию на false if( ! isset($args['checked_ontop']) ) $args['checked_ontop'] = false; return $args; >## Меняем страницу отдельной страны add_filter('template_include', 'top_country_tpl_file'); function top_country_tpl_file( $template ) < // термин страницы верхнего уровня if( is_tax('country') )< if( ! get_query_var('type_realty') && ! get_query_var('type_deal') && ($term = get_queried_object()) && ! $term->parent ) < $tpl_file = get_stylesheet_directory() . '/taxonomy-country-toplevel.php'; if( file_exists($tpl_file) ) $template = $tpl_file; >> return $template; > // дополнительные хуки для станицы создания объявления // изменение блока метабокса if( is_admin() )< // стили в админке связанные с типом поста quest add_action('admin_print_footer_scripts', 'country_hook_admin_footer_scripts', 99); function country_hook_admin_footer_scripts()< $sc = get_current_screen(); if( $sc->base != 'post' || ! in_array($sc->post_type, ['realty']) ) return; ?> .postbox div.tabs-panel < max-height:700px; border:0; >.category-tabs < display:none; >#countrydiv .inside < margin:0; padding:0; >#countrydiv #country-adder < padding: 0 1em; >#country-all ul.children  >

Объяснять код не буду, долго, сложно, смысла особо нет, потому лень, извините.

get_terms()

Функция, позволяющая получить (и вывести на сайте) элементы таксономий (рубрик, меток или кастомных таксономий) и информацию о них.

Если же надо получить текущий элемент таксономии, то воспользуйтесь функциями get_query_var() (co значением параметра равным term — так вы получите ярлык текущего элемента таксономии) и get_term_by() (со значением первого параметра равным slug ).

Возвращает При условии
Массив объектов элементов таксономий WP_Term. По умолчанию.
Массив из ID элементов таксономий. Параметр fields установлен в значение ids .
Массив из названий терминов. Параметр fields установлен в значение names .
Ассоциативный массив состоящих из ID элементов и ID их родителей. Параметр fields равен id=>parent .
Число элементов таксономий удовлетворяющих условиям. Параметр fields равен count .
Array() Пустой массив. Если терминов не найдено.
Объект класса WP_Error. Хотя бы одной из таксономий, переданных в параметре taxonomy не существует.
get_terms( $args = array(), $deprecated = '' )

Параметры

Раньше в первый параметр функции мы передавали название таксономии, а во второй – все параметры функции. Теперь же название таксономии передаётся также в массив $args параметром taxonomy .

$args
(строка|массив) параметры по типу, как в WP_Query, их тоже можно записать и в виде массива и в виде строки.

taxonomy
(строка|массив) название таксономии или массив таксономий, например array( ‘category’, ‘post_tag’ ) .

number
(целое число) количество элементов, которые нужно вывести, по умолчанию выводятся все.

offset
(целое число) сколько элементов нужно пропустить, то есть если offset=2 , то начинаем с третьего.

include
(целое число|строка|массив) укажите ID элементов, которые нужно вывести, можно указать число, числа через запятую в виде строки или одномерный массив чисел, например так:

$categories = get_terms( array( 'taxonomy' => 'category', 'include' => 1 ) );
$categories = get_terms( array( 'taxonomy' => 'category', 'include' => array( 1, 4 ) ) );
$args = array( 'taxonomy' => 'category', 'include' => array( 1, 4 ) ); $categories = get_terms( $args );

Если вы хотите исключить какие-то элементы, не пытайтесь использовать минус перед числом, просто смотрите следующий параметр.

exclude
(целое число|строка|массив) укажите ID элементов, которые нужно исключить.

exclude_tree
(целое число|строка|массив) если вы исключате родительские элементы и хотите сразу же исключить все дочерние, то этот параметр для вас.

orderby
(строка) сортировать по:

  • id — по ID элементов (по умолчанию),
  • parent — по ID родительских элементов,
  • count — по количеству постов,
  • name — по имени,
  • slug — по ярлыку,
  • term_group — по значениям колонки term_group в таблице wp_terms базы данных,
  • include — в том же порядке, в котором указаны элементы в параметре include,
  • meta_value и meta_value_num – по значению произвольного поля,
  • none — без сортировки;

order
(строка) порядок сортировки.

  • ASC — по возрастанию (по умолчанию),
  • DESC — по убыванию;

hide_empty
(логическое) нужно ли добавлять в результат также и пустые (без постов) рубрики/метки/элементы таксономий:

  • true — не нужно (по умолчанию),
  • false — нужно;

fields
(строка) в каком виде выводить результат:

  • all — массив объектов элементов таксономий (по умолчанию), после print_r() он будет выглядеть так:
$categories = get_terms( array( 'taxonomy' => 'category' ) ); print_r( $categories ); /* Результат: Array ( [0] => stdClass Object ( [term_id] => 1 [name] => Заметки [slug] => notes [term_group] => 0 [menu_order] => 0 [term_taxonomy_id] => 1 [taxonomy] => category [description] => [parent] => 0 [count] => 7 ) [1] => stdClass Object ( [term_id] => 4 [name] => Новости [slug] => news [term_group] => 0 [menu_order] => 0 [term_taxonomy_id] => 4 [taxonomy] => category [description] => [parent] => 0 [count] => 2 ) [2] => stdClass Object ( [term_id] => 11 [name] => Обновления [slug] => updates [term_group] => 0 [menu_order] => 0 [term_taxonomy_id] => 11 [taxonomy] => category [description] => [parent] => 4 [count] => 1 ) ) */
  • ids — массив составленный из ID элементов, вот как он будет выглядеть, если пропустить его через функцию print_r()
$categories = get_terms( array( 'taxonomy' => 'category', 'fields' => 'ids' ) ); print_r( $categories ); /* Результат: Array ( [0] => 1 [1] => 4 [2] => 11 ) */
  • names — возвращает массив наименований, например:
$categories = get_terms( array( 'taxonomy' => 'category', 'fields' => 'names' ) ); print_r( $categories ); /* Результат: Array ( [0] => Новости [1] => Заметки ) */
  • count — (с версии 3.2) возвращает количество всех элементов таксономии, вне зависимости от других параметров. Для этих целей вы также можете использовать wp_count_terms().
$categories = get_terms( array( 'taxonomy' => 'category', 'fields' => 'count' ) ); echo $categories; /* Результат: 4 */
  • id=>parent — ассоциативный массив состоящих из ID элементов и ID их родителей, если родительского элемента не существует, то возвращается 0, пример:
$categories = get_terms( array( 'taxonomy' => 'category', 'fields' => 'id=>parent' ) ); print_r( $categories ); /* Результат: Array ( [1] => 0 [4] => 0 [11] => 4 ) */

slug
(строка) возвращает элементы, ярлыки которых совпадают с заданным значением.

hierarchical
(логическое) нужно ли включить в результат родительские элементы, даже если в них нет постов?

  • 1 — нужно (по умолчанию),
  • 0 — не нужно;

name__like
(строка) возвращает только те элементы, названия которых начинаются с заданного значения (без чувствительности в регистру), например:

// выведем через пробел все метки, начинающиеся с буквы "н" $tags = get_terms( array( 'taxonomy' => 'post_tag', 'name__like' => 'н' ) ); foreach( $tags as $tag ){ echo $tag->name . ' '; }

search
(строка) возвращает только те элементы, названия которых содержат заданное значение (без чувствительности в регистру).

pad_counts
(логическое) влияет только на числовые значения количества постов в родительских элементах.

  • 1 — количество постов родительского элемента суммируется с количеством постов дочерних элементов,
  • 0 — не суммируется (по умолчанию);

get
(строка)

  • all — вывести все элементы, вне зависимости от параметров offset , hide_empty , child_of (по умолчанию — пустая строка)

child_of
(целое число) вывести все элементы таксономии, которые являются дочерними для элемента с указанным ID вне зависимости от уровня вложенности.

parent
(целое число) вывести элементы таксономии, которые являются дочерними для элемента с указанным ID и находятся на первом уровне вложенности. Если указать 0, то будут выведены только элементы верхнего уровня.

meta_key
(строка) Укажите это значение ключа мета поля, если хотите получить только элементы таксономи, содержащие его.

meta_value
(строка) Значение мета поля элементов таксономии для указанного ключа meta_key .

meta_query
(массив) Работает так же, как и meta_query в WP_Query при выводе постов. О нём даже есть отдельный урок.

childless
(логическое) Принимает значения true / false . При установке в значени true , функция пропустит все термины, у которых есть дочерние элементы.

cache_domain
(строка) (с версии 3.2) если вы планируете использовать get_terms() с указанными параметрами несколько раз, укажите в качестве значения cache_domain уникальную фразу, чтобы задействовать кэш (по умолчанию — «core»).

WP_Term

Если параметр fields не изменен, то функция возвращает массив объектов WP_Term , каждый из которых содержит следующую информацию об элементе таксономии.

  • term_id – ID рубрики/метки/элемента таксономии
  • name – название
  • slug – ярлык
  • term_group – значение term_group из базы данных (особого применения пока что нет, в основном — в плагинах)
  • term_taxonomy_id – ID таксономии
  • taxonomy – название таксономии
  • description – описание элемента (можно заполнить в админке при создании и редактировании)
  • parent – ID родительского элемента
  • count – количество записей
  • order – номер по порядку при ручной сортировке

Или чекайте первый пример ниже.

Примеры

1. Выводим результат функции через print_r()

Прежде, чем мы перейдём к более практическим примерам, давайте посмотрим, что возвращает get_terms() при помощи PHP-функции print_r() .

print_r( get_terms( array( 'taxonomy' => 'category' ) ) ); /* Array ( [2] => WP_Term Object ( [term_id] => 42 [name] => Лайфстайл [slug] => lajfstajl [term_group] => 0 [term_taxonomy_id] => 42 [taxonomy] => category [description] => [parent] => 0 [count] => 1 [filter] => raw [order] => 0 ) [4] => WP_Term Object ( [term_id] => 1 [name] => Трэвел [slug] => travel [term_group] => 0 [term_taxonomy_id] => 1 [taxonomy] => category [description] => [parent] => 0 [count] => 4 [filter] => raw [order] => 4 ) ) */

2. Выводим отсортированные по имени рубрики в виде выпадающего списка

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

// вытаскиваем все рубрики в массив $categories, описание параметров функции смотрите чуть ниже $categories = get_terms( array( 'taxonomy' => 'category', 'orderby' => 'name', 'hide_empty' => 0 ) ); // если рубрики, соответствующие заданным параметрам, существуют if( $categories ){ // тогда создаем выпадающий список из них echo ''; }

Вот что у меня получилось в результате выполнения этого кода на тестовом сайте:

список рубрик при помощи get_terms

Слева — сам список (открытый), а справа его HTML-код.

3. Выводим список из 5-и рубрик, отсортированных по количеству записей

В этом примере параметры функции задаются в виде массива:

Шорткод отображения записей

Опция Показывать шорткод записей даёт возможность добавлять список записей вашего блога на разные страницы. Используя параметр Аргументы, вы можете задать показ записей с отбором по рубрикам или тегам.

Шорткоды — это короткие отрывки кода, созданные для WordPress, чтобы у вас была возможность добавлять различные функции к вашему сайту или блогу. Подробнее о шорткодах рассказано здесь.

В этом руководстве

  1. Обзор шорткода показа записей
  2. Добавление шорткода
  3. Отображение аргументов
  4. Примеры настройки
  5. Выравнивание изображений
  6. (Расширенные) запросы таксономии с несколькими критериями
  7. Лимиты
  8. Как найти идентификатор записи

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

Кроме того, можно использовать блоки Записи в блоге или Последние записи.

Обзор шорткода показа записей

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

  • Например, вы хотите показывать краткий список записей на главной странице, а опция «Избранные записи» не включена в вашу тему или не показывает записи так, как вам хотелось бы.
  • Вы хотите создать на вашем сайте страницу авторов с краткими биографиями и списками последних опубликованных работ.
  • Вы хотите выделить на странице конкретные записи, например, объявления.
  • Вы хотите добавить список записей в виджет на боковой панели или в нижнем колонтитуле.
  • И так далее…
Добавление шорткода

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

  1. Отредактируйте страницу, запись или текстовый виджет.
  2. Добавьте шорткод [display-posts] к записи или странице.
  3. Опубликуйте или обновите страницу/запись.

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

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

Пример шорткода показа записей

Шорткод показа записей по умолчанию отображает маркированный список из 10 последних по времени записей. Можно настроить количество записей и стиль, а также выбрать элементы записей, которые будут отображаться в списке (заголовок, избранные изображения, цитаты и т. д.).

Отображение аргументов

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

author
Указывает автора записи
Значение по умолчанию: пусто
Пример: [display-posts author=»bill»]

category
Указывает слаг рубрики (или список слагов рубрики, разделённых запятыми). Посмотрите, как выглядит этот шорткод, в этом примере сайта.
Значение по умолчанию: пусто
Пример: [display-posts category=»fishing,hiking»]

date_format
Указывает используемый формат даты, если параметр include_date = true. Подробнее об этом сказано в разделе Кодекса Форматы даты и времени.
Значение по умолчанию: ‘(n/j/Y)’
Example: [display-posts include_date=»true» date_format=»F j, Y»]

id
Указывает идентификатор конкретной записи или идентификаторы нескольких записей, которые следует отображать.
Значение по умолчанию: пусто
Пример: [display-posts ]

image_size
Указывает размер для показа избранного изображения, если оно есть в записи. Для параметра image_size можно выбрать значения thumbnail, medium, large (в разделе «Настройки > Медиафайлы»).
Значение по умолчанию: пусто
Пример: [display-posts image_size=»thumbnail»]

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

include_content
Указывает, что после заголовка следует включать всё содержимое записи.
Значение по умолчанию: пусто
Пример: [display-posts include_content=»true»]

include_date
Указывает, что после заголовка следует включать дату записи. По умолчанию используется формат (7/30/12), но его можно изменить с помощью параметра date_format.
Значение по умолчанию: пусто
Пример: [display-posts include_date=»true»]

include_excerpt
Указывает, что после заголовка следует включать цитату из записи (и дату, если она есть).
Значение по умолчанию: пусто
Пример: [display-posts include_excerpt=»true»]

offset
Указывает количество пропускаемых записей
Значение по умолчанию: 0
Пример: [display-posts offset=»3″]

order
Указывает порядок размещения записей: от старых к новым (DESC) или от новых к старым (ASC).
Значение по умолчанию: DESC
Пример: [display-posts order=»ASC»]

orderby
Указывает, как следует сортировать записи. Доступные параметры перечислены здесь.
Значение по умолчанию: date
Пример: [display-posts orderby=»title»]

portfolio_type
Если используется тип записи «Портфолио», выберите здесь конкретные элементы для данного типа портфолио.

post_parent
Задаёт показ страниц, для которых заданная страница является родительской. Вы можете указать идентификатор или «текущая», чтобы использовать в качестве родительской текущую страницу.
Значение по умолчанию: пусто
Пример: [display-posts post_type=»page» post_parent=»8″]

post_status
Задаёт показ записей с определённым статусом записи
Значение по умолчанию: publish
Пример: [display-posts post_status=»publish, future»]

post_type
Задаёт используемый тип записи. Можно использовать значение по умолчанию (post или page). Для типа Портфолио используйте значение jetpack-portfolio. Аналогичным образом, для типа Отзывы используйте значение jetpack-testimonial.
Значение по умолчанию: post
Пример: [display-posts post_type=»page»]

posts_per_page
Задаёт количество отображаемых записей.
Значение по умолчанию: 10
Пример: [display-posts posts_per_page=»5″]

tag
Указывается слаг тега (или список слагов тега, разделённых запятыми)
Значение по умолчанию: пусто
Пример: [display-posts tag=»tag1, tag2″]

taxonomy, tax_term, tax_operator
Используйте эти параметры для расширенных запросов таксономии. Параметр «taxonomy» используется для запросов таксономии, «tax_term» — для слага термина (или терминов), которые вы хотите включить, «operator» — для выбора иного порядка терминов в запросе (скорее всего это поле не потребуется).
Значение по умолчанию: ‘taxonomy’ = empty , ‘tax_term’ = empty , ‘tax_operator’ = ‘IN’
Пример: [display-posts taxonomy=»color» tax_term=»blue, green»]

wrapper
Здесь выбирается тип HTML для отображения списков. Можно задать неупорядоченный список (ul), упорядоченный список (ol) или разделители (div) и затем выбрать для них стиль.
Значение по умолчанию: ul
Пример: [display-posts wrapper=»ol»]

Примеры настройки

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

[display-posts tag=»advanced» posts_per_page=»20″]

Будут перечислены 20 последних записей с тегом advanced.

[display-posts tag=»advanced» image_size=»thumbnail»]

Будут перечислены 10 последних записей с тегом Advanced и будет отображена запись с использованием размера Thumbnail.

[display-posts category=»must-read» posts_per_page=»-1″ include_date=»true» order=»ASC» orderby=»title»]

Будут перечислены все записи в категории Must Read (Обязательно прочесть), в алфавитном порядке, с датой, добавленной в конце.

[display-posts wrapper=»ol»]

Будут отображены записи в виде упорядоченного списка. Опции: ul — для неупорядоченных списков (значение по умолчанию), ol — для упорядоченных списков или div — для делителей.

[display-posts ]

Будут отображены только записи с идентификаторами (ID) 14 и 3.

Выравнивание изображений

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

[display-posts include_excerpt=»true» image_size=»thumbnail» wrapper=»div»]

Данный код включает цитату, добавляет изображение размером thumbnail (для настройки размеров изображения выберите Настройки > Медиафайлы) и указывает, что должен быть выведен список без маркеров.

Чтобы получить изображение, плавающее по правому краю, добавьте этот код в пользовательский файл CSS (требуется платная услуга WordPress.com Premium или WordPress.com Business):

.display-posts-listing .alignleft
float: right;
margin: 0 0 5px 5px;
>

(Расширенные) запросы таксономии с несколькими критериями

Хотя для большинства пользователей достаточен запрос таксономии с одним критерием, этот шорткод поддерживает бесконечное количество запросов таксономии. Например, вы хотите отобрать все записи из рубрики «Избранные», отмеченные тегом «homepage». Мы будем использовать шорткод, который выглядит следующим образом.

[display-posts taxonomy=»category» tax_term=»featured» taxonomy_2=»post_tag» tax_2_term=»homepage»]

Если вам нужно получить все записи в рубрике featured, которые также отмечены тегом blue или green, можно использовать шорткод, который выглядит следующим образом:

[display-posts taxonomy=»category» tax_term=»featured» taxonomy_2=»post_tag» tax_2_term=»blue, green» tax_2_operator=»OR» tax_relation=»AND»]

Можно ввести строку с любым количеством элементов. Для количества (count) введите значение 2. В полях, перечисленных ниже, введите для (count) конкретное число.

Доступные поля:

taxonomy_(count)
Указывает, какую таксономию запрашивать
Значение по умолчанию: пусто

tax_(count)_term
Указывает, какие термины включать (если их несколько, они разделяются запятыми)
Значение по умолчанию: пусто

tax_(count)_operator
Указывает, какую операцию применять в запросе терминов (IN, NOT IN или AND)
Значение по умолчанию: IN

tax_relation
Описывает взаимосвязь между запросами таксономии с несколькими критериями (должны ли результаты соответствовать всем запросам или только одному из них). Доступные значения: AND и OR
Значение по умолчанию: AND

Лимиты

Шорткод показа записей имеет ограничение: отображается не более 100 записей.

Как найти идентификатор записи

Идентификатор записи можно найти в меню «Редактировать URL-адрес записи» в редакторе записей. Например, в следующем примере используется идентификатор записи «125».

post_id

Ваша оценка:

Похожие руководства

Не можете найти то, что ищете?

Tax on WordPress.com Purchases

Tax (known in different regions as VAT, GST, or consumption tax) may be included in your WordPress.com purchases. This guide will answer common questions about your WordPress.com subscriptions and these consumption-based taxes.

  1. Tax on Your Purchases
  2. Businesses Not Subject to Tax
  3. Other Tax-Exempt Customers
  4. Add Tax Details to Your Account
    1. During Checkout
    2. In Your Account

    Tax on Your Purchases

    Our services are subject to consumption-based taxes in many jurisdictions. Depending on your location, this can appear as Value Added Tax (VAT), Goods & Services Tax (GST), or Consumption Tax (CT).

    When making a purchase on WordPress.com, you are charged the relevant tax based on your billing address.

    The tax will be displayed as an independent line item on the checkout screen. You can also find the tax charge listed on your billing receipt.

    Businesses Not Subject to Tax

    Tax-registered businesses may be exempt from paying consumption-based taxes. As a tax-registered business, you can enter a valid VAT or GST ID to avoid being charged tax on your purchases and renewals. You will be charged tax if you have not entered tax details into our system.

    EU-based users can check the VAT Information Exchange System (VIES) FAQ, which answers common questions. Users based in other locations should check their locale’s specific consumption-tax rules. As an Ireland-based company, we must charge VAT on all transactions in Ireland, including those to VAT-registered businesses.

    To avoid being charged tax on your next purchase or renewal, add your eligible tax details using the steps described in the section below.

    Other Tax-Exempt Customers

    Some customers or organizations qualify to make sales tax-exempt purchases. Tax exemptions are granted at the state or country level. Please contact your tax advisor or your state or local taxing authority to determine if your organization qualifies for sales tax exemption.

    If you have a valid tax exemption that you wish to apply to your WordPress.com purchases, you can contact us to submit your documentation. Your proof of tax exemption should include the following:

    • Name of your exempt organization.
    • Your tax exemption documentation.
    • Any additional information required by your government.

    Add Tax Details to Your Account

    You can add your VAT, GST, or consumption-based business tax ID details to your account to display your tax details in your receipts and ensure you only pay the appropriate tax.

    During Checkout

    When making a purchase, you will enter your billing location. If your country is subject to a consumption-based tax, you can enter your business tax ID details by ticking the box labeled “Add VAT/GST details“:

    The box for

    In Your Account

    You can add tax details at any time in your WordPress.com account by following these steps:

    1. Click on your Profile icon at the top of your WordPress.com dashboard:

    The profile link is highlighted with an orange arrow

    1. On the left side, select the Purchases menu option:

    The Purchases menu item is highlighted.

    1. At the top of the screen, select the Billing History tab:

    The Billing History tab is selected.

    1. Scroll down to the bottom of the screen, below your list of transactions.
    2. Click the “Add tax details” link, which will be labeled “Add VAT details”, “Add GST details”, or the name of the consumption tax in your region.
    3. Select your country and type your tax ID number, name, and address.
    4. Click Validate and save.

    Form for adding tax details.

    Once you have entered the tax details for your account, you can click “View receipt” (or “Email receipt”) in your Billing History for any purchase. The tax details will be included in all past and future receipts.

    Further Support

    • Need to update your existing business Tax ID details.
    • Have been charged VAT as a VAT-registered business subject to reverse charges.
    • Have any questions not answered in this guide.

    Include your VAT number and country code when you contact us.

Добавить комментарий

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