Tipo de postagem personalizado, sem necessidade de visualização única, além de desejar reescrever links permeáveis que incluam hash no URI

8

Estamos usando CPTs para gerenciar uma página de perguntas frequentes em um site, em que a pergunta é o título da postagem e a resposta é o conteúdo da postagem. Existe uma página principal para as FAQs que mostra todas as postagens (página do arquivo de FAQ). Com essa estrutura, realmente não precisamos da visualização única de nenhuma FAQ e, na verdade, gostaríamos de omiti-la na estrutura do site. Para endereçar permalinks, gostaríamos de defini-los como algo como example.com/faq/#uniqueIdentifier, pensando que usaremos o #uniqueIdentifier para corresponder a um div na página de arquivo que contém a resposta e chamar a atenção para isso em alguns moda. O uniqueIdentifier pode ser post ID, faq question title, dados de uma meta box ou outra coisa.

Então deixe-me recapitular o que preciso que precisamos realizar:

(1) reescreva os links permanentes de faq para ser / faq / # something e

(2) verifique se todos os / faq / links encaminham para o modelo de arquivo e não para o único

Sou principalmente um noob, mas muito bom em me atrapalhar com as coisas. Nunca tentei reescrever, por isso apreciaria alguma direção específica sobre isso.

Obrigado.

    
por daxitude 22.03.2011 / 22:29

1 resposta

12

Oi @daxitude:

Primeiramente, sugiro que você reconsidere. Se você não tiver páginas de perguntas frequentes individuais para cada FAQ:

  1. Você reduz a sua superfície para otimização do mecanismo de pesquisa e reduz o tráfego potencial que pode receber e

  2. Você impossibilita que alguém compartilhe perguntas frequentes específicas com um amigo por e-mail e / ou compartilhe com sua rede no Facebook, Twitter etc. (como usuário Estou sempre frustrado por desenvolvedores de sites que me impedem de ter um URL direto para um item e, em vez disso, me forçam a vincular à página que lista todos os itens.

No entanto, se você ainda quiser fazer isso, faça duas coisas:

1.) Use o gancho 'post_type_link'

Use o gancho 'post_type_link' para modificar o URL, como no exemplo a seguir * (suponho que seu tipo de postagem personalizado seja 'faq' ). Adicione o seguinte ao arquivo functions.php do seu tema:

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

Este é um hack , mas é um hack obrigatório para fazer o que você quer. Use um gancho 'init' para unset($wp_rewrite->extra_permastructs['faq']) . Remove a regra de reescrita que register_post_type() adiciona. Estou incluindo uma chamada para register_post_type() , para que eu possa fornecer um exemplo completo para você e outras pessoas:

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

É sobre isso.

É claro que o uso acima de $wp_rewrite->flush_rules() em um gancho 'init' é prática muito ruim e realmente só deve ser feito uma vez, então eu implementei um plugin completo e auto-suficiente chamado FAQ_Post_Type para fazer isso direito. Este plugin adiciona um tipo de post de FAQ com as regras de URL que você quer e usa um register_activation_hook() para liberar as regras de reescrita; ativação sendo obviamente uma das poucas coisas que requerem código de plug-in em vez de código que pode ser executado no arquivo functions.php do tema.

Aqui está o código para o FAQ_Post_Type plugin; sinta-se à vontade para modificar suas necessidades:

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

Você também pode manter as regras de liberação dentro do 'init' usando uma verificação de um valor de opção, se preferir:

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

Sua escolha.

De qualquer forma, deixe-me saber se há casos de uso que você descobre que isso não resolve.

    
por MikeSchinkel 22.03.2011 / 23:43