Agregar contenido con <! - nextpage -> roto en 4.4

14

Actualizar 2016-01-21

Todas las pruebas actuales de mi parte se están realizando en nuevas instalaciones de 4.4.1 con la siguiente configuración: Plain permalinks Twentysixteen Theme No plugins activated

Si la publicación solo tiene 1 página (es decir <!--nextpage-->, no aparece en la publicación), las páginas adicionales se agregan con éxito (incluso si agrega varias páginas adicionales¹).

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

Si la publicación tiene más de 2 páginas , las páginas adicionales 404 y la redirección canónica a la página 1 de la publicación.

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

<!--nextpage-->

This is page 2

En el segundo caso $wp_query->queried_objectestá vacío una vez que llegue a las páginas adicionales. Tendrá que deshabilitar la redirección canónica para ver estoremove_filter('template_redirect', 'redirect_canonical');

Se han intentado las dos correcciones principales siguientes, por separado y juntas, sin cambios en el comportamiento: https://core.trac.wordpress.org/ticket/35344#comment:16

https://core.trac.wordpress.org/ticket/35344#comment:34

Para facilitar su uso, este es el código con el que estoy probando actualmente:

add_action('template_redirect', 'custom_content_one');
function custom_content_one() {
    global $post;
    $content = "\n<!--nextpage-->\nThis is the extra page v1";
    $post->post_content .= $content;
}

add_filter('content_pagination', 'custom_content_two', 10, 2);
function custom_content_two($pages, $post) {
    if ( in_the_loop() && 'post' === $post->post_type ) {
        $content = "This is the extra page v2";

        $pages[] = $content;
    }
    return $pages;
}

add_action('the_post', 'custom_content_three');
function custom_content_three() {
    global $multipage, $numpages, $pages;
    $content = "This is the extra page v3";

    $multipage = 1;
    $numpages++;
    $pages[] = $content;
}

¹ Este es el código que usé para probar varias páginas adicionales en una sola publicación de página

add_action('template_redirect', 'custom_content_one');
function custom_content_one() {
    global $post;
    $content = "\n<!--nextpage-->\nThis is the extra page v1-1\n<!--nextpage-->\nThis is the extra page v1-2\n<!--nextpage-->\nThis is the extra page v1-3";
    $post->post_content .= $content;
}

Pregunta original

Antes de 4.4 pude agregar una página adicional a una publicación de mutlipage con lo siguiente:

add_action('template_redirect', 'custom_content');
function custom_content() {
    global $post;
    $content = html_entity_decode(stripslashes(get_option('custom_content')));
    $post->post_content .= $content;
}

Con get_option ('custom_content') siendo algo así como:

<!--nextpage-->
Hello World

Desde la actualización a 4.4, el código no ha funcionado; navegar a la página adicional desencadena un error 404 y redirect_canonical los envía de vuelta al enlace permanente de la publicación. La desactivación de redirect_canonical me permite ver la página adicional y el contenido adicional está allí, pero aún activa un error 404.

He intentado varias soluciones alternativas, ninguna de las cuales resuelve el error 404, que incluye:

add_action('the_post', 'custom_content');
function custom_content() {
    global $multipage, $numpages, $pages;
    $content = html_entity_decode(stripslashes(get_option('custom_content')));

    $multipage = 1; // ensure post is considered multipage: needed for single page posts
    $numpages++; // increment number of pages
    $pages[] = $content;
}

También intenté aprovechar el nuevo filtro content_pagination que se agregó en 4.4:

add_filter('content_pagination', 'custom_content', 10, 2);
function custom_content($pages, $post) {
    $content = html_entity_decode(stripslashes(get_option('custom_content')));

    $pages[] = $content;
    return $pages;
}

En este punto no tengo ideas sobre cómo restaurar esta funcionalidad y cualquier ayuda sería apreciada.

Milamber
fuente
Bien, tengo una actualización de esto, desafortunadamente no es positiva. Aparentemente funciona en la instalación nueva si la página adicional es la página 2. Sin embargo, si la página adicional es la página 3 (o superior, entonces se rompe). / muñeca
Milamber
1
ENCONTRADO EL ERROR !!!!! ¡¡¡¡SI!!!!. Actualizaré mi respuesta pronto
Pieter Goosen

Respuestas:

8

ACTUALIZACIÓN 21-01-2016 19:35 SA TIEMPO - ERROR ENCONTRADO !!!!! ¡¡¡¡¡¡SI!!!!!!

