Loại bài đăng tùy chỉnh, không cần xem đơn lẻ, cộng với muốn viết lại permalink bao gồm hàm băm trong URI


8

Chúng tôi đang sử dụng CPT để quản lý trang câu hỏi thường gặp trên một trang web, trong đó câu hỏi là tiêu đề bài đăng và câu trả lời là nội dung bài đăng. Có một trang chính cho các Câu hỏi thường gặp hiển thị tất cả các bài đăng (trang lưu trữ Câu hỏi thường gặp). Với cấu trúc này, chúng tôi thực sự không cần một chế độ xem cho bất kỳ Câu hỏi thường gặp nào và trên thực tế muốn bỏ qua cấu trúc trang web. Để giải quyết permalinks, chúng tôi muốn đặt chúng thành một cái gì đó như example.com/faq/#uniqueIdentifier, nghĩ rằng chúng tôi sẽ sử dụng #uniqueIdentifier để khớp với div trên trang lưu trữ có chứa câu trả lời và gọi sự chú ý đến nó trong một số thời trang. Công cụ duy nhất có thể là ID bài đăng, tiêu đề câu hỏi faq, dữ liệu từ hộp meta hoặc thứ gì khác.

Vì vậy, hãy để tôi tóm tắt lại những gì tôi cần chúng ta cần thực hiện:

(1) viết lại các permalinks faq thành / faq / # Something, và

(2) đảm bảo tất cả / faq / liên kết tuyến đến lưu trữ mẫu và không đơn lẻ

Tôi chủ yếu là một người mới nhưng khá giỏi trong việc dò dẫm mọi thứ. Chưa bao giờ thử viết lại mặc dù vậy sẽ đánh giá cao một số hướng cụ thể về điều đó.

Cảm ơn bạn.

Câu trả lời:


12

Xin chào @daxitude:

Hãy để tôi đầu tiên đề nghị bạn xem xét lại. Nếu bạn không có các trang Câu hỏi thường gặp riêng cho mỗi Câu hỏi thường gặp:

  1. Bạn giảm bề mặt của mình để tối ưu hóa công cụ tìm kiếm và giảm lưu lượng tiềm năng mà bạn có thể nhận được

  2. Bạn khiến ai đó không thể chia sẻ Câu hỏi thường gặp cụ thể với bạn bè qua email và / hoặc chia sẻ với mạng của họ trên Facebook, Twitter, v.v. (Là người dùng, tôi luôn cảm thấy thất vọng bởi các nhà phát triển trang web không cho phép tôi có URL trực tiếp đến một mục và thay vào đó buộc tôi phải liên kết đến trang liệt kê tất cả các mục.)

Tuy nhiên, nếu bạn vẫn muốn làm như vậy thì hãy làm hai điều:

1.) Sử dụng 'post_type_link'móc

Sử dụng 'post_type_link'hook để sửa đổi URL như trong ví dụ sau * (Tôi giả sử loại bài đăng tùy chỉnh của bạn là 'faq'). Thêm phần sau vào functions.phptệp của chủ đề của bạn :

add_action('post_type_link','yoursite_post_type_link',10,2);
function yoursite_post_type_link($link,$post) {
  $post_type = 'faq';
  if ($post->post_type==$post_type) {
    $link = get_post_type_archive_link($post_type) ."#{$post->post_name}";
  }
  return $link;
}

2.) unset($wp_rewrite->extra_permastructs['faq'])

Đây là một hack , nhưng nó là một hack bắt buộc để làm những gì bạn muốn. Sử dụng một 'init'cái móc để unset($wp_rewrite->extra_permastructs['faq']). Nó loại bỏ quy tắc viết lại mà register_post_type()thêm. Tôi đang bao gồm một cuộc gọi đến register_post_type()để tôi có thể cung cấp một ví dụ hoàn chỉnh cho cả bạn và những người khác:

