GiT
Постоялец
- Регистрация
- 28 Июл 2016
- Сообщения
- 160
- Реакции
- 116
- Автор темы
- #1
Больше нет сил, вторую неделю в поисках решения. Перерыл весь интернет и перепробовал разные фрагменты кода, но так и не нашёл того что мне нужно. Надеюсь на вашу помощь.
Что нужно
Нужно добиться полной структуры URL для произвольного типа записи, чтобы ссылка на страницу записи выглядела так:
Что сделано
Создан новый тип записи:
px_product - товары.
px_product_cat - категории товаров ( термины таксономии имеют иерархическую предполагают вложенность от 1 до 3 уровней ).
Исходник плагина №1
Код работает, только для терма с одним уровнем вложенности.
Возможное решение
В интернете нашёл, одно решение, но оно не совсем подходит и имеет две проблемы.
Я не программист, но рад любой помощи. Если у кого есть похожее решение, буду рад исходнику .
Что нужно
Нужно добиться полной структуры URL для произвольного типа записи, чтобы ссылка на страницу записи выглядела так:
сайт.ру / имя-типа-записи / имя-термина-таксономии / имя-вложенного-термина / имя-записи
Что сделано
Создан новый тип записи:
px_product - товары.
px_product_cat - категории товаров ( термины таксономии имеют иерархическую предполагают вложенность от 1 до 3 уровней ).
mysite.com / products / term -1 / child-term -2 / grandchild-term -3 / product-name
Исходник плагина №1
Код работает, только для терма с одним уровнем вложенности.
К сожалению, если термины имеют вложенность ( term -1 / child-term -2 / grandchild-term -3 ), в структуре ссылок отображается только последний.mysite.com / products / term -1 / product-name
mysite.com / products / grandchild-term -3 / product-name
PHP:
<?php
/*
* Plugin Name: MOD
* Description: DEV
*/
/**
* CPT - Создание произвольного типа записи.
*/
add_action( 'init', 'cpt_product', 0 );
function cpt_product() {
// Тип записи
register_post_type( 'px_product', array(
'labels' => array( 'name' => __( 'Товары' ) ),
'public' => true,
'show_ui' => true,
'capability_type' => 'post',
'publicly_queryable' => true,
'exclude_from_search' => false,
'hierarchical' => true,
'_builtin' => false,
'query_var' => true,
'rewrite' => array( 'slug' => 'products/%px_product_cat%', 'with_front' => true ),
'supports' => array( 'title', 'editor', 'author', 'excerpt', 'trackbacks', 'custom-fields' )
) );
// Таксономия
register_taxonomy( 'px_product_cat', array( 'px_product' ), array(
'labels' => array( 'name' => __( 'Категории' ) ),
'hierarchical' => true,
'show_ui' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'products', 'with_front' => true )
) );
flush_rewrite_rules(); // Временно DEL
}
/**
* PermaLink - Внедрение терма таксономии в структуру постоянных ссылок для произвольного типа записи.
*/
// обработчик для %px_product_cat%
add_filter( 'post_type_link', 'permalink_cpt_product', 10, 2 );
function permalink_cpt_product( $link, $post ) {
if ( $post->post_type === 'px_product' ) {
if ( $terms = get_the_terms( $post->ID, 'px_product_cat' ) )
$link = str_replace( '%px_product_cat%', current( $terms )->slug, $link );
}
return $link;
}
Возможное решение
В интернете нашёл, одно решение, но оно не совсем подходит и имеет две проблемы.
- В постоянной ссылке появляется двойная косая черта " // "
mysite.com / products / term -1 / child-term -2 / grandchild-term -3 // product-name - Если из product-name перейти на уровень выше, то структура ссылки ломается
mysite.com / products / grandchild-term -3
PHP:
<?php
/*
* Plugin Name: MOD
* Description: DEV
*/
/**
* CPT - Создание произвольного типа записи.
*/
add_action( 'init', 'cpt_product', 0 );
function cpt_product() {
// тип записи
register_post_type( 'px_product', array(
'labels' => array( 'name' => __( 'Товары' ) ),
'public' => true,
'show_ui' => true,
'capability_type' => 'post',
'publicly_queryable' => true,
'exclude_from_search' => false,
'hierarchical' => true,
'_builtin' => false,
'query_var' => true,
'rewrite' => array( 'slug' => 'products/%px_product_cat%', 'with_front' => true ),
'supports' => array( 'title', 'editor', 'author', 'excerpt', 'trackbacks', 'custom-fields' )
) );
// таксономия
register_taxonomy( 'px_product_cat', array( 'px_product' ), array(
'labels' => array( 'name' => __( 'Категории' ) ),
'hierarchical' => true,
'show_ui' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'products', 'with_front' => true )
) );
flush_rewrite_rules(); // Временно DEL
}
/**
* PermaLink - Внедрение терма таксономии в структуру постоянных ссылок для произвольного типа записи.
*/
// правило перезаписи, где product-name всегда 5-й сегмент
add_filter( 'rewrite_rules_array', 'mmp_rewrite_rules' );
function mmp_rewrite_rules( $rules ) {
$newRules = array();
$newRules['products/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?px_product=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment
$newRules['products/(.+)/?$'] = 'index.php?px_product_cat=$matches[1]';
return array_merge( $newRules, $rules );
}
// обработчик для %px_product_cat%
add_filter( 'post_type_link', 'filter_post_type_link', 10, 2 );
function filter_post_type_link( $link, $post ) {
if ($post->post_type != 'px_product')
return $link;
if ( $cats = get_the_terms( $post->ID, 'px_product_cat' ) ) {
$link = str_replace( '%px_product_cat%', get_taxonomy_parents( array_pop( $cats )->term_id, 'px_product_cat', false, '/', true ), $link ); // пользовательская функция для других таксономий
}
return $link;
}
// пользовательская функция для других таксономий
function get_taxonomy_parents( $id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array() ) {
$chain = '';
$parent = &get_term( $id, $taxonomy );
if ( is_wp_error( $parent ) ) {
return $parent;
}
if ( $nicename )
$name = $parent -> slug;
else
$name = $parent -> name;
if ( $parent -> parent && ( $parent -> parent != $parent -> term_id ) && !in_array( $parent -> parent, $visited ) ) {
$visited[] = $parent -> parent;
$chain .= get_taxonomy_parents( $parent -> parent, $taxonomy, $link, $separator, $nicename, $visited );
}
if ( $link ) {
// nothing, can't get this working :(
} else
$chain .= $name . $separator;
return $chain;
}
Я не программист, но рад любой помощи. Если у кого есть похожее решение, буду рад исходнику .
Последнее редактирование: