La mejor manera de detectar si estás en una página de POSTE ÚNICO

9

Así que esto puede parecer algo bastante servil, pero sígueme aquí.

Estoy tratando de agregar algo de lógica a través de la pre_get_postsacción. Este es todo el objeto WP_Query que me dieron. (ver el final)

Cosas que he considerado usar:

  • is_single() - demasiado amplia.
  • is_singular()- demasiado pronto para usar esto, ya get_queried_object()que aún no está configurado.
  • $query->single propiedad - de nuevo demasiado amplia.
  • $query->get('post_type')- no establecido, ya que está usando la namepropiedad

es namerealmente el único indicador aquí?

WP_Query Object
(
    [query] => Array
        (
            [page] => 
            [name] => abcs-of-mental-health
        )

    [query_vars] => Array
        (
            [page] => 
            [name] => abcs-of-mental-health
            [error] => 
            [m] => 0
            [p] => 0
            [post_parent] => 
            [subpost] => 
            [subpost_id] => 
            [attachment] => 
            [attachment_id] => 0
            [static] => 
            [pagename] => 
            [page_id] => 0
            [second] => 
            [minute] => 
            [hour] => 
            [day] => 0
            [monthnum] => 0
            [year] => 0
            [w] => 0
            [category_name] => 
            [tag] => 
            [cat] => 
            [tag_id] => 
            [author_name] => 
            [feed] => 
            [tb] => 
            [paged] => 0
            [comments_popup] => 
            [meta_key] => 
            [meta_value] => 
            [preview] => 
            [s] => 
            [sentence] => 
            [fields] => 
            [menu_order] => 
            [category__in] => Array
                (
                )

            [category__not_in] => Array
                (
                )

            [category__and] => Array
                (
                )

            [post__in] => Array
                (
                )

            [post__not_in] => Array
                (
                )

            [tag__in] => Array
                (
                )

            [tag__not_in] => Array
                (
                )

            [tag__and] => Array
                (
                )

            [tag_slug__in] => Array
                (
                )

            [tag_slug__and] => Array
                (
                )

            [post_parent__in] => Array
                (
                )

            [post_parent__not_in] => Array
                (
                )

        )

    [tax_query] => 
    [meta_query] => 
    [queried_object] => 
    [queried_object_id] => 0
    [post_count] => 0
    [current_post] => -1
    [in_the_loop] => 
    [comment_count] => 0
    [current_comment] => -1
    [found_posts] => 0
    [max_num_pages] => 0
    [max_num_comment_pages] => 0
    [is_single] => 1
    [is_preview] => 
    [is_page] => 
    [is_archive] => 
    [is_date] => 
    [is_year] => 
    [is_month] => 
    [is_day] => 
    [is_time] => 
    [is_author] => 
    [is_category] => 
    [is_tag] => 
    [is_tax] => 
    [is_search] => 
    [is_feed] => 
    [is_comment_feed] => 
    [is_trackback] => 
    [is_home] => 
    [is_404] => 
    [is_comments_popup] => 
    [is_paged] => 
    [is_admin] => 
    [is_attachment] => 
    [is_singular] => 1
    [is_robots] => 
    [is_posts_page] => 
    [is_post_type_archive] => 
    [query_vars_hash] => f473ebf7f725c2627dc5fd9a1429f626
    [query_vars_changed] => 
    [thumbnails_cached] => 
)
Eric Holmes
fuente

Respuestas:

10

He tratado de resolver esto antes para mis propios fines. Por lo que yo puedo decir ...

  • post_typeen realidad no está configurado en ningún lugar para el posttipo de publicación.
  • Para el pagetipo de publicación, solo veo la clave de tipo de publicación queried_object.
  • Para los tipos de CPT hay una post_typeclave en query_varsy también en query.
  • Los menús de navegación parecen comportarse como otros CPT a este respecto.

Los datos son muy inconsistentes, pero si elimina páginas y CPT, creo que puede asumir el posttipo.

Editar: Código de trabajo de @EricHolmes:

add_action( 'pre_get_posts', 'something_for_single_posts_only' ) ; 
function something_for_single_posts_only( $query ) { 
  if( $query->is_main_query() 
    && $query->is_singular() 
    && ! $query->get( 'post_type' ) 
    && ! $query->is_page() 
    && ! $query->is_attachment() 
  ) { 
      // do something for single posts only. 
  } 
} 

Comprobamos si, sin ningún tipo de post is_singular (CPT tienen post_typeen query_vars), no una página o archivo adjunto.

s_ha_dum
fuente
¿Y funciona dentro pre_get_posts(antes de ejecutar la consulta)?
gmazzap
Me pregunto si is_page()se establece en el pre_get_postsnivel. Si es así, y puedo verificar que post_typeno esté configurado en query_vars, ¿supongo que es tan bueno como parece? Tan roto
Eric Holmes
1
is_pageparece estar establecido.
s_ha_dum
@s_ha_dum Eliminé el comentario porque parece que no funciona para CPT ...
gmazzap
2
Agregar la solución de trabajo a su respuesta.
Eric Holmes
0