add_action('init','yoursite_init');
function yoursite_init() {
  register_post_type('faq',array(
      'labels' => array(
      'name' => _x('FAQs', 'post type general name'),
      'singular_name' => _x('FAQ', 'post type singular name'),
      'add_new' => _x('Add New', 'faq'),
      'add_new_item' => __('Add New FAQ'),
      'edit_item' => __('Edit FAQ'),
      'new_item' => __('New FAQ'),
      'view_item' => __('View FAQ'),
      'search_items' => __('Search FAQs'),
      'not_found' =>  __('No FAQs found'),
      'not_found_in_trash' => __('No FAQs found in Trash'),
      'parent_item_colon' => '',
      'menu_name' => 'FAQs'
    ),
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'query_var' => true,
    'rewrite' => array('slug'=>'faqs'),
    'capability_type' => 'post',
    'has_archive' => 'faqs',
    'hierarchical' => false,
    'supports' => array('title','editor','author','thumbnail','excerpt')
  ));

  global $wp_rewrite;
  unset($wp_rewrite->extra_permastructs['faq']);  // Removed URL rewrite for specific FAQ 
  $wp_rewrite->flush_rules(); // THIS SHOULD BE DONE IN A PLUGIN ACTIVATION HOOK, NOT HERE!
}

Đó là về nó.

Tất nhiên, việc sử dụng $wp_rewrite->flush_rules()trong 'init'hook ở trên là một thực tế tồi tệ và thực sự chỉ nên được thực hiện một lần vì vậy tôi đã triển khai một plugin hoàn chỉnh và khép kín được gọi FAQ_Post_Typeđể thực hiện đúng. Plugin này thêm một loại bài đăng FAQ với các quy tắc URL mà bạn muốn và nó sử dụng một register_activation_hook()để xóa các quy tắc viết lại; kích hoạt rõ ràng là một trong số ít những thứ yêu cầu mã plugin thay vì mã có thể chạy trong functions.phptệp của một chủ đề .

Đây là mã cho FAQ_Post_Typeplugin; vui lòng sửa đổi cho các yêu cầu của bạn:

<?php
/*
Plugin Name: FAQ Post Type
Description: Answers the question "Custom post type, no need for single view, plus want permalink rewrites that include hash in URI" on WordPress Answers.
Plugin URL: http://wordpress.stackexchange.com/questions/12762/custom-post-type-no-need-for-single-view-plus-want-permalink-rewrites-that-incl
*/
if (!class_exists('FAQ_Post_Type')) {
  class FAQ_Post_Type {
    static function on_load() {
      add_action('post_type_link', array(__CLASS__,'post_type_link'),10,2);
      add_action('init', array(__CLASS__,'init'));
    }
    static function post_type_link($link,$post) {
      if ('faq'==$post->post_type) {
        $link = get_post_type_archive_link('faq') ."#{$post->post_name}";
      }
      return $link;
    }
    static function init() {
      register_post_type('faq',array(
          'labels' => array(
          'name' => _x('FAQs', 'post type general name'),
          'singular_name' => _x('FAQ', 'post type singular name'),
          'add_new' => _x('Add New', 'faq'),
          'add_new_item' => __('Add New FAQ'),
          'edit_item' => __('Edit FAQ'),
          'new_item' => __('New FAQ'),
          'view_item' => __('View FAQ'),
          'search_items' => __('Search FAQs'),
          'not_found' =>  __('No FAQs found'),
          'not_found_in_trash' => __('No FAQs found in Trash'),
          'parent_item_colon' => '',
          'menu_name' => 'FAQs'
        ),
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'query_var' => true,
        'rewrite' => array('slug'=>'faqs'),
        'capability_type' => 'post',
        'has_archive' => 'faqs',
        'hierarchical' => false,
        'supports' => array('title','editor','author','thumbnail','excerpt'),
      ));
      global $wp_rewrite;
      unset($wp_rewrite->extra_permastructs['faq']);  // Remove URL rewrite for specific FAQ
    }
    static function activate() {
      global $wp_rewrite;
      $wp_rewrite->flush_rules();
    }
  }
  FAQ_Post_Type::on_load();
  register_activation_hook(__FILE__,array('FAQ_Post_Type','activate'));
}

