Я использую хлебные крошки Yoast для своих пользовательских типов сообщений и таксономий и WPML в качестве системы перевода.
WordPress 5.1.1
Йоаст 10
WPML 4.2.4.1
Вот мой код плагина Custom Post:
<?php
/*Plugin Name: Akal CPT for PSJ / cpt-akal Theme
Description: This plugin registers custom post type.
Version: 1.0
License: GPLv2
*/
//CUSTOM TAXONOMY => GENERATION DES CATEGORIES "MH & ACC Types"
function mh_acc_type() {
$labels = array(
'name' => _x( 'MH & ACC Types', 'Taxonomy General Name', 'cpt-akal' ),
'singular_name' => _x( 'MH & ACC Type', 'Taxonomy Singular Name', 'cpt-akal' ),
'menu_name' => __( 'MH & ACC Types', 'cpt-akal' ),
'all_items' => __( 'All Items', 'cpt-akal' ),
'parent_item' => __( 'Parent Item', 'cpt-akal' ),
'parent_item_colon' => __( 'Parent Item:', 'cpt-akal' ),
'new_item_name' => __( 'New Item Name', 'cpt-akal' ),
'add_new_item' => __( 'Add New Item', 'cpt-akal' ),
'edit_item' => __( 'Edit Item', 'cpt-akal' ),
'update_item' => __( 'Update Item', 'cpt-akal' ),
'view_item' => __( 'View Item', 'cpt-akal' ),
'separate_items_with_commas' => __( 'Separate items with commas', 'cpt-akal' ),
'add_or_remove_items' => __( 'Add or remove items', 'cpt-akal' ),
'choose_from_most_used' => __( 'Choose from the most used', 'cpt-akal' ),
'popular_items' => __( 'Popular Items', 'cpt-akal' ),
'search_items' => __( 'Search Items', 'cpt-akal' ),
'not_found' => __( 'Not Found', 'cpt-akal' ),
'no_terms' => __( 'No items', 'cpt-akal' ),
'items_list' => __( 'Items list', 'cpt-akal' ),
'items_list_navigation' => __( 'Items list navigation', 'cpt-akal' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'residentiel',
'hierarchical' => true,
),
);
register_taxonomy( 'mh_acc_type', array( 'mh_accs_post_type' ), $args );
}
add_action( 'init', 'mh_acc_type', 0 );
//CUSTOM POST Type = MH & ACC => GENERATION DES SINGLE POST "MH_ACCS_POST_TYPE"
function akal_cpt_mh_acc() {
$labels = array(
'name' => _x('MH & ACC', 'cpt-akal'),
'singular_name' => _x('MH & ACC', 'cpt-akal'),
'add_new' => _x('Add MH & ACC', 'cpt-akal'),
'add_new_item' => __('Add MH & ACC'),
'edit_item' => __('Edit MH & ACC'),
'new_item' => __('New MH & ACC'),
'view_item' => __('View MH & ACC'),
'search_items' => __('Search MH & ACC'),
'not_found' => __('Nothing found'),
'not_found_in_trash' => __('Nothing found in Trash'),
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'taxonomies' => array('mh_acc_type', 'post_tag'),
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_rest' => true,
'rest_base' => '',
'query_var' => true,
'rewrite' => true,
'capability_type' => 'page',
'hierarchical' => true,
'menu_position' => null,
'has_archive' => 'residentiel/.',
'supports' => array('title', 'editor', 'thumbnail', 'comments', 'revisions', 'custom-fields', 'page-attributes', 'excerpt'),
'rewrite' => array('slug' => _x( 'residentiel/achat-vente-mobil-home-accessoires/%mh_acc_type%', 'cpt-akal' )), //FOR WPML
'_builtin' => false,
);
register_post_type( 'mh_accs_post_type' , $args );
}
add_action('init', 'akal_cpt_mh_acc');
//REDIRECTION %mh_acc_type%
function custom_post_link($post_link, $id = 0)
{
$post = get_post($id);
if($terms = wp_get_object_terms($post->ID, 'mh_acc_type'))
{
$mh_acc_type = $terms[0]->slug;
//Replace the query var surrounded by % with the slug of
//the first taxonomy it belongs to.
return str_replace('%mh_acc_type%', $mh_acc_type, $post_link);
}
//If all else fails, just return the $post_link.
return $post_link;
}
add_filter('post_type_link', 'custom_post_link', 1, 3);
add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
$newRules = array();
$newRules['residentiel/(.+)/(.+)/(.+)/?$'] = 'index.php?mh_accs_post_type=$matches[3]';
$newRules['residentiel/(.+)/(.+)/?$'] = 'index.php?mh_acc_type=$matches[2]';
return array_merge($newRules, $rules);
}
//Register template single-mh_accs_post_type.php for all CPT
function load_mh_accs_template($template) {
global
$post;
if ($post->post_type == "mh_accs_post_type" && $template !== locate_template(array("single-mh_accs_post_type.php")))
{
return plugin_dir_path( __FILE__ ) . "single-mh_accs_post_type.php";
}
return $template;
}
add_filter('single_template', 'load_mh_accs_template');
//Register template archives-mh_acc_type.php for MH & ACC Taxonomy Archives
add_filter('taxonomy_template', 'load_mh_acc_type_template');
function load_mh_acc_type_template($template) {
if (is_tax ('mh_acc_type'))
{
$template = plugin_dir_path( __FILE__ ) . "archive-mh_acc_type.php";
}
return $template;
}
А вот пример сгенерированных страниц:
Как видите, все прекрасно работает после долгого времени, проведенного на нем, и многочисленных головных болей. И это также прекрасно работает, когда я использую перевод через WPML, здесь на английском (оригинал на французском):
За исключением ... в этой английской версии, когда я проверяю хлебные крошки, предоставленные Yoast, я вижу что-то не так со вторым уровнем / residentiel /. / Residentiel / это французская версия, поэтому она должна быть / жилых / на английском языке, но это не так.
Я уже выполнил все настройки WPML с переводом строк и пользовательской таксономией. Я предположил, что что-то не так с моим кодом в части перенаправления; поскольку / residentiel / жестко запрограммирован, может быть, мне следует добавить условие «если language = eng, сделайте это», но я не очень хорош ... или, может быть, я борюсь с ошибкой WPML или Yoast ... WPML не поможет, а поддержка Yoast не отвечает ...
Есть идеи / помощь?
Спасибо
Akal