No sé si esto será útil:

function hwl_home_pagesize( $query ) {
    global $wp_query;
    if (is_main_query() && count($wp_query->posts) < 2) {

    }

}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

Use $ wp_query-> posts (array) para verificar el tipo de publicación.

ferenyl
fuente
Aún no. Las publicaciones previas se llevan a cabo antes de que la $wp_query->postsvariable se complete realmente. Gracias sin embargo!
Eric Holmes
0

Después de algunas pruebas, veo que desafortunadamente es imposible obtener el tipo de publicación de cpt dentro del pre_get_postsgancho. Solo is_pagefunciona pero no se puede recuperar el tipo de publicación estándar ni el cpt.

Si sólo dispone de página y posterior (sin CPT) un control de is_single()la truecomo medios de respuesta que tipo de entrada es posterior, porque return false para las páginas.

Si también tiene CPT, me temo que debe realizar una consulta adicional . Lo más simple que puedo pensar es simplemente obtener la post_typecolumna donde el estado de la publicación es publicar y post_name es el requerido (omitiendo revisiones):

function test( $q ) {
  if ( is_single() ) {
    global $wpdb;
    $type = $wpdb->get_var( $wpdb->prepare(
      "SELECT post_type FROM $wpdb->posts WHERE post_name = %s AND post_status = 'publish' AND post_type <> 'revision'",
      $q->query['name']
    ) );
    var_dump($type);
  }
}
add_action( 'pre_get_posts', 'test', 1); 

Si desea verificar un tipo de publicación específico, puede escribir una etiqueta condicional personalizada que solo cuente las filas con un post_type dado y el nombre dado:

function is_single_post_type( $type = 'post' ) {
  if ( is_single() ) {
    global $wpdb, $wp_query;
    $is = $wpdb->get_var( $wpdb->prepare(
      "SELECT count(ID) FROM $wpdb->posts WHERE post_name = %s AND post_status = 'publish' AND post_type = %s",
      $wp_query->query['name'], $type
    ) );
    return $is > 0;
  }
  return false;
}

Por supuesto, esto es necesario pre_get_post, en cualquier gancho posterior puede usar get_post_type()...

gmazzap
fuente
1
Esto definitivamente funcionaría, pero mira la respuesta aceptada, es un condicional mucho menos complicado, sin una consulta adicional a la base de datos. :)
Eric Holmes
Si. Entiendo que querías saber exactamente qué tipo de publicación estás mostrando. No solo si estás en una sola vista de publicación. @EricHolmes
gmazzap
-1

Esto es lo que estoy usando, aunque está especializado para mi propia estructura de directorios.

/**
 * Function to list all templates used in a page
 * @author Imperative Ideas with thanks to Rarst
 * @uri http://wordpress.stackexchange.com/a/89005
 */

function thelist() {
    $included_files = get_included_files();
    $stylesheet_dir = str_replace( '\\', '/', get_stylesheet_directory() );
    $template_dir   = str_replace( '\\', '/', get_template_directory() );
    echo '<h3 class="debugtitle">Theme file templates used in this page</h3>';
    foreach ( $included_files as $key => $path ) {

        $path   = str_replace( '\\', '/', $path );

        if ( false === strpos( $path, $stylesheet_dir ) && false === strpos( $path, $template_dir ) )
            unset( $included_files[$key] );

        if(!strpos($path, '/wp-content/themes/') === false) { // Files IN this directory
            if(strpos($path, '/library/') === false) { // Ignore this subdir
                if(strpos($path, '/hybrid-core/') === false) { // Ignore this subdir
                    echo $key." = ". $path."</br>"; // Finally, output the list
                }
            }
        }
    }
}

El kilometraje puede variar. Los bits strpos donde verifico que los archivos están en un directorio pero no en otro necesitarían ser modificados para su compilación y probablemente podrían ser re-factorizados de manera más eficiente. Existen para recortar resultados por encima y por debajo de cierta estructura de directorios.

Ejecutar thelist () en el pie de página le dará una lista numerada de cada archivo de plantilla .php utilizado para compilar la vista actual. Es especialmente útil cuando se trata de un tema secundario que representa un componente misterioso.

Ideas imperativas
fuente
Parece excesivo. Buena idea sin embargo?
Eric Holmes
No hay muchas maneras buenas de determinar qué plantillas están impulsando una página, aparte de analizarlas. Supongo que si estás buscando algo tan simple como una sola página vs, sí, es exagerado. Sin embargo, intente ejecutar la función algún tiempo, menos los condicionales de ignorar adicionales, y verá por qué lo uso. Hay una TONELADA de archivos que entran en la conducción de una página WP y puede ser realmente útil saber cuáles son todos. Sin embargo, incluso esto no identificará las funciones enganchadas.
Ideas imperativas