Получить пользовательский URL архива post_type

26

Это кажется глупым вопросом. Но я не могу понять это :(.

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

ariefbayu
источник
Что за кнопка, добавить ее в навигационное меню или просто общую ссылку? URL-адрес архива, как правило yoursite.com/type-slug, указывается, если явно не указано другое значение, например. yoursite.com/some-other-url..
t31os
@ t31os: да, прямо сейчас, я жестко запрограммировал это так. Но скоро изменит его, используя код @ Mike.
ariefbayu

Ответы:

25

Привет @ Тихо:

Оказывается, в 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, что я думаю, я сделаю позже этим вечером.

MikeSchinkel
источник
Кстати, когда вы отправляете trac, не могли бы вы, пожалуйста, связать его здесь.
ariefbayu
@ Тихо - Да, конечно.
MikeSchinkel
@ Майк - я бы написал что-то подобное, если бы ты этого не сделал ....;) Мне было интересно, имел ли это в виду @silent, но упоминание о кнопке заставило меня задуматься о чем-то другом ...
t31os
@ t31os - на этих выходных я работал над той же логикой для своего плагина маршрутизации URL, поэтому у меня было преимущество. :) Что касается кнопки, вы можете добавить ответ на адрес, который?
MikeSchinkel
Я не совсем уверен, что есть что-то, чтобы покрыть, я думаю, что ваша функция покрывает то, что было задано ... :)
t31os
12

когда вы регистрируете тип записи, вы можете передать строку как slug с параметром «has_archive» и удостовериться, что вы также установили для rewrite либо true, либо массив, но не false, и тогда ваш URL-адрес архива CPT будет http://www.YOURDOMAIN.com / has_archive_slug например

если вы установите в вашем register_post_type, например:

$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/

Bainternet
источник
3
Ура. Я всегда думал, что has_archiveэто логическое значение, но теперь я знаю, что ему может быть задана строка, поэтому мой тип единственного пользовательского поста recipeможет иметь слаг множественного числа/recipes/
Astrotim
Я не помню, если / когда они сделали переключение или это всегда было по ошибке, но в 2017 году 'rewrite'принимает только логическое значение или значение массива. Вместо того, что 'rewrite' => 'product',вы перечислили, оно должно быть 'rewrite' => array( 'slug' => 'product' ),.
Майк