daxitude
  • 0
Новичок

Пользовательский тип сообщения, нет необходимости в отдельном просмотре, а также требуется перезапись постоянной ссылки, которая включает хэш в URI

  • 0

Мы используем CPT для управления страницей часто задаваемых вопросов на сайте, где вопрос — это заголовок сообщения, а ответ — содержание сообщения. Существует главная страница часто задаваемых вопросов, которая показывает все сообщения (страница архива часто задаваемых вопросов). С этой структурой нам действительно не нужно единое представление для любого часто задаваемых вопросов, и на самом деле мы хотели бы исключить его из структуры сайта. Чтобы адресовать постоянные ссылки, мы хотели бы задать им что-то вроде example.com/faq/#uniqueIdentifier, думая, что мы будем использовать #uniqueIdentifier для сопоставления div на странице архива, содержащей ответ, и привлечь к нему внимание в некоторых случаях. мода. Уникальный идентификатор может быть идентификатором сообщения, заголовком часто задаваемых вопросов, данными из мета-поля или чем-то еще.

Итак, позвольте мне резюмировать, что мне нужно, чтобы выполнить:

(1) переписать постоянные ссылки часто задаваемых вопросов на /faq/#something, и

(2) убедитесь, что все ссылки /faq/ ведут к шаблону архива, а не по одной

Я в основном нуб, но довольно хорошо разбираюсь в вещах. Никогда не пытался переписывать, поэтому был бы признателен за какое-то конкретное направление по этому поводу.

Спасибо.

Share
  1. Привет @daxitude:

    Позвольте мне сначала предложить вам передумать. Если у вас нет отдельных страниц часто задаваемых вопросов для каждого часто задаваемых вопросов:

    1. Вы уменьшаете свою поверхность для поисковой оптимизации и уменьшаете потенциальный трафик, который вы можете получить, и

    2. Вы делаете невозможным для кого-то поделиться конкретным FAQ с другом по электронной почте и/или поделиться в своей сети на Facebook, Twitter и т. д. (Как пользователь я всегда разочарован разработчиками сайта, которые запрещают мне иметь прямой URL-адрес к элементу и вместо этого заставляют меня ссылаться на страницу со списком всех элементов.)

    Однако, если вы все еще хотите это сделать, сделайте две вещи:

    1.) Используйте 'post_type_link' крючок

    Используйте 'post_type_link' хук, чтобы изменить URL-адрес, как в следующем примере * (я предполагаю, что ваш пользовательский тип сообщения — 'faq' ). Добавьте следующее в functions.php файл вашей темы:

    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'])

    Это хак, но он необходим, чтобы делать то, что вы хотите. Используйте 'init' крючок для unset($wp_rewrite->extra_permastructs['faq']) . Он удаляет правило перезаписи, которое register_post_type() добавляет. Я включаю вызов, register_post_type() чтобы я мог предоставить полный пример как для вас, так и для других:

    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!
    }
    

    Вот об этом.

    Конечно, вышеприведенное использование $wp_rewrite->flush_rules() в 'init' хуке — действительно плохая практика и должно быть сделано только один раз, поэтому я реализовал полный и автономный плагин, призванный FAQ_Post_Type сделать это правильно. Этот плагин добавляет тип сообщения FAQ с нужными вам правилами URL и использует register_activation_hook() для сброса правил перезаписи; активация, очевидно, является одной из немногих вещей, для которых требуется код плагина, а не код, который может работать в functions.php файле темы.

    Вот код FAQ_Post_Type плагина; не стесняйтесь изменять для ваших требований:

    <?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'));
    }
    

    Вы также можете сохранить правила сброса внутри 'init', используя проверку значения параметра, если хотите:

    // 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);
    }
    

    Твой выбор.

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

    • 0
    • Привет @MikeSchinkel. УХ ТЫ! Вы, безусловно, полезный человек. Я полностью согласен с вашим пересмотром пунктов № 1 и № 2, но я считаю, что мы в основном рассмотрели эти проблемы. Для № 1 — поскольку мы отображаем полный вопрос и ответ на странице архива cpt, не будет ли одно представление для каждого часто задаваемых вопросов дублировать контент и, следовательно, не обязательно благоприятно для SEO? Вдобавок к этому, мы посчитали, что целая страница только для одного вопроса часто задаваемых вопросов — это немного махание рукой, и мы предпочли бы быстрее доставлять людям контент, а не щелкать по большему количеству ссылок, чтобы добраться туда.

      • 0
    • (очевидно, есть ограничения на количество символов в комментариях, и я многословный человек!) Для # 2 — все после хэша в uri сопоставляется с div на странице, содержащей ответ. все остальные ответы скрыты при загрузке страницы, а соответствующий ответ открывается. Таким образом, мы полностью сохраняем возможность делиться и сохранять ссылки… до тех пор, пока мы не станем непостоянными и не изменим эту структуру по какой-то глупой причине.

      • 0
    • Что касается вашего ответа, шаг 1 просто фантастический! Раньше я не был знаком с этим крючком и не ожидал такого изящного решения. Из любопытства я понимаю, что вы можете реализовать шаг 1, а не шаг 2. Это отправляет ссылки на часто задаваемые вопросы на соответствующий uri, но также сохраняет отдельные страницы… и мы просто никогда не ссылаемся на них через сайт. Это кажется разумным путем? Спасибо.

      • 0
    • @daxitude — лучше запретить поисковым системам индексировать страницу архива и разрешить им индексировать отдельные страницы. Две самые важные вещи для SEO — это страница, <title> и <h1>Heading</h1> вы получите только одну из них на странице архива, но вы получите по одной для отдельных страниц часто задаваемых вопросов. Я согласен с тем, что весь контент часто задаваемых вопросов лучше всего размещать на странице архива, но вы можете разместить весь контент на главной странице и на странице детализации для тех, кто этого хочет (включая поисковые системы), и это, безусловно, ничему не повредит; просто добавьте «Постоянную ссылку» рядом с вопросом часто задаваемых вопросов.

      • 0
    • @daxitude — Как вы думаете, почему я не реализовал № 2? Это цель кода, который следует за заголовком «2.) unset($wp_rewrite->extra_permastructs['faq']) », который, конечно же, я утверждаю, что вы не используете. 🙂

      • 0

Оставить ответ

You must login to add an answer.