Detectar el tipo de página por url (Archivo, único, página, autor, ...)

4

Actualización: versión realmente corta

¿Cómo obtengo $wp_query para una url determinada que puede ser cualquier cosa (archivo único, archivo de página, tipo de publicación personalizada, autor, año, mes, ...)?

TL; DR

Necesito una función que pueda devolver esta información (como un punto final de REST API) basada en una url determinada:

request:'category/Uncategorized'

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

request:'books/harry-potter'

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

Entonces, mi aplicación sabrá qué plantilla usar y qué tipo de datos esperar.

La larga historia

Estoy escribiendo un tema de Wordpress con ReactJS, Tengo mis rutas (conocidas) configuradas con react-router, Pero necesito detectar qué tipo de contenido debo esperar si no se conoce la url solicitada en este momento.

En caso de que la url sea OBTENIDA por el navegador (no como una llamada ajax), tengo mi archivo de plantilla de wordpress inyectar todos los datos requeridos en la página (con $wp_query->query_vars ), así que con una simple verificación de url sabré si los datos están destinados a la URL actual y, de ser así, los utilizaré.

El problema surge cuando el usuario navega a través de las siguientes páginas y las carga al llamar a los respectivos puntos finales de la API.

Se vuelve peor si quiero admitir todas las estructuras de enlace permanente, por lo que creo que definitivamente tendré que resolver las URL en el back-end para verificar todas las posibilidades.

Tengo un detector js que intenta ver si puede detectar qué tipo de recurso se solicita (verificando si los parámetros de url contienen category , author , ...) y hago la llamada a la API, en caso de que no podría, luego llamará al punto final del detector en el que necesito decirle a mi aplicación lo que se debe representar en esta página.

Por ejemplo, actualmente he registrado un tipo de publicación personalizada llamada "Equipo", así que ya sé cómo manejar mywebsite.com/team & mywebsite.com/team/:slug , pero en caso de que el usuario registre un nuevo tipo de publicación, diga "Libros", mi aplicación no tendrá idea de si los libros son la bala de una página, la bala de la publicación o el nombre de archivo del tipo de publicación.

    
pregunta Ramtin Gh 18.01.2017 - 17:21

1 respuesta

0

Tienes rewrite_rules en la tabla wp_options. A partir de ahí, su aplicación puede tener una idea de lo que WordPress va a reescribir en el futuro y cómo se reescribirá después de index.php Puede usar expresiones regulares en JS con datos de wp_options para personalizar la respuesta de su aplicación.

ACTUALIZACIÓN

Aquí está el bloque de código que necesitaba para determinar la naturaleza de la página / publicación actual para usar dinámicamente una plantilla diferente basada en el 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;
    
respondido por el Vishal Kumar Sahu 18.01.2017 - 17:49

Lea otras preguntas en las etiquetas