Bạn cũng có thể giữ các quy tắc tuôn ra bên trong 'init'bằng cách sử dụng kiểm tra giá trị tùy chọn nếu bạn thích điều này:

// Add this code in your 'init' hook at your register_post_type('faq',...)
if (!get_option('faq_rewrite_rules_updated')) {
  global $wp_rewrite;
  unset($wp_rewrite->extra_permastructs['faq']);  // Remove URL rewrite for specific FAQ
  $wp_rewrite->flush_rules();
  update_option('faq_rewrite_rules_updated',true);
}

Lựa chọn của bạn.

Dù sao, hãy cho tôi biết nếu có trường hợp sử dụng mà bạn phát hiện ra rằng điều này không giải quyết.


Xin chào @MikeSchinkel. Ôi! Bạn chắc chắn là một cá nhân hữu ích. Tôi hoàn toàn đồng ý về điểm xem xét lại của bạn # 1 và # 2, nhưng tôi tin rằng chúng tôi chủ yếu đã giải quyết những mối quan tâm này. Đối với # 1 - vì chúng tôi đang hiển thị toàn bộ câu hỏi và câu trả lời trên trang lưu trữ cpt, nên một chế độ xem cho mỗi faq sẽ bị trùng lặp nội dung và do đó không nhất thiết có lợi cho SEO? Ngoài ra, chúng tôi đã cảm thấy rằng toàn bộ một trang chỉ cho một câu hỏi faq là một chút vẫy tay và chúng tôi muốn cung cấp cho mọi người nội dung nhanh hơn so với việc phải nhấp vào nhiều liên kết hơn để đến đó.
daxitude

(rõ ràng có giới hạn char cho các bình luận và tôi là một cá nhân dài dòng!) Đối với # 2 - mọi thứ sau khi băm trong uri được khớp với một div trên trang có chứa câu trả lời. tất cả các câu trả lời khác được ẩn khi tải trang và các câu trả lời trùng khớp mở ra. Theo cách này, chúng tôi bảo toàn hoàn toàn khả năng chia sẻ và lưu các liên kết ... miễn là chúng tôi không bị thay đổi và thay đổi cấu trúc này vì một số lý do ngớ ngẩn.
daxitude

Khi trả lời của bạn, bước 1 là tuyệt vời! Trước đây tôi không quen thuộc với cái móc này và đã không lường trước được một giải pháp gọn gàng như vậy. Vì tò mò, tôi nhận ra rằng bạn có thể thực hiện bước 1 chứ không phải bước 2. Điều này sẽ gửi các liên kết faq đến uri thích hợp nhưng cũng giữ nguyên các trang duy nhất..và chúng tôi không bao giờ liên kết với chúng thông qua trang web. Điều này có vẻ như một cách hợp lý để đi? Cảm ơn bạn.
daxitude

@daxitude - Tốt hơn là không cho phép các công cụ tìm kiếm lập chỉ mục trên một trang lưu trữ và cho phép chúng lập chỉ mục các trang riêng lẻ. Hai thứ nhập khẩu nhiều nhất cho SEO là trang <title><h1>Heading</h1>bạn sẽ chỉ nhận được một trong số đó trên một trang lưu trữ nhưng bạn chỉ có một thứ cho các trang Câu hỏi thường gặp riêng lẻ. Tôi đồng ý rằng tất cả nội dung Câu hỏi thường gặp là tốt nhất trên trang lưu trữ, nhưng bạn có thể cung cấp tất cả nội dung trên trang chính trang xem chi tiết cho những ai muốn nó (bao gồm các công cụ tìm kiếm) và chắc chắn nó không ảnh hưởng gì; chỉ cần thêm "Permalink" gần với câu hỏi FAQ.
MikeSchinkel

@daxitude - Tại sao bạn nghĩ rằng tôi đã không thực hiện # 2? Đó là mục đích của mã theo tiêu đề "2.) unset($wp_rewrite->extra_permastructs['faq'])" , tất nhiên, tôi cho rằng bạn không sử dụng. :)
MikeSchinkel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.