Imposta un Cookie per Parametro URL, Passa il Cookie tra Pagine per Modificare il Post

7 ago 2019, 09:33:37
Visualizzazioni: 14.9K
Voti: 0

Ho una funzione che rende il post multipagina basato su un parametro URL con un valore specifico:

?content=multipage

Il problema è che quando un utente clicca sulla pagina successiva, il parametro URL viene rimosso e il post ritorna alla formattazione a pagina singola.

Se aggiungo manualmente il parametro URL alla pagina successiva, il post rimane multipagina

Dalla mia ricerca, il modo migliore per risolvere il problema è impostare un cookie quando:

?content=multipage

In questo modo il parametro URL viene passato da una pagina all'altra senza essere visibile nella barra degli indirizzi.

Ho provato diversi metodi per impostare i cookie, ho trovato la funzione setcookie() che dovrebbe fare al caso mio.

Ecco il mio lavoro finora:

    function onepage() {
    //**Rimuove gli shortcode**//
    function remove_shotcode($content) {
        return str_replace('[/shortcode1]', '', $content);    
        return str_replace('[shortcode2]', '', $content);
    }
    add_filter( 'the_content', 'remove_shotcode'); 

/*
*Rimuove <!--nextpage-->
*@see http://wordpress.stackexchange.com/a/183587/26350
*/

    add_action( 'the_post', function( $post )
    {
        if ( false !== strpos( $post->post_content, '<!--nextpage-->' ) ) 
        {
            // Resetta la variabile globale $pages:
            $GLOBALS['pages']     = [ $post->post_content ];

            // Resetta la variabile globale $numpages:
            $GLOBALS['numpages']  = 0;

           // Resetta la variabile globale $multipage:
            $GLOBALS['multipage'] = false;
        }

    });
    }

    //**Istruzione IF che dovrebbe impostare il cookie**//
    if ( empty( $_GET['content'] ) || "multipage" !== $_GET['content'] ) {
        //**Rimuove onepage() solo quando content=multipage**//
        add_action('wp','onepage');
        //**Dovrebbe impostare il cookie solo quando content=multipage**//
        setcookie( 'content', 'multipage', time()+3600, COOKIEPATH, COOKIE_DOMAIN );
    }

Il codice che rende il post multipagina è il seguente:


    //**SEZIONE PAGEBREAK - INIZIO**//
    function pagebreak( $args = '' ) {
        global $page, $numpages, $multipage, $more;

        $defaults = array(
            'before'           => '<p class="post-nav-links">' . __( 'Pagine:' ),
            'after'            => '</p>',
            'link_before'      => '',
            'link_after'       => '',
            'aria_current'     => 'page',
            'next_or_number'   => 'next',
            'separator'        => ' ',
            'nextpagelink'     => __( 'Pagina successiva' ),
            'eog'              => '<a href="http://127.0.0.1:10080/wordpress/">',
            'previouspagelink' => __( 'Pagina precedente' ),
            'pagelink'         => '%',
            'echo'             => 1,
        );

        $params = wp_parse_args( $args, $defaults );

        /**
         * Filtra gli argomenti usati per recuperare i link delle pagine nei post paginati.
         *
         * @since 3.0.0
         *
         * @param array $params Un array di argomenti per i link delle pagine nei post paginati.
         */
        $r = apply_filters( 'wp_link_pages_args', $params );

        $output = '';
        if ( $multipage ) {
            if ( 'number' == $r['next_or_number'] ) {
                $output .= $r['before'];
                for ( $i = 1; $i <= $numpages; $i++ ) {
                    $link = $r['link_before'] . str_replace( '%', $i, $r['pagelink'] ) . $r['link_after'];
                    if ( $i != $page || ! $more && 1 == $page ) {
                        $link = _wp_link_page( $i ) . $link . '</a>';
                    } elseif ( $i === $page ) {
                        $link = '<span class="post-page-numbers current" aria-current="' . esc_attr( $r['aria_current'] ) . '">' . $link . '</span>';
                    }
                    /**
                     * Filtra l'output HTML dei singoli link numerati delle pagine.
                     *
                     * @since 3.6.0
                     *
                     * @param string $link L'output HTML del numero di pagina.
                     * @param int    $i    Numero di pagina per i link delle pagine nei post paginati.
                     */
                    $link = apply_filters( 'wp_link_pages_link', $link, $i );

                    // Usa il separatore personalizzato a partire dal secondo link.
                    $output .= ( 1 === $i ) ? ' ' : $r['separator'];
                    $output .= $link;
                }
                $output .= $r['after'];
            } elseif ( $more ) {
                $output .= $r['before'];
                $prev    = $page - 1;

                $next = $page + 1;
                if ( $next <= $numpages ) {
                    if ( $prev ) {
                        $output .= $r['separator'];
                    }
                    $link = _wp_link_page( $next ) . $r['link_before'] . $r['nextpagelink'] . $r['link_after'] . '</a>';

                    /** Questo filtro è documentato in wp-includes/post-template.php */
                    $output .= apply_filters( 'wp_link_pages_link', $link, $next );
                }           elseif ( $next  = $numpages ) {
                $link = _wp_link_page( $next ) . $r['eog'] . $r['nextpagelink'] . $r['link_after'] . '</a>';
                }


                $output .= $r['after'];
            }
        }

        /**
         * Filtra l'output HTML dei link delle pagine per i post paginati.
         *
         * @since 3.6.0
         *
         * @param string $output Output HTML dei link delle pagine per i post paginati.
         * @param array  $args   Un array di argomenti.
         */
        $html = apply_filters( 'wp_link_pages', $output, $args );

        if ( $r['echo'] ) {
            echo $html;
        }
        return $html;
    }

    /**
     * Sostituisce [nextpage] con <!--nextpage--> tramite il filtro 'the_posts'.
     *
     * @see http://wordpress.stackexchange.com/a/183980/26350
     */

    ! is_admin() && add_filter( 'the_posts', function( $posts )
    {
        $posts = array_map( function( $p )
        {
            if ( false !== strpos( $p->post_content, '[pagebreak]' ) )
                $p->post_content = str_replace( '[pagebreak]', '<!--nextpage-->', $p->post_content ); 
            return $p;
        }, $posts );
        return $posts;
    });
    //**SEZIONE PAGEBREAK - FINE**//