Finalmente encontré el error. Como indicó en su última actualización, el error solo ocurre cuando $post_contenthay una <!--nextpage-->etiqueta en el contenido. Lo probé y confirmó que cualquier otra página después de la página después de que <!--nextpage-->devuelve un 404 y luego la página vuelve a ser redirigida a la primera página.

Esto se debe a las siguientes líneas de código en el handle_404()método que se introdujo en la WPclase en WordPress 4.4

// check for paged content that exceeds the max number of pages
$next = '<!--nextpage-->';
if ( $p && false !== strpos( $p->post_content, $next ) && ! empty( $this->query_vars['page'] ) ) {
    $page = trim( $this->query_vars['page'], '/' );
    $success = (int) $page <= ( substr_count( $p->post_content, $next ) + 1 );
}

Lo que hace este código es que, cada vez que <!--nextpage-->se establece la etiqueta en post_content, devolverá un 404 cuando se acceda a cualquier página que se agrega después del contenido a través del content_paginationfiltro. Debido a que se está configurando un 404, redirect_canonical()redirige cualquier página adjunta a la primera página

He presentado un ticket de trac sobre este problema que puede consultar aquí.

En el momento de escribir esto, todavía no había comentarios, así que asegúrese de revisar regularmente el estado del boleto

SOLUCIÓN ACTUAL - A / W TRAC TICKET FEEDBACK

Por ahora, hasta que obtengamos algún comentario y posibles soluciones en futuras versiones, simplemente elimine esas líneas de la WPclase hasta nuevo aviso

QUE HORA ES ...... ES TIEMPO DE DEPURACIÓN !!!!!

Tuve tiempo de probar esto completamente. Tomé tu código y lo probé en:

  • Mi instalación local v4.3

  • Mi instalación local v4.4.0

  • Mi instalación local v4.4.1

  • Complete la nueva instalación local v4.4.1 con solo la Hello Worldpublicación y la Sample Pagepágina

con mis enlaces permanentes establecidos en

  • default y

  • Post Name

Aquí está mi código de prueba para crear 4 páginas dentro de mi publicación de prueba.

add_filter('content_pagination', 'custom_content', 10, 2);
function custom_content($pages, $post) {
    $pages_to_add = [
        'Hello World Page 2',
        'Hello World Page 3',
        'Hello World Page 4',
    ];

    foreach ( $pages_to_add as $page_to_add ){
        $pages[]  = html_entity_decode(
            stripslashes(
                $page_to_add
            )
        );
    }

    return $pages;
}

También probé

add_filter('content_pagination', 'custom_content', 10, 2);
function custom_content($pages, $post) {
    $pages_to_add = [
        '<!--nextpage--> Hello World Page 2',
        '<!--nextpage--> Hello World Page 3',
        '<!--nextpage--> Hello World Page 4',
    ];

    foreach ( $pages_to_add as $page_to_add ){
        $pages[]  = html_entity_decode(
            stripslashes(
                $page_to_add
            )
        );
    }

    return $pages;
}

para una buena medida

En todas y cada una de las estructuras de instalación y enlace permanente, todo su código funciona ( excepto el content_paginationv4.3 que se espera ).

También lo configuré Sample Pagecomo una página principal estática, pero eso falló en la página 2 como conformación al error como se describe en mi RESPUESTA ORIGINAL y ** EDITAR

Entonces, la conclusión es que esto no tiene nada que ver con el error en el núcleo o cualquier otro error en el núcleo. De los comentarios, algo está desestabilizando el objeto consultado en las páginas de publicación paginada, y eso es algo que debemos depurar. Desafortunadamente, como este problema ahora está localizado, no puedo dar soluciones exactas.

DEPURANDO EL PROBLEMA

Debe usar el siguiente flujo de trabajo para depurar el problema

  • Consígase una gran cantidad de café con alto contenido de cafeína y mucho azúcar

  • Tome una copia de seguridad de usted db

  • Descargue e instale los siguientes complementos (no estoy afiliado a ningún complemento )

    • Objetos de depuración para la depuración normal. Una vez instalado y configurado, repare todos los errores obvios que el complemento pueda resaltar. No continúe con el siguiente punto principal si tiene errores obvios. Arreglarlos primero

    • Administrador de base de datos que usará para reparar y limpiar su base de datos antes de continuar con el siguiente punto

  • Borrar todos los cachés, navegadores y complementos

  • Desactive todos los complementos y borre todos los cachés nuevamente para una buena medida. Debido a que este problema parece un problema de redirección, probablemente primero desactive todos los complementos que puedan tener algo que ver con la redirección. Es posible que un complemento aún no sea compatible con v4.4. Compruebe si el problema persiste, si es así, continúe con el siguiente punto, de lo contrario, veamos esto con más detalle

    Comience desactivando todos los complementos, también puede comenzar simplemente desactivando los complementos que podrían ser obvios para causar el problema. Probar adecuadamente su instalación después de la activación de todos y cada complemento. El primer complemento activado que causó el problema será el culpable. En ese caso, póngase en contacto con el autor del complemento con los detalles de depuración. Solo asegúrese de borrar sus cachés después de cada activación de complemento solo por si acaso

  • Si llegó a este punto, el punto anterior no resolvió su problema. El siguiente paso debería ser cambiar a un tema incluido para eliminar su tema como el problema. De nuevo, despeja los cachés.

  • Si todo falla, te quedan dos opciones más

    • Eliminar .htaccessy dejar que WordPress cree uno nuevo

    • Reinstalar WordPress

