Переписать правила для настраиваемого пула сообщений

Я теряюсь с правилами перезаписи и нуждаюсь в помощи, пожалуйста.

Я создал персонализированный тип сообщений типа «товар» с пользовательским мета-брендом.

URL-адрес продукта, называемого молоком, будет mysite.com/products/milk , мне нужен URL-адрес, включая этот бренд, mysite.com/brand-brandname/milk

Некоторые примеры: mysite.com/brand-supermilk/milk где «супермилка» – это бренд в обычном мета молоке

mysite.com/brand-goodproducts/coffe где хорошие продукты – это бренд

У меня есть это правило и переписываю:

 $args = array( 'rewrite' => array('slug' => 'brand-%brand_name%', 'with_front' => false), ); register_post_type('products', $args); function wptuts_custom_tags() { add_rewrite_rule("^brand-([^/]+)?",'index.php?post_type=products&brand_name=$matches[1]','top'); flush_rewrite_rules(); } add_action('init','wptuts_custom_tags'); function my_post_type_link_filter_function($post_link, $id = 0, $leavename = FALSE) { if (strpos('%brand_name%', $post_link) === FALSE) { $post = &get_post($id); $brand_name =get_post_meta($post->ID,'brand',true); if(empty($brand_name)){$brand_name = 'default';} $post_link = str_replace('%brand_name%',$brand_name, $post_link); return $post_link; } } add_filter('post_type_link', 'my_post_type_link_filter_function', 1, 3); 

Все это показывает мне правильный URL-адрес в админе, когда я добавляю новый товарный пост, но показываю мне 404 или список товаров, но не страницу продукта.

Solutions Collecting From Web of "Переписать правила для настраиваемого пула сообщений"

WordPress, похоже, не может генерировать правильные правила, когда вы используете более сложные форматы для аргумента slug в register_post_type . В этом случае мы должны использовать add_permastruct .

В этом примере добавляются типы сообщений и дополнительные правила для включения уникальных продуктов и архивов брендов с правильными URL-адресами:

 function wpd_products_post_type() { // post type args // rewrite and has_archive must be true! $args = array( 'public' => true, 'rewrite' => true, 'has_archive' => true, 'supports' => array( 'title', 'custom-fields' ), ); register_post_type( 'products', $args ); // so WP will parse brand_name into query vars add_rewrite_tag( '%brand_name%', '([^&]+)' ); // this sets the actual structure the post type will use add_permastruct( 'products', 'brand-%brand_name%/%products%', array( 'with_front' => false ) ); // to enable product archives by brand add_rewrite_rule( "^brand-([^/]+)?", 'index.php?post_type=products&brand_name=$matches[1]', 'top' ); } add_action( 'init','wpd_products_post_type' ); 

Вам все равно понадобится ваш фильтр post_type_link чтобы вставить мета-значение в URL-адрес уникального продукта.

Вам также необходимо добавить фильтр pre_get_posts для архивов продуктов, чтобы добавить мета-запрос для вашего brand_name .

Вы также можете добавить дополнительный фильтр pre_get_posts для особых продуктов для добавления в мета-запрос, поскольку вы можете обнаружить, что в настоящее время вы можете поместить любое значение в URL-адрес в качестве названия бренда, и запрос будет успешным, поскольку WordPress запрашивает только slug by по умолчанию.