Ho controllato la lista dei cookie nel mio browser e apparentemente questo codice imposta il cookie content con valore multipage.

Tuttavia, sembra che imposti il cookie indipendentemente dalla presenza del parametro URL.

E quando vado alla pagina successiva, il layout ritorna a pagina singola, quindi presumo che il sito non legga il cookie.

È possibile memorizzare ?content=multipage nel cookie in modo che il sito rimanga multipage per quell'utente o il parametro ?content=multipage deve essere passato da una pagina all'altra?

2
Commenti

I cookie non sono una buona scelta in questo caso. Significa che non puoi utilizzare la cache perché PHP deve essere eseguito per valutare il cookie e generare la pagina per ogni utente. La soluzione migliore sarebbe aggiungere il parametro di query ai link di paginazione, come hai provato a fare, oppure utilizzare l'URL di paginazione per impostare anche il post in modalità multipage. Se puoi includere il codice che usi per rendere la pagina multipage utilizzando il parametro URL sarà più facile aiutarti.

Jacob Peattie Jacob Peattie
7 ago 2019 11:26:34

Grazie! Potrei sbagliarmi ma il problema che vedo con la tua soluzione è che se un utente sceglie di passare a un altro post, non sarà più multipage perché solo il pulsante nextpage del post X avrà il parametro URL e non verrà passato al post Y. C'è un modo per aggirare questo problema in modo che almeno per il resto della sessione tutti i post rimangano multipage?

Discover Discover
7 ago 2019 19:29:08
Tutte le risposte alla domanda 1
2

Sono d'accordo che passare la stringa di query da una pagina a un'altra sia la soluzione più affidabile e puoi, ad esempio, utilizzare filtri come post_link e term_link per aggiungere la stringa di query content ai link di post/categorie.

Tuttavia, richiede l'aggancio a vari filtri come puoi vedere qui. Inoltre, URL multipagina come example.com/page/2?content=multipage non funzioneranno senza ulteriore codifica.

Quindi probabilmente è meglio/più facile per te memorizzare lo stato multipagina nei cookie del browser, proprio come hai tentato di fare — il problema nel tuo codice è che stai solo impostando il cookie, ma da nessuna parte lo stai leggendo. E puoi usare $_COOKIE['content'] per leggere il valore del cookie, proprio come puoi vedere nell'esempio qui sotto.

Il Codice/Soluzione

Innanzitutto, rimuovi questo dal tuo codice:

//**IF Statement che dovrebbe impostare il cookie**//
if ( empty( $_GET['content'] ) || "multipage" !== $_GET['content'] ) {
    //**Rimuove onepage() solo quando content=multipage**//
    add_action('wp','onepage');
    setcookie( 'content', 'multipage', time()+3600, COOKIEPATH, COOKIE_DOMAIN );
}

E aggiungi il codice dopo //**PAGEBREAK SECTION - END**// nel tuo codice:

add_action( 'init', 'set_check_content_cookie', 0 );
function set_check_content_cookie() {
    if ( is_admin() ) {
        return;
    }

    $is_multipage = false;
    // Se la stringa di query "content" non è impostata, verifica se il valore del cookie "content" è esattamente "multipage".
    if ( ! isset( $_GET['content'] ) && isset( $_COOKIE['content'] ) && 'multipage' === $_COOKIE['content'] ) {
        $is_multipage = true;
    }
    // Se la stringa di query "content" è impostata e il suo valore è "multipage", imposta il cookie.
    elseif ( isset( $_GET['content'] ) && 'multipage' === $_GET['content'] ) {
        setcookie( 'content', 'multipage', time()+3600, COOKIEPATH, COOKIE_DOMAIN );
        $is_multipage = true;
    }

    // Aggancia onepage() a `wp`, se applicabile.
    if ( ! $is_multipage ) {
        add_action( 'wp', 'onepage' );
    }
}

Nota: Dovresti ricordare che utilizzare questa soluzione significa che i cookie devono essere abilitati nel browser (cioè supportati e che l'utente accetta i cookie).

10 ago 2019 14:49:37
Commenti

Spero non ti dispiaccia che ho ripubblicato la risposta come nuova risposta, fammi sapere come va. :)

Sally CJ Sally CJ
10 ago 2019 14:53:19

Fantastico! Funziona perfettamente!

Discover Discover
11 ago 2019 02:34:56