Esto debería resolver tu problema. Si no es así, debe considerar un error en el núcleo de WordPress que podría estar causando el problema.

Espero que esto ayude a atrapar el error

ACTUALIZAR

Debería haberme vinculado al siguiente boleto de trác que parece explicar todo más en detalle

Parches interesantes y bastante relevantes del boleto de trac anterior

No puedo probar concretamente nada como tal en este momento, pero debe trabajar a través de los parches sugeridos y probarlos. Lo que puedo captar es que el mismo código en el redirect_canonical()que es responsable de la paginación de páginas frontales estáticas también es responsable de la paginación en páginas individuales.

RESPUESTA ORIGINAL

Las páginas individuales ( como las portadas estáticas ) se usan get_query_var( 'page' )para paginar. Con WordPress 4.4 ( y en v4.4.1 ), se produjo un error que causa problemas con la paginación cuando se usa get_query_var( 'page' )para paginación.

Los informes de errores actuales, como el ticket de trac # 35365 , solo mencionan las portadas estáticas que tienen problemas con la paginación, pero como se relaciona con el error get_query_var( 'page' ), creo que esto también causaría problemas con la paginación de una sola publicación que también usa get_query_var( 'page' ).

Debe probar los parches como se describe en los tickets de trac. Si esto funciona, puede aplicar el parche y esperar a la v4.4.2 que solucionará este error

Pieter Goosen
fuente
1
Esperemos que este sea el problema para el OP, parece muy probable (no puede profundizar en esto hoy ;-).
Birgire
1
Probé la solución, también deshabilité los enlaces permanentes; ningún cambio.
Milamber
1
Lo investigaré tan pronto como tenga tiempo. Siento que la respuesta está en el error, es solo para localizarlo. Espero que encuentres una solución pronto
Pieter Goosen
2
Revise mi actualización, encontré el error y también presenté un informe de error
Pieter Goosen el
2
Confirmó que los 3 métodos funcionan una vez que esas líneas están comentadas :) boleto cerrado 35544 a favor del suyo
Milamber
4

Tenga en cuenta que hay un error de sintaxis para todos esos tres ejemplos que proporcionó:

add_filter('content_pagination', 'custom_content'), 10, 2);

add_action('the_post', 'custom_content'));

add_action('template_redirect', 'custom_content'));

donde )se agrega un extra .

Reemplace estas líneas para:

add_filter( 'content_pagination', 'custom_content', 10, 2);

add_action( 'the_post', 'custom_content' );

add_action( 'template_redirect', 'custom_content' );

No recomendaría jugar con objetos globales en general, por lo que creo que su último ejemplo con el content_paginationfiltro es el camino a seguir aquí.

También puede evitar agregar páginas vacías con:

if( ! empty( $content ) )
    $pages[] = $content;

También hay una falta )aquí:

$content = html_entity_decode(stripslashes(get_option('custom_content'));
Birgire
fuente
1
Mi error, el extra) quedaron de copiarlos y pegarlos fuera de la clase en la que se encuentran con mi implementación real. Los he eliminado de la operación. Lamentablemente, la versión content_pagination tampoco corrige el error 404.
Milamber
1
También hay una falta) en la línea de contenido $ - vea la actualización. @Milamber
birgire 12/12/2015
1
Gracias, arreglado. Cualquier error de sintaxis que esté viendo en el código de operación proviene de simplificarlo para la publicación.
Milamber
2
ok, probé esto en una instalación de Vanilla WP 4.4 con el tema Twenty Sixteen y funciona como se esperaba allí, así que creo que puede haber algo más en su configuración que le está causando el problema. @Milamber
birgire 12/12/2015
1
Extraño, lo probé en 2 entornos de desarrollo diferentes con Twentyfifteen y ambos obtuvieron el mismo resultado. Voy a echarle otro vistazo, gracias @birgire
Milamber