Anonymous
Пользовательская перезапись WordPress не работает
Сообщение
Anonymous » 17 окт 2024, 10:02
Я перепробовал очень много разных вещей, прочитал 30 разных сообщений и просто не могу заставить специальную перезапись работать с пользовательским post_type и пользовательской таксономией.
Вот мой код:
Код: Выделить всё
function product_register() {
$labels = array(
'name' => __('My Products', 'post type general name'),
'singular_name' => __('Product', 'post type singular name'),
'add_new' => __('Add New', 'Product'),
'add_new_item' => __('Add New Product'),
'edit_item' => __('Edit Product'),
'new_item' => __('New Product'),
'view_item' => __('View This Product'),
'search_items' => __('Search Products'),
'not_found' => __('Nothing found'),
'not_found_in_trash' => __('Nothing found in Trash'),
'parent_item_colon' => ''
);
$args = array(
'labels' =>$labels,
'public' => true,
'publicly_queryable' =>true,
'show_ui' =>true,
'query_var' => true,
'menu_icon' => plugin_dir_url( __FILE__ ).'/icon.png',
'rewrite' => array( 'slug' => 'products/%taxonomy_name%', 'with_front' => false,'hierarchical' => true),
'capability_type' => 'post',
'hierarchical' >= false,
'menu_position' => null,
'supports' => array('title','editor','thumbnail','revisions')
);
register_post_type( 'products' , $args );
}
function create_product_taxonomies() {
$labels = array(
'name' => _x( 'Categories', 'taxonomy general name' ),
'singular_name' => _x( 'Category', 'taxonomy singular name' ),
'search_items' => __( 'Search Categories' ),
'all_items' => __( 'All Categories' ),
'parent_item' => __( 'Parent Category' ),
'parent_item_colon' => __( 'Parent Category:' ),
'edit_item' => __( 'Edit Category' ),
'update_item' => __( 'Update Category' ),
'add_new_item' => __( 'Add New Category' ),
'new_item_name' => __( 'New Category Name' ),
'menu_name' => __( 'Categories' ),
);
$rewrite = array(
'slug' => 'products',
'with_front' => false,
'hierarchical' => true
);
$args = array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => $rewrite, // this makes hierarchical URLs
);
register_taxonomy( 'product_category', array( 'products' ), $args );
$labels = array(
'name' => _x( 'Sales', 'taxonomy general name' ),
'singular_name' => _x( 'Sale', 'taxonomy singular name' ),
'search_items' => __( 'Search Sales' ),
'all_items' => __( 'All Sales' ),
'parent_item' => __( 'Parent Sale' ),
'parent_item_colon' => __( 'Parent Sale:' ),
'edit_item' => __( 'Edit Sale' ),
'update_item' => __( 'Update Sale' ),
'add_new_item' => __( 'Add New Sale' ),
'new_item_name' => __( 'New Sale Name' ),
'menu_name' => __( 'Sale' ),
);
$args = array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'product_sale', 'hierarchical' =>true ),
);
register_taxonomy( 'product_sale', array( 'products' ), $args );
}
function add_rules(){
add_rewrite_rule( '^products/(.+?)/(.+?)/$', 'products.php?posttype=$matches[2]', 'top' );
add_rewrite_rule( '^products/(.+?)/(.+?)/(.+?)$', 'products.php?taxonomy=$matches[3]', 'top' );
add_rewrite_rule( '^products/(.+?)/(.+?)/?$', 'products.php?taxonomy=$matches[2]', 'top' );
add_rewrite_rule( '^products/(.+?)/(.+?)/(.+?)/(.+?)$', 'products.php?taxonomy=$matches[3]&products=$matches[4]', 'top' );
}
/* Register products taxonomies */
add_action('init', 'create_product_taxonomies', 0 );
/* Register custom post types on the 'init' hook. */
add_action('init', 'product_register');
function filter_post_type_link($link, $post)
{
if ($post->post_type != 'products')
return $link;
if ($cats = get_the_terms($post->ID, 'product_category'))
{
$replace = get_taxonomy_parents(array_pop($cats)->term_id, 'product_category', false, '/', true);
$link = str_replace('%taxonomy_name%', rtrim($replace, '/'), $link); // see custom function defined below
}
return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);
// my own function to do what get_category_parents does for other taxonomies
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;
}
Итак, когда я захожу на example.com/cat_1/cat_2/cat_3, все работает. Он показывает правильную категорию. Когда я добавляю в конце сам продукт, выдается ошибка 404. Я также должен отметить, что хотя перезапись предназначена для продуктов.php, на самом деле мне нужно использовать таксономии.php, чтобы он отображался.
Я где-то упустил некоторые детали конфигурации?
Подробнее здесь:
https://stackoverflow.com/questions/219 ... ot-working
1729148528
Anonymous
Я перепробовал очень много разных вещей, прочитал 30 разных сообщений и просто не могу заставить специальную перезапись работать с пользовательским post_type и пользовательской таксономией. Вот мой код: [code] function product_register() { $labels = array( 'name' => __('My Products', 'post type general name'), 'singular_name' => __('Product', 'post type singular name'), 'add_new' => __('Add New', 'Product'), 'add_new_item' => __('Add New Product'), 'edit_item' => __('Edit Product'), 'new_item' => __('New Product'), 'view_item' => __('View This Product'), 'search_items' => __('Search Products'), 'not_found' => __('Nothing found'), 'not_found_in_trash' => __('Nothing found in Trash'), 'parent_item_colon' => '' ); $args = array( 'labels' =>$labels, 'public' => true, 'publicly_queryable' =>true, 'show_ui' =>true, 'query_var' => true, 'menu_icon' => plugin_dir_url( __FILE__ ).'/icon.png', 'rewrite' => array( 'slug' => 'products/%taxonomy_name%', 'with_front' => false,'hierarchical' => true), 'capability_type' => 'post', 'hierarchical' >= false, 'menu_position' => null, 'supports' => array('title','editor','thumbnail','revisions') ); register_post_type( 'products' , $args ); } function create_product_taxonomies() { $labels = array( 'name' => _x( 'Categories', 'taxonomy general name' ), 'singular_name' => _x( 'Category', 'taxonomy singular name' ), 'search_items' => __( 'Search Categories' ), 'all_items' => __( 'All Categories' ), 'parent_item' => __( 'Parent Category' ), 'parent_item_colon' => __( 'Parent Category:' ), 'edit_item' => __( 'Edit Category' ), 'update_item' => __( 'Update Category' ), 'add_new_item' => __( 'Add New Category' ), 'new_item_name' => __( 'New Category Name' ), 'menu_name' => __( 'Categories' ), ); $rewrite = array( 'slug' => 'products', 'with_front' => false, 'hierarchical' => true ); $args = array( 'hierarchical' => true, 'labels' => $labels, 'show_ui' => true, 'show_admin_column' => true, 'query_var' => true, 'rewrite' => $rewrite, // this makes hierarchical URLs ); register_taxonomy( 'product_category', array( 'products' ), $args ); $labels = array( 'name' => _x( 'Sales', 'taxonomy general name' ), 'singular_name' => _x( 'Sale', 'taxonomy singular name' ), 'search_items' => __( 'Search Sales' ), 'all_items' => __( 'All Sales' ), 'parent_item' => __( 'Parent Sale' ), 'parent_item_colon' => __( 'Parent Sale:' ), 'edit_item' => __( 'Edit Sale' ), 'update_item' => __( 'Update Sale' ), 'add_new_item' => __( 'Add New Sale' ), 'new_item_name' => __( 'New Sale Name' ), 'menu_name' => __( 'Sale' ), ); $args = array( 'hierarchical' => true, 'labels' => $labels, 'show_ui' => true, 'show_admin_column' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'product_sale', 'hierarchical' =>true ), ); register_taxonomy( 'product_sale', array( 'products' ), $args ); } function add_rules(){ add_rewrite_rule( '^products/(.+?)/(.+?)/$', 'products.php?posttype=$matches[2]', 'top' ); add_rewrite_rule( '^products/(.+?)/(.+?)/(.+?)$', 'products.php?taxonomy=$matches[3]', 'top' ); add_rewrite_rule( '^products/(.+?)/(.+?)/?$', 'products.php?taxonomy=$matches[2]', 'top' ); add_rewrite_rule( '^products/(.+?)/(.+?)/(.+?)/(.+?)$', 'products.php?taxonomy=$matches[3]&products=$matches[4]', 'top' ); } /* Register products taxonomies */ add_action('init', 'create_product_taxonomies', 0 ); /* Register custom post types on the 'init' hook. */ add_action('init', 'product_register'); function filter_post_type_link($link, $post) { if ($post->post_type != 'products') return $link; if ($cats = get_the_terms($post->ID, 'product_category')) { $replace = get_taxonomy_parents(array_pop($cats)->term_id, 'product_category', false, '/', true); $link = str_replace('%taxonomy_name%', rtrim($replace, '/'), $link); // see custom function defined below } return $link; } add_filter('post_type_link', 'filter_post_type_link', 10, 2); // my own function to do what get_category_parents does for other taxonomies 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; } [/code] Итак, когда я захожу на example.com/cat_1/cat_2/cat_3, все работает. Он показывает правильную категорию. Когда я добавляю в конце сам продукт, выдается ошибка 404. Я также должен отметить, что хотя перезапись предназначена для продуктов.php, на самом деле мне нужно использовать таксономии.php, чтобы он отображался. Я где-то упустил некоторые детали конфигурации? Подробнее здесь: [url]https://stackoverflow.com/questions/21995440/wordpress-custom-rewrite-not-working[/url]