Detectar o tipo de página por url (Arquivo, único, página, autor,…)

4

Atualização: versão realmente curta

Como faço para obter $wp_query para um determinado URL, que pode ser qualquer coisa (único, arquivo de página, tipo de postagem personalizada, autor, ano, mês, ...)?

TL; DR

Eu preciso de uma função que possa retornar essa informação (como um ponto de extremidade da API REST) com base em um determinado URL:

request:'category/Uncategorized'

response:
{
type:"category",
category_name:"uncategorized"
}

request:'books/harry-potter'

response:
{
type:"single",
post_type:"books",
name:"harry-potter"
}

Assim, meu aplicativo saberá qual modelo usar e que tipo de dados esperar.

A longa história

Estou escrevendo um tema do Wordpress com o ReactJS, Eu tenho minhas rotas (conhecidas) configuradas com o roteador-reator, Mas preciso detectar que tipo de conteúdo devo esperar se o URL solicitado não for conhecido no momento.

Caso o URL seja GET ed por navegador (não como chamada ajax), eu tenho meu arquivo de modelo wordpress injetando todos os dados necessários na página (com $wp_query->query_vars ), então com uma verificação de URL simples eu sei se os dados são para o URL atual e, se forem, eu os uso.

O problema surge quando o usuário navega e as próximas páginas são carregadas chamando os endpoints da respectiva API.

Torna-se pior se eu quiser dar suporte a todas as estruturas permalink. Então, eu acho que definitivamente precisarei resolver URLs no back-end para verificar todas as possibilidades.

Portanto, eu tenho um detector js que tenta ver se ele pode detectar que tipo de recurso é solicitado (verificando se os parâmetros de URL contêm category , author , ...) e fazer a chamada da API, no caso não poderia, então, chamar o ponto de extremidade do detector no qual preciso informar ao meu aplicativo o que deve ser renderizado nesta página.

Por exemplo, atualmente registrei um tipo de postagem personalizado chamado "Equipe", então já sei como lidar com mywebsite.com/team & mywebsite.com/team/:slug , mas no caso do usuário registrar um novo tipo de postagem, digamos "Livros", meu aplicativo não terá idéia se os livros são um slug de uma página, um slug de postagem ou um nome de arquivo de tipo de postagem.

    
por Ramtin Gh 18.01.2017 / 17:21

1 resposta

0

Você tem rewrite_rules na tabela wp_options. A partir daí, seu aplicativo pode ter uma idéia do que o wordpress vai reescrever no futuro e como ele será reescrito após index.php. Você pode usar o regex no JS com dados wp_options para personalizar a resposta do aplicativo.

UPDATE

Aqui está o bloco de código necessário para determinar a natureza da página / postagem atual para usar dinamicamente um modelo diferente com base no retorno -

if(!function_exists('get_nature_of_post')):
function get_nature_of_post() { 
  global $wp_query;
  $wpq = json_decode(json_encode($wp_query),true);
  $check = array("is_single","is_page","is_archive","is_author","is_category","is_tax","is_search","is_home","is_404","is_post_type_archive");

  $page_identifiers = array_intersect_key($wpq,array_flip($check));
  $page_identifiers = array_filter($page_identifiers);
  $keys = array_flip(array_keys($page_identifiers));

  $case['home'] = array_flip(array('is_home'));
  $case['search'] = array_flip(array('is_search'));
  $case['archive'] = array_flip(array('is_archive','is_post_type_archive'));
  $case['taxonomy'] = array_flip(array('is_archive','is_tax'));
  $case['single'] = array_flip(array('is_single'));
  $case['page'] = array_flip(array('is_page'));

  $home = !array_diff_key($case['home'], $keys) && !array_diff_key($keys, $case['home']);
  $archive = !array_diff_key($case['archive'], $keys) && !array_diff_key($keys, $case['archive']);
  $search = !array_diff_key($case['search'], $keys) && !array_diff_key($keys, $case['search']);
  // var_dump($archive);
  $taxonomy = !array_diff_key($case['taxonomy'], $keys) && !array_diff_key($keys, $case['taxonomy']);
  // var_dump($taxonomy);
  $single = !array_diff_key($case['single'], $keys) && !array_diff_key($keys, $case['single']);
  // var_dump($single);
  $page = !array_diff_key($case['page'], $keys) && !array_diff_key($keys, $case['page']);
  // var_dump($page);

  switch (!false) {
    case $archive: return 'archive'; break;
    case $taxonomy: return 'taxonomy'; break;
    case $single: return 'single'; break;
    case $page: return 'page'; break;
    case $search: return 'search'; break;
    case $home: return 'home'; break;
    default: return false;
  }
}
endif;
    
por Vishal Kumar Sahu 18.01.2017 / 17:49