Melhor maneira de detectar se você está em uma página de POST ÚNICO


9

Portanto, isso pode parecer uma coisa muito servil, mas siga-me aqui.

Estou tentando adicionar alguma lógica através da pre_get_postsação. Este é o objeto WP_Query inteiro que me foi dado. (veja o final)

Coisas que considerei usar:

  • is_single() - muito amplo.
  • is_singular()- muito cedo para usar isso, pois get_queried_object()ainda não está definido.
  • $query->single propriedade - novamente muito ampla.
  • $query->get('post_type')- não definido, pois está usando a namepropriedade

é namerealmente o único indicador aqui?

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] => 
)

Respostas:


10

Eu tentei resolver isso antes para meus próprios propósitos. Tanto quanto eu posso dizer ...

  • post_typenão está realmente definido em nenhum lugar para o posttipo de postagem.
  • Para o pagetipo de postagem, apenas vejo a chave do tipo de postagem queried_object.
  • Para tipos de CPT, há uma post_typechave query_varse também dentro query.
  • Os menus de navegação parecem se comportar como outros CPTs a esse respeito.

Os dados são muito inconsistentes, mas se você eliminar páginas e CPTs, acredito que possa assumir o posttipo.

Edit: Código de trabalho 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. 
  } 
} 

Nós verificamos para, nenhum tipo pós is_singular (CPT tem post_typeem query_vars), e não uma página ou anexo.


E funciona dentro pre_get_posts(antes da execução da consulta)?
gmazzap

Gostaria de saber se is_page()está definido no pre_get_postsnível. Se for, e posso verificar se post_typenão está definido em query_vars, acho que é o melhor possível. Tão quebrado.
Eric Holmes

11
is_pageparece estar definido.
s_ha_dum

@s_ha_dum eu removi o comentário porque parece não funciona para CPT ...
gmazzap

2
Adicionando a solução de trabalho à sua resposta.
Eric Holmes

0

Não sei se isso 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 o tipo de post.


Ainda não. As postagens pré-obtenção acontecem antes que a $wp_query->postsvariável seja realmente preenchida. Obrigado embora!
Eric Holmes

0

Após alguns testes, infelizmente, é impossível obter o tipo de cpt post dentro do pre_get_postsgancho. Somente is_pagetrabalhos, mas não o tipo de postagem padrão nem o cpt, podem ser recuperados lá.

Se você tiver apenas página e postagem (sem cpt), uma verificação is_single()com truecomo resposta significa que o tipo de postagem é postagem, pois retorna falso para as páginas.

Se você também possui CPTs, receio que você precise executar uma consulta adicional . O mais simples que posso pensar é obter a post_typecoluna onde o status da postagem é publicado e post_name é o necessário (pulando as revisões):

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); 

Se você deseja verificar um tipo de postagem específico, pode escrever uma tag condicional personalizada que apenas conte as linhas com um determinado post_type e o nome fornecido:

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;
}

Claro que isso é necessário pre_get_post, em qualquer gancho posterior você pode usar get_post_type()...


11
Definitivamente, isso funcionaria, mas veja a resposta aceita, é uma condicional muito menos complicada, sem uma consulta adicional ao banco de dados. :)
Eric Holmes

Sim. Entendo que você queria saber exatamente qual tipo de postagem você está mostrando. Não apenas se você estiver em uma única visualização de postagem. @EricHolmes
gmazzap

-1

É isso que estou usando, embora seja especializado em minha própria estrutura de diretórios.

/**
 * 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
                }
            }
        }
    }
}

A milhagem pode variar. Os bits strpos nos quais eu verifico que os arquivos estão em um diretório, mas não em outro, precisariam ser modificados para sua compilação e provavelmente poderiam ser re-fatorados com mais eficiência. Eles existem para cortar resultados acima e abaixo de uma determinada estrutura de diretórios.

Executar thelist () no rodapé fornecerá uma lista numerada de todos os arquivos de modelo .php usados ​​para compilar a exibição atual. É especialmente útil ao lidar com um tema filho que está renderizando um componente misterioso.


Parece exagero. Idéia legal embora?
9133 Eric Holmes

Não existem muitas maneiras boas de determinar quais modelos direcionam uma página, além de analisá-los. Eu acho que se você está procurando algo tão simples quanto uma única página versus, sim, é um exagero. Tente executar a função por algum tempo, menos os condicionais de ignorar extra, e você verá por que eu uso isso. Há uma tonelada de arquivos que direcionam uma página WP e pode ser realmente útil saber o que são. Mesmo isso não identifica funções conectadas.
Ideias imperativas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.