Tipo de postagem personalizada, sem necessidade de visualização única, além de reescritas de link permanente que incluem hash no URI

8

Estamos usando CPTs para gerenciar uma página de perguntas frequentes em um site, onde a pergunta é o título da postagem e a resposta é o conteúdo da postagem. Há uma página principal para as perguntas frequentes que mostra todas as postagens (página de arquivo das perguntas frequentes). Com essa estrutura, não precisamos realmente da visualização única de nenhuma FAQ e, de fato, gostaríamos de omitir a estrutura da site. Para abordar os links permanentes, gostaríamos de defini-los como exemplo.com/faq/#uniqueIdentifier, pensando em usar o #uniqueIdentifier para corresponder a uma div na página do arquivo que contém a resposta e chamar a atenção para ela em alguns moda. O uniqueIdentifier pode ser ID da postagem, título da pergunta mais frequente, dados de uma meta box ou qualquer outra coisa.

Então, deixe-me recapitular o que precisamos para realizar:

(1) reescreva os links permanentes das perguntas frequentes como / faq / # something e

(2) verifique se todos os / faq / links direcionam para o modelo de arquivo e não são únicos

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

Obrigado.

daxitude
fonte

Respostas:

12

Olá @daxitude:

Deixe-me primeiro sugerir que você reconsidere. Se você não possui páginas de perguntas frequentes individuais para cada pergunta frequente:

  1. Você reduz sua superfície para otimizar o mecanismo de pesquisa e reduz o tráfego potencial que pode receber, e

  2. Você impossibilita que alguém compartilhe uma FAQ específica com um amigo por e-mail e / ou compartilhe com sua rede no Facebook, Twitter etc. (Como usuário, eu sempre fico frustrado com os desenvolvedores de sites que não permitem que eu tenha um URL direto para um item e forçar-me a vincular à página que lista todos os itens.)

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

1.) Use o 'post_type_link'gancho

Use o 'post_type_link'gancho para modificar o URL como no exemplo a seguir * (suponho que seu tipo de postagem personalizado seja 'faq'). Adicione o seguinte ao functions.phparquivo 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 é necessário para fazer o que você deseja. Use um 'init'gancho para unset($wp_rewrite->extra_permastructs['faq']). Ele remove a regra de reescrita que é register_post_type()adicionada. Estou incluindo uma chamada para register_post_type()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 'init'gancho é uma prática muito ruim e só deve ser feita uma vez, então eu implementei um plug-in completo e independente chamado FAQ_Post_Typepara fazer o certo. Este plug-in adiciona um tipo de postagem FAQ com as regras de URL que você deseja e usa a register_activation_hook()para liberar as regras de reescrita; a ativação é obviamente uma das poucas coisas que requer código de plug-in em vez de código que pode ser executado no functions.phparquivo de um tema .

Aqui está o código para o FAQ_Post_Typeplugin; sinta-se à vontade para modificar para 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 'init'de 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ê descobrir que isso não soluciona.

MikeSchinkel
fonte
Olá @MikeSchinkel. UAU! Você certamente é um indivíduo útil. Concordo plenamente com os seus pontos de reconsideração # 1 e # 2, mas acredito que abordamos principalmente essas preocupações. Para o número 1 - uma vez que estamos exibindo a pergunta e resposta completas na página do arquivo cpt, uma única visualização para cada faq não seria um conteúdo duplicado e, portanto, não necessariamente favorável ao SEO? Além disso, sentimos que uma página inteira para apenas uma pergunta de faq é um pouco difícil e preferimos entregar às pessoas o conteúdo mais rapidamente do que ter que clicar em mais links para chegar lá.
daxitude 22/03
(aparentemente existem limites de caracteres para comentários e eu sou um indivíduo detalhado!) Para o item 2 - tudo depois do hash no uri é correspondido a um div na página que contém a resposta. todas as outras respostas ficam ocultas no carregamento da página e a resposta correspondente é aberta. Dessa maneira, preservamos totalmente a capacidade de compartilhar e salvar links ... desde que não fiquemos instáveis ​​e alteremos essa estrutura por algum motivo bobo.
daxitude 22/03
Quanto à sua resposta, o passo 1 é fantástico! Eu não estava familiarizado com esse gancho e não havia antecipado uma solução tão elegante. Como curiosidade, eu percebo que você pode implementar a etapa 1 e não a etapa 2. Isso envia links de perguntas frequentes para o uri apropriado, mas também preserva as páginas únicas ... e simplesmente nunca os vinculamos através do site. Parece um caminho razoável a seguir? Obrigado.
daxitude
@daxitude - É melhor não permitir a indexação dos mecanismos de pesquisa em uma página de arquivo e permitir que eles indexem as páginas individuais. As duas coisas mais importantes para SEO são a página <title>e <h1>Heading</h1>você receberá apenas uma delas em uma página de arquivo, mas cada uma para as páginas individuais das Perguntas frequentes. Concordo que todo o conteúdo das perguntas frequentes é o melhor na página de arquivo, mas você pode fornecer todo o conteúdo da página principal e uma página detalhada para aqueles que o desejam (que inclui mecanismos de pesquisa) , e certamente não prejudica nada; basta adicionar um "link permanente" próximo à pergunta da FAQ.
MikeSchinkel
@daxitude - Por que você acha que eu não implementei o # 2? Esse é o objetivo do código que segue o cabeçalho "2.) unset($wp_rewrite->extra_permastructs['faq'])" que, é claro, estou argumentando que você não usa. :)
MikeSchinkel