Отримайте власну URL-адресу архіву post_type


26

Це здається дурним питанням. Але я не можу цього зрозуміти :(

Мені потрібно відобразити вдома кнопку, яка переходить до спеціальної URL-адреси архіву post_type (archive- {post_type} .php). Як це зробити?


Яка кнопка, додати її до меню наві або просто загальне посилання? URL-адреса архіву, як правило, yoursite.com/type-slugякщо ви прямо не встановили його на щось інше, наприклад. yoursite.com/some-other-url..
t31os

@ t31os: так, зараз я жорстко кодував це так. Але незабаром це змінить за допомогою коду @ Майка.
ariefbayu

Відповіді:


25

Привіт @Silent:

Виявляється, в WordPress 3.1 є функція, яка виконує саме те, що ви хочете, і вона названа get_post_type_archive_link(); ось як би ви його назвали (якщо припустити назву користувацького типу публікації 'product'):

<a href="<?php echo get_post_type_archive_link('product'); ?>">Products</a>

Нижче наводиться моя попередня відповідь, перш ніж я виявив, що в WordPress дійсно була вбудована функція для цього випадку використання.

Попередній відповідь:

Якщо я не помітив щось в основному вихідному коді для WordPress 3.1, я думаю, ви шукаєте таку функцію, get_archive_link()яку ви могли б викликати так (припускаючи тип користувальницької пошти 'product'):

<a href="<?php echo get_archive_link('product'); ?>">Products</a>

Ось вихідний код, який ви можете помістити у function.phpфайл вашої теми або у .phpфайл для плагіна, який ви можете написати:

if (!function_exists('get_archive_link')) {
  function get_archive_link( $post_type ) {
    global $wp_post_types;
    $archive_link = false;
    if (isset($wp_post_types[$post_type])) {
      $wp_post_type = $wp_post_types[$post_type];
      if ($wp_post_type->publicly_queryable)
        if ($wp_post_type->has_archive && $wp_post_type->has_archive!==true)
          $slug = $wp_post_type->has_archive;
        else if (isset($wp_post_type->rewrite['slug']))
          $slug = $wp_post_type->rewrite['slug'];
        else
          $slug = $post_type;
      $archive_link = get_option( 'siteurl' ) . "/{$slug}/";
    }
    return apply_filters( 'archive_link', $archive_link, $post_type );
  }
}

Я фактично працював над цією точною логікою у вихідні, хоча я ще не на 100% впевнений, що порядок логіки є правильним у всіх випадках використання, які WordPress може бачити, хоча, ймовірно, буде працювати для будь-якого конкретного сайту.

Це також чудова річ, яку я можу запропонувати додати до WordPress через trac, що, думаю, я зроблю пізніше цього вечора.


btw, коли ви надсилаєте trac, можете, будь ласка, зв’язати його тут.
ariefbayu

@silent - Так, звичайно.
MikeSchinkel

@Mike - Я б написав щось подібне, якби ти не був ....;) Мені було цікаво, чи це на увазі @silent, але згадка про кнопку
змусила

@ t31os - я працював над тією ж логікою у ці вихідні для свого плагіна для маршрутизації URL-адрес, тому я мав початок. :) Щодо кнопки, ви можете додати відповідь на цю адресу?
MikeSchinkel

Я не дуже впевнений, що є щось для висвітлення, я думаю, що ваша вищевказана функція охоплює те, що просили ... :)
t31os

12

коли ви реєструєте тип публікації, ви можете передати рядок як slug з параметром "has_archive" і переконайтесь, що ви також встановили перезапис на true або масив, але не false, і тоді ваша URL-адреса архіву CPT буде http://www.YOURDOMAIN.com / has_archive_slug, наприклад

якщо ви встановите у своєму регістровому_типі наприклад:

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
    'rewrite' => 'product',
    'capability_type' => 'post',
    'has_archive' => 'products', 
    'hierarchical' => false,
    'menu_position' => null,
    'supports' => array('title','editor','author','thumbnail','excerpt','comments')
  ); 
 register_post_type('product',$args);

то ваш єдиний URL: http://www.YOURDOMAIN.com/product/postName, а ваш архівний URL: http://www.YOURDOMAIN.com/products/


3
Ура. Я завжди вважав has_archiveбулевим, але тепер я знаю, що йому можна надати рядок, тому в моєму індивідуальному користувальницькому типі повідомлення recipeможе бути множина/recipes/
Astrotim

Я не пам'ятаю, чи / коли вони перемикалися або якщо це завжди було помилкою, але в 2017 році 'rewrite'приймає лише булеве значення або значення масиву. Замість того, щоб 'rewrite' => 'product',ви перерахували, це натомість має бути 'rewrite' => array( 'slug' => 'product' ),.
Майк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.