En mi sitio, se deben aplicar varios filtros si el usuario está viendo la página de inicio estática. Según entiendo, is_front_page()
debe determinar si ese es realmente el caso.
Sin embargo, siempre que uso la función, encuentro que a veces devuelve true
(por ejemplo, posts_orderby
), pero principalmente devuelve false
(por ejemplo, pre_get_posts
, posts_fields
, posts_join
y posts_where
) . Sin embargo, independientemente del resultado, siempre recibo el siguiente aviso:
Intentando obtener una propiedad de no objeto en {mi_ruta} \ wp-includes \ query.php en la línea 4373
El método que contiene la línea infractora es WP_Query::is_front_page()
-
public function is_front_page() {
// most likely case
if ( 'posts' == get_option( 'show_on_front') && $this->is_home() )
return true;
/** The offending line */ elseif ( 'page' == get_option( 'show_on_front') && get_option( 'page_on_front' ) && $this->is_page( get_option( 'page_on_front' ) ) )
return true;
else
return false;
}
Para combatir este problema, he creado mi propia función, como se muestra a continuación, pero parece "sucio" haber tenido que hacerlo. Así que mi pregunta es: ¿hay una mejor manera de hacer esto?
function fgw_is_front_page($q){
if(!is_a($q, 'WP_Query'))
return false;
return (get_option('show_on_front') == 'page' && get_option('page_on_front') && $q->get('page_id') == get_option('page_on_front'));
}
Editar
Después de una investigación adicional, parece que la línea infractora es en realidad 4369 (wp-includes / querey.php) - $page_obj = $this->get_queried_object();
$page_obj
se está devolviendo como null
, lo que significa que la verificación de $q->is_front_page()
falla. Esto parece incorrecto y, a menos que alguien sea capaz de explicar cómo podría ser este el comportamiento esperado, buscaré abrir un ticket en Trac.
Actualizar
Ahora he enmendado la función anterior. El uso del segundo argumento pasado a todos los filtros que estoy usando (la instancia WP_Query), como lo menciona @birgire , me ha permitido eliminar el global.
Sin embargo, tomando el siguiente ejemplo, todavía recibo la notificación mencionada (y el resultado de false
) al verificar $q->is_front_page()
-
add_filter('posts_fields','fgw_index_posts_fields', 10, 2);
function fgw_index_posts_fields($fields, $q){
global $wpdb;
if(!is_admin() && is_main_query() && (is_home() || $q->is_front_page($q)))
$fields.= $wpdb->prepare(', %1$s.name as category_name', $wpdb->terms);
return $fields;
}
Reemplazar $q->is_front_page()
con fgw_is_front_page($q)
funciona, pero de nuevo se siente sucio tener que usar una solución personalizada cuando parece que ya existe una.