Неправильный кусок хлеба Йоаста при переводе пользовательской таксономии в WPML - PullRequest
0 голосов
/ 19 марта 2019

Я использую хлебные крошки 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

...