¿Cómo obtener el tipo de entrada personalizada desde una página de archivo?
En mi sitio web tengo tres tipos de entradas personalizadas: scripts, escenas y plugins. Cuando se visita la página de archivo de un solo tipo de entrada (es decir, yendo a mistitio.com/plugins) se ven correctamente todas las entradas de ese tipo.
En archive.php, ¿cómo puedo averiguar qué tipo de entrada personalizada está viendo el usuario en este momento?
Intenté lo siguiente:
<?php
global $post;
$postTypeLabels = get_post_type_labels(get_post_type_object($post));
echo var_export($postTypeLabels);
?>
Pero estoy obteniendo esto:
Post name is stdClass::__set_state(
array( 'name' => 'Posts',
'singular_name' => 'Post',
'add_new' => 'Add New',
'add_new_item' => 'Add New Post',
'edit_item' => 'Edit Post',
'new_item' => 'New Post',
'view_item' => 'View Post',
'search_items' => 'Search Posts',
'not_found' => 'No posts found.',
'not_found_in_trash' => 'No posts found in Trash.',
'parent_item_colon' => NULL,
'all_items' => 'All Posts',
'menu_name' => 'Posts',
'name_admin_bar' => NULL,
)
)
Supongo que, como estoy en una página de archivo, la variable $post no es correcta.
P.D. Sé que puedo crear archive-plugins.php para el archivo de plugins. Desafortunadamente, he instalado un tema que, hasta donde sé, impide hacer eso. Así que esta no es una opción.
Existen varias formas de hacer esto. Coloca:
var_dump($wp_query->query,get_queried_object()); die;
En tu archivo archive.php
y deberías ver dos de esas formas.
$wp_query->query
tendrá un componente post_type
para tipos de entrada personalizados. Eso no estará presente para tipos de entrada post
. get_queried_object
devolverá bastante información para tipos de entrada personalizados pero null para el tipo de entrada post
.
También existen algunas etiquetas de plantilla relacionadas que podrían ayudar. is_post_type_archive
viene a la mente.
Entre estas opciones, deberías tener la información que necesitas para construir la lógica que requieras. No está claro en tu pregunta cuál es el resultado final esperado, así que no puedo escribir mucho al respecto.
Dado que mencionaste específicamente archive.php
, es en lo que he probado. Puedes necesitar código diferente para alguna otra plantilla, especialmente con get_queried_object
que devuelve información muy diferente dependiendo del contexto.

get_query_object() era lo que estaba buscando. Básicamente quería obtener el nombre del tipo de contenido personalizado, pero preferí mantener la pregunta más abierta para cualquier otra persona. Gracias.

Básicamente, esto es lo que hice para obtener el nombre del tipo de contenido personalizado en archive.php: $qObj = get_queried_object(); echo $qObj->labels->name;

Para cualquiera que pase por aquí: ten cuidado al usar get_queried_object()
. Si is_post_type_archive()
es verdadero pero también estás usando filtrado basado en taxonomías, el término de taxonomía tendrá prioridad. En este caso, get_queried_object()
devolverá un objeto de término de taxonomía en lugar de un objeto de tipo de contenido, incluso cuando is_post_type_archive()
sea verdadero.

Aquí está la función que necesitas:
/**
* Obtiene el nombre del tipo de post actual en un archivo (ej: post, page, product).
*
* @return String|Boolean El nombre del tipo de post del archivo o false si no está en una página de archivo.
*/
function get_archive_post_type() {
return is_archive() ? get_queried_object()->name : false;
}

Veo esto en algunos comentarios de la respuesta aceptada, pero quería dejar este punto claro para otros que lean rápidamente estas respuestas: El objeto global $wp_query
es más confiable para obtener el tipo de publicación del archivo. Específicamente desde $wp_query->query['post_type']
.
Puedes usar get_queried_object()
pero tiene advertencias. Principalmente si tienes otros parámetros de consulta como términos de taxonomía. En ese caso, get_queried_object()
devolverá un objeto WP_Term en lugar del tipo de publicación que probablemente estás buscando.
Así que si el archivo tiene una consulta limpia para un tipo de publicación, entonces get_queried_object()
funcionará. Pero para mayor confiabilidad usa el objeto global $wp_query
.
Aquí hay una función que puedes usar en tu tema para esto:
/*
* PROPÓSITO: Si hay cero resultados (u otros parámetros) en la consulta del archivo, get_post_type() no es confiable para saber cuál es el tipo de publicación del archivo. Esta función obtiene el tipo de publicación del objeto global $wp_query.
* PARÁMETROS: n/a
* RETORNA: boolean / string - el slug del tipo de publicación desde $wp_query, o false si no se encuentra.
* NOTAS:
*/
function jp_get_archive_post_type(){
$post_type = false;
global $wp_query;
if( isset($wp_query->query['post_type']) ){
$post_type = $wp_query->query['post_type'];
}
return $post_type;
}

¿Por qué no simplemente usar get_query_var('post_type')
?
https://developer.wordpress.org/reference/functions/get_query_var/

Intenta agregar un poco más de información en tus respuestas, esto es más bien un comentario.

Bueno, no hay más información. La pregunta es: En archive.php, ¿cómo puedo saber qué tipo de entrada personalizada está viendo el usuario en este momento?
Con get_query_var('post_type')
obtienes qué tipo de entrada personalizada está viendo el usuario en este momento

¡No hay otra opción mejor que crear una plantilla!
O incluir un archivo de plantilla cuando se accede al archivo de ese tipo de entrada personalizada (según su URL).
Consulta los siguientes enlaces para más información:
http://codex.wordpress.org/Function_Reference/load_template
wordpress - cargar una plantilla basada en la URI
http://www.mihaivalentin.com/wordpress-tutorial-load-the-template-you-want-with-template_redirect/
