Пользовательский тип поста постоянная ссылка меняется каждый раз - PullRequest
0 голосов
/ 25 апреля 2019

Я создал структуру родительский> дочерний> внук.(Курсы> Серия> Эпизоды).

Я создал приведенный ниже код, который обновляет URL-адреса для каждого из пользовательских типов записей, чтобы у меня была структура URL

http://mywebsite.co.uk/system/%course%/%series%/%episode%.

Например, курс под названием «Ускоренный курс» с серией «Основ» и эпизодом «Проверка ваших зеркал» будет выглядеть так:

http://mywebsite.co.uk/system/crash-course/the-basics/checking-your-mirrors

Все работает отлично, но я заметил очень странную ошибку.Каждый раз, когда я сохраняю эпизод, постоянная ссылка меняется сама, чтобы попытаться сопоставить случайный ряд?

Например, если я сохраню эпизод один раз, моя постоянная ссылка будет

http://mywebsite.co.uk/system/crash-course/the-basics/checking-your-mirrors.

Затем, как только я вернусь к эпизоду, внесите любые изменения и попытайтесь сохранить его снова, после того как я сохраню и страница обновится, она изменится на

http://mywebsite.co.uk/system/crash-course/the-basics/the-basics-2,и мне нужно нажать кнопку «Изменить» и вручную изменить его обратно.

Ниже приведен мой полный регистрационный код с типом записи, пожалуйста, дайте мне знать, если у кого-нибудь есть идеи!Это не идеальное изменение постоянной ссылки вручную каждый раз, когда я делаю изменение!

Примечание. Мои извинения за огромный фрагмент кода ниже, я подумал, что будет лучше, если я вставлю ВСЕ моипользовательский код типа сообщения, чтобы помочь отладке!

<?php
/* ----------------------------------------------------------------------------------------------------------
        Register our custom post types
---------------------------------------------------------------------------------------------------------- */
function create_post_type() {
    //Courses
    register_post_type( 'course',
      [
        'labels' => array(
          'name' => __( 'Courses' ),
          'singular_name' => __( 'Course' )
        ),
        'description' => 'All courses',
        'public' => true,
        'hierarchical' => true,
        'rewrite' => array(
            'slug'       => 'system',
        ),
        'menu_icon' => 'dashicons-welcome-learn-more',
        'supports' => ['title', 'custom_fields', 'page-attributes']
      ]
    );

    //Series
    register_post_type( 'series',
      [
        'labels' => array(
          'name' => __( 'Series' ),
          'singular_name' => __( 'Series' )
        ),
        'description' => 'Course Series',
        'public' => true,
        'hierarchical' => false,
        'show_ui'              => true,
        'show_in_menu'         => 'edit.php?post_type=course',
        'supports' => ['title', 'custom_fields', 'page-attributes']
      ]
    );

    //Episodes
    register_post_type( 'episodes',
      [
        'labels' => array(
          'name' => __( 'Episodes' ),
          'singular_name' => __( 'Episode' )
        ),
        'description' => 'Series Episodes',
        'public' => true,
        'hierarchical' => false,
        'show_ui'              => true,
        'show_in_menu'         => 'edit.php?post_type=course',
        'supports' => ['title', 'custom_fields', 'page-attributes']
      ]
    );
}
add_action( 'init', 'create_post_type' );



/* ----------------------------------------------------------------------------------------------------------
        Add our meta boxes to our series and episode add/edit page
---------------------------------------------------------------------------------------------------------- */
function my_add_meta_boxes() {
  //Series Meta Boxes
  add_meta_box( 'series-parent', 'Course', 'series_attributes_meta_box', 'series', 'side', 'high' );

  //Episode Meta Boxes
  add_meta_box( 'episode-parent', 'Series', 'episode_attributes_meta_box', 'episodes', 'side', 'high' );
}
add_action( 'add_meta_boxes', 'my_add_meta_boxes' );

function series_attributes_meta_box($post) {
  $post_type_object = get_post_type_object($post->post_type);
    $pages = wp_dropdown_pages([
    'post_type' => 'course',
    'selected' => $post->post_parent,
    'name' => 'parent_id',
    'show_option_none' => __( '(no parent)' ),
    'sort_column'=> 'menu_order, post_title',
    'echo' => 0
  ]);
  if (!empty($pages)){
        echo $pages;
    }
}

function episode_attributes_meta_box( $post ) {
  $post_type_object = get_post_type_object( $post->post_type );
  $select = "<select name='parent_id' id='parent_id'>";
    $select .= "<option value=''>(No Parent)</option>";
    //Get Series
    $args = [
      'post_type' => 'series',
      'posts_per_page' => -1,
      'meta_key' => 'series_number',
      'orderby' => 'meta_value_num',
      'order' => 'ASC'
    ];
    $seriesQuery = new WP_Query($args);
    //Loop the series
    while($seriesQuery->have_posts()){
      $seriesQuery->the_post();
      $select .= "<option " . (get_the_ID() == $post->post_parent ? 'selected' : '') . " class='level-0' value='" . get_the_ID() . "'>" . get_the_title(wp_get_post_parent_id(get_the_ID())) . ' - ' . get_the_title() . "</option>";
    }
    wp_reset_postdata();
  $select .= "</select>";
  echo $select;
}


/* ----------------------------------------------------------------------------------------------------------
        String replace on the permalinks before we save them
---------------------------------------------------------------------------------------------------------- */
function custom_permalinks($permalink, $post, $leavename) {

  $post_id = $post->ID;
  $parent = $post->post_parent;
  $parent_post = get_post( $parent );

  //Series or Episodes
  switch($post->post_type){
    case 'episodes':
        if(empty($permalink) || in_array($post->post_status, array('draft', 'pending', 'auto-draft'))){
          return $permalink;
        } else {
          $grandparent_post = get_post( $parent_post->post_parent );
          $search = ['%course%', '%series%'];
          $replace = [$grandparent_post->post_name, $parent_post->post_name];
          $permalink = str_replace($search, $replace, $permalink);
          return $permalink;
        }
    break;
    case 'series':
        if(empty($permalink) || in_array($post->post_status, array('draft', 'pending', 'auto-draft'))){
          return $permalink;
        } else {
          $search = ['%course%'];
          $replace = [$parent_post->post_name];
          $permalink = str_replace($search, $replace, $permalink);
          return $permalink;
        }
    break;
    default:
        return $permalink;
    break;
  }

}
add_filter('post_type_link', 'custom_permalinks', 10, 3);

function my_add_rewrite_rules() {

  //Episodes
  add_permastruct('episodes', '/system/%course%/%series%/%episodes%', false,  ['walk_dirs' => false]);
  add_rewrite_tag('%episodes%', '([^/]+)', 'episodes=');
  add_rewrite_rule('^system/([^/]+)/([^/]+)/([^/]+)?','index.php?episodes=$matches[3]','top');

  //Series
  add_permastruct('series', '/system/%course%/%series%', false,  ['walk_dirs' => false]);
    add_rewrite_tag('%series%', '([^/]+)', 'series=');
  add_rewrite_rule('^system/([^/]+)/([^/]+)/?','index.php?series=$matches[2]','top');


}
add_action( 'init', 'my_add_rewrite_rules' );

?>
...