¿El mal funcionamiento de is_front_page ()?

8

Tengo un problema bastante básico del que me sorprende que WP no tenga una solución nativa (a menos que esté pasando por alto algo, con suerte).

Tengo un sitio WP con static pageset como portada en la configuración de lectura. En un código de complemento, estoy tratando de determinar si WP está mostrando la página principal y agregar una clase a la $classesmatriz si es así. Estoy usando el siguiente código para lograrlo

add_filter('body_class', function($classes){
    if(is_front_page() || is_home()){
        $classes[] = 'home-page';
    }
    return $classes;
});  

Estoy usando ambos is_front_page()y is_home()en caso de que la configuración de la página principal cambie de página estática a diseño de blog en el futuro.

El problema que encuentro es que este código agrega home-pageclase bodyincluso en la wp-signup.phppágina.

Inspeccionar el código revela que las is_front_page()llamadas WP_Query::is_front_page(), que esencialmente devuelve resultados de WP_Query::is_page(get_option('page_on_front')). Entonces, la raíz del problema es que wp-signup.phpcalifica como la página (id) devuelta por get_option('page_on_front')( que devuelve IDla página estática configurada como portada en configuración> lectura ).

WP_Query::is_page()utiliza WP_Query::get_queried_object()internamente para decidir si la página actual es la página presente en los argumentos del método. En el wp-signup.phpcaso, el código que establece el objeto consultado actual es el siguiente

/*...other code... */
elseif ( $this->is_singular && ! empty( $this->post ) ) {
    $this->queried_object = $this->post;
    $this->queried_object_id = (int) $this->post->ID;
}
/*...other code... */  

Esto muestra que wordpress, por alguna razón, consulta la página principal para mostrar wp-signup.phpy plantea las siguientes preguntas.

  • ¿Por qué is_front_page()está devolviendo resultados incorrectos?
  • AFAIK wp-signup.phpnunca se puede establecer como página de inicio utilizando la configuración de administrador de Wordpress, entonces ¿por qué el código de Wordpress no se rescata simplemente al marcar PHP_SELFo REQUEST_URI?
  • ¿Por qué WP_Query tiene la página de inicio actual $this->posten este momento?

He descartado el problema de los complementos eliminando el directorio de complementos (y complementos mu). Todavía califica wp-signup.phpcomo portada donde no lo hace para ninguna otra página.

Cualquier ayuda con respecto a este tema será muy apreciada.

Actualización
Estoy usando WP verison 4.2.4 y es una configuración multisitio.

Gracias.

Ejaz
fuente
¿Definitivamente estás usando la última versión de WordPress? ¿Y es esta una configuración multisitio?
TheDeadMedic
Estoy usando la versión 4.2.4 y sí, es una configuración multisitio. Agregado a la pregunta.
Ejaz
Esto es raro. Todo lo que puedo sugerir por ahora es usar la siguiente ifcondición:( ! isset( $GLOBALS['pagenow'] ) || $GLOBALS['pagenow'] !== 'wp-signup.php' ) && ( is_front_page() || is_home() )
TheDeadMedic
Gracias por la sugerencia @TheDeadMedic, eso lo hará. Entonces, ¿el problema es un error de WP?
Ejaz
De hecho, he oído hablar de esto antes en WPMU. Intenta desactivar tu tema y reactivarlo.
Matt van Andel

Respuestas:

1

Solo especulaciones, pero me pregunto si te encuentras con un problema de función anónima. Las funciones anónimas están permitidas en WP, y por lo general funcionan bien (suponiendo que PHP actualizado), pero, si busca, encontrará informes de sospechas de errores o al menos de un comportamiento inesperado.

Por lo demás, no estoy seguro de haber visto alguna vez una función anónima utilizada como ejemplo en el Codex de WordPress, y no recuerdo haber visto alguna vez una en el tema y el código del complemento. Por supuesto, no he estado atento a las funciones anon, pero, aun así, creo que la función anterior casi siempre se escribirá en alguna versión del formato de dos partes más familiar, es decir:

add_filter('body_class', 'ejay_add_home_class');

function ejay_add_home_class($classes) {

    if (is_front_page() || is_home()) {

        $classes[] = 'home-page';
    }

    return $classes;
} 

Entonces, como experimento, probaría el formato más "convencional" anterior, y también lo probaría con una prioridad designada superior o inferior a 10. Si adjunto múltiples funciones anónimas al mismo filtro, les daría diferentes prioridades, o use una matriz (ejemplo aquí: http://snippets.khromov.se/adding-multiple-actions-and-filters-using-anonymous-functions-in-wordpress/ ), o escriba cada uno de ellos como dos- Parters, también.

En verdad, creo que la forma un poco más larga de 2 partes es más fácil de leer, rastrear y ajustar de todos modos.

CK MacLeod
fuente
-4

WordPress utiliza diferentes plantillas para páginas en su sitio. Si tiene una plantilla page.php en su tema, se usará para mostrar sus páginas. Si tiene un single.php, se usará para mostrar sus publicaciones individuales. index.php o home.php mostraría su página de inicio, o page.php si tiene una determinada página seleccionada como página de inicio a través de las opciones de lectura.

Entonces, su declaración condicional:

<?php if (is_front_page()){ ?>
<p>Home Page</p>
<?php else { ?>
<p>Not Home Page</p>
<?php } ?>
?>

Solo sería realmente útil en el archivo header.php o footer.php- o en page.php si tiene una determinada página seleccionada en las opciones de lectura.

jim.duck
fuente
Gracias por la respuesta, pero no puedo ver cómo esto afecta los valores devueltos por las funciones mencionadas anteriormente.
Ejaz
55
¡¡¡¡DEJA DE MANDAR SPAM!!!! . Sus enlaces son basura a su propio sitio web. Tus próximas publicaciones se marcarán como spam. Gracias
Pieter Goosen
Esto tampoco responde a la pregunta en cuestión
Pieter Goosen el