PHP Notice: Trying to get property ‘post_type’ of non-object usando o hook ‘pre_get_posts’

As funções adicionadas no hook ‘pre_get_posts’ são disparadas depois da criação da variável $query, mas antes desse atual query rodar efetivamente. E isso é útil para muitos cenários, como alterar algum parâmetro dessa query e para isso usamos as funções condicionais do WordPress para determinar quando executar determinada alteração.

E um problema recorrente ao usar esse hook com condicionais, como is_singular(‘cpt_name’) é o retorno desse ‘PHP Notice: Trying to get property ‘post_type’ of non-object’.

E isso acontece porque nesse momento, o objeto que estamos verificando ainda não possui a propriedade ‘post_type’ definida. Para corrigir isso e verificar se a página atual é uma single de determinado cpt, podemos fazer da seguinte forma:

function dev_change_single_cpt($query) {

    if ($query->is_singular() && $query->get('post_type') === 'cpt_name') {

        ...

    }

}

add_action('pre_get_posts', 'dev_change_single_cpt');