WordPress

niestandardowe typy postów – Wprowadzenie podkategorii do adresu URL

  • 6 lipca, 2023
  • 3 min read
niestandardowe typy postów – Wprowadzenie podkategorii do adresu URL


Odziedziczyłem dość przestarzały projekt, który zawiera dużo starszego kodu, w którym wciąż się grzebię.

Obecnie mam niestandardowy typ postu z adresem URL: /something/faqs/{topic}/{faq-post}Chcielibyśmy jednak wprowadzić podtematy do miksu z pasującymi adresami URL poszczególnych postów. (tj /something/faqs/{topic}/{sub-topic}/{faq-post}).

Poprzedni programista po prostu ukrył za pomocą CSS selektor nadrzędny w panelu administracyjnym, więc ponownie go włączyłem i mogę teraz tworzyć podtematy i przypisywać do nich poszczególne często zadawane pytania.

Teraz nadszedł czas, aby zaktualizować adres URL i tutaj jestem zakłopotany. Próbowałem śledzić kilka wątków tutaj, ale nadal napotykam problemy.

Wymienię tutaj kod, który mogę znaleźć, odnoszący się do tych obszarów (pamiętaj, że baza kodów jest naprawdę pofragmentowana, więc może być coś ukrytego gdzieś indziej, czego jeszcze nie znalazłem).

Rejestrowanie niestandardowej taksonomii:

$args = array(
  'hierarchical'      => true,
  'labels'            => $labels,
  'show_ui'           => true,
  'show_admin_column' => true,
  'query_var'         => true,
  'rewrite'           => array( 'slug' => 'topics', 'hierarchical' => true),
);

register_taxonomy('topic', array('faq'), $args);

Rejestrowanie niestandardowego typu postu:

$args = array(
  'labels'             => $labels,
  'public'             => true,
  'publicly_queryable' => true,
  'show_ui'            => true,
  'show_in_menu'       => true,
  'query_var'          => true,
  'rewrite'            => array( 'slug' => 'something/faqs/%topic%', 'hierarchical' 
    => true ),
  'capability_type'    => 'post',
  'menu_icon'          => 'dashicons-format-status',
  'map_meta_cap'       => true,
  'has_archive'        => false,
  'hierarchical'       => true,
  'menu_position'      => null,
  'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 
    'comments' )
);

register_post_type('faq', $args);

Znalazłem również następujące informacje, które po debugowaniu wydają się mieć wpływ tylko na indywidualną stronę postu:

add_filter('post_link', 'faq_permalink_rewrite', 1, 3);
add_filter('post_type_link', 'faq_permalink_rewrite', 1, 3);

function faq_permalink_rewrite($permalink, $post_id, $leavename) {
  if (strpos($permalink, '%topic%') === FALSE) return $permalink;

  $post = get_post($post_id);

  if (!$post) return $permalink;

  $terms = wp_get_object_terms($post->ID, 'topic');

  if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0]))
    $taxonomy_slug = $terms[0]->slug;
  else $taxonomy_slug = 'no-type';

  return str_replace('%topic%', $taxonomy_slug, $permalink);
}

Istnieją trzy kroki adresu URL, które należy wykonać, są to:

  • /something/faqs – Wyświetla listę wszystkich tematów nadrzędnych
  • /something/faqs/{topic} – Wyświetla listę wszystkich podtematów rodzica
  • /something/faqs/{topic}/{sub-topic} – Lista wszystkich pojedynczych postów w temacie nadrzędnym/{sub-temat}
  • /something/faqs/{topic}/{sub-topic}/{faq} – Rzeczywiste indywidualne FAQ.
Warto przeczytać!  Pomoc przy przesyłaniu plików za pomocą AJAX i PHP

Rzeczywista funkcjonalność wydaje się działać, jednak wszystko jest zawsze pod jednym adresem URL tematu. na przykład przypisanie często zadawanych pytań do tematu podrzędnego 1 dałoby mi adres URL something/faqs/sub-topic/faq ale tego bym potrzebował something/faqs/parent-topic/sub-topic/faq i podobnie w przypadku strony z listą tematów podrzędnych, adres URL to obecnie something/faqs/sub-topic ale to musi być something/faqs/parent-topic/sub-topic.

Jakieś pomysły, jak mogę to osiągnąć z tym, co mam, i nie przepisywać wielu rzeczy?


Źródło