Cum să setați un cookie pentru parametrul URL și să-l pasați între pagini pentru a modifica postarea

7 aug. 2019, 09:33:37
Vizualizări: 14.9K
Voturi: 0

Am o funcție care transformă postarea în format multipagină bazat pe un parametru URL cu o valoare specifică:

?content=multipage

Problema este că atunci când un utilizator navighează la pagina următoare, parametrul URL dispare și postarea revine la formatul single-page.

Dacă adaug manual parametrul URL la pagina următoare, postarea rămâne multipagină

Din cercetările mele, cea mai bună soluție este să setez un cookie atunci când:

?content=multipage

Astfel, acest parametru URL va fi transmis de la o pagină la alta fără a fi vizibil în bara de adrese.

Am încercat mai multe metode pentru setarea cookie-urilor, inclusiv funcția setcookie() care ar trebui să rezolve problema.

Iată progresul meu până acum:

    function onepage() {
    //**Elimină shortcode-urile**//
    function remove_shotcode($content) {
        return str_replace('[/shortcode1]', '', $content);    
        return str_replace('[shortcode2]', '', $content);
    }
    add_filter( 'the_content', 'remove_shotcode'); 

/*
*Elimină <!--nextpage-->
*@see http://wordstackexchange.com/a/183587/26350
*/

    add_action( 'the_post', function( $post )
    {
        if ( false !== strpos( $post->post_content, '<!--nextpage-->' ) ) 
        {
            // Resetează variabila globală $pages:
            $GLOBALS['pages']     = [ $post->post_content ];

            // Resetează variabila globală $numpages:
            $GLOBALS['numpages']  = 0;

           // Resetează variabila globală $multipage:
            $GLOBALS['multipage'] = false;
        }

    });
    }

    //**Declarația IF care ar trebui să seteze cookie-ul**//
    if ( empty( $_GET['content'] ) || "multipage" !== $_GET['content'] ) {
        //**Elimină onepage() doar când content=multipage**//
        add_action('wp','onepage');
        //**Ar trebui să seteze cookie-ul doar când content=multipage**//
        setcookie( 'content', 'multipage', time()+3600, COOKIEPATH, COOKIE_DOMAIN );
    }

Codul care transformă postarea în format multipagină este mai jos:


    //**SECȚIUNEA PAGEBREAK - ÎNCEPUT**//
    function pagebreak( $args = '' ) {
        global $page, $numpages, $multipage, $more;

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

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

        /**
         * Filtrează argumentele folosite pentru link-urile de paginare.
         *
         * @since 3.0.0
         *
         * @param array $params Argumente pentru link-urile de paginare.
         */
        $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>';
                    }
                    /**
                     * Filtrează HTML-ul pentru link-urile individuale de pagină.
                     *
                     * @since 3.6.0
                     *
                     * @param string $link HTML-ul link-ului.
                     * @param int    $i    Numărul paginii.
                     */
                    $link = apply_filters( 'wp_link_pages_link', $link, $i );

                    // Folosește separatorul începând cu al doilea 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>';

                    /** Acest filtru este documentat în 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'];
            }
        }

        /**
         * Filtrează HTML-ul pentru link-urile de paginare.
         *
         * @since 3.6.0
         *
         * @param string $output HTML-ul link-urilor.
         * @param array  $args   Argumente.
         */
        $html = apply_filters( 'wp_link_pages', $output, $args );

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

    /**
     * Înlocuiește [nextpage] cu <!--nextpage--> prin filtrul 'the_posts'.
     *
     * @see http://wordstackexchange.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;
    });
    //**SECȚIUNEA PAGEBREAK - SFÂRȘIT**//

Am verificat lista de cookie-uri din browser și se pare că acest cod setează cookie-ul content cu valoarea multipage.

Totuși, se pare că setează cookie-ul indiferent dacă URL-ul conține parametrul sau nu.

Și când navighez la pagina următoare, layout-ul revine la single-page, ceea ce sugerează că site-ul nu citește cookie-ul.

Este posibil să stochez ?content=multipage în cookie astfel încât site-ul să rămână multipage pentru acel utilizator sau parametrul ?content=multipage trebuie transmis de la o pagină la alta?

2
Comentarii

Cookie-urile nu sunt o alegere bună aici. Asta înseamnă că nu poți folosi caching-ul deoarece PHP trebuie să ruleze pentru a evalua cookie-ul și a genera pagina pentru fiecare utilizator. Cea mai bună soluție ar fi fie să adaugi parametrul query la link-urile de paginare, cum ai încercat, fie să folosești URL-ul de paginare pentru a seta și postul în modul multipage. Dacă poți include codul pe care îl folosești pentru a face pagina multipage folosind parametrul URL, va fi mai ușor să te ajutăm.

Jacob Peattie Jacob Peattie
7 aug. 2019 11:26:34

Mulțumesc! S-ar putea să greșesc, dar problema pe care o văd cu soluția ta este că dacă un utilizator alege să meargă la un alt post, acesta nu va mai fi multipage deoarece doar butonul nextpage al postului X va avea parametrul URL și acesta nu va fi transmis către postul Y. Există vreo modalitate de a ocoli acest lucru astfel încât pentru restul sesiunii toate postările să fie multipage?

Discover Discover
7 aug. 2019 19:29:08
Toate răspunsurile la întrebare 1
2

Sunt de acord că transmiterea șirului de interogare (query string) de la o pagină la alta este cea mai fiabilă soluție și poți, de exemplu, să folosești filtre precum post_link și term_link pentru a adăuga parametrul content în link-urile posturilor/categoriilor.

Totuși, aceasta necesită conectarea la diverse filtre cum poți vedea aici. În plus, URL-urile pentru pagini multiple precum example.com/page/2?content=multipage nu vor funcționa fără cod suplimentar.

Deci este probabil mai bine/mai ușor pentru tine să stochezi starea de pagină multiplă în cookie-urile browser-ului, exact cum ai încercat - problema din codul tău este că doar setezi cookie-ul, dar nu îl citești nicăieri. Poți folosi $_COOKIE['content'] pentru a citi valoarea cookie-ului, așa cum vezi în exemplul de mai jos.

Codul/Soluția

Mai întâi, elimină acest cod:

//**IF Statement care ar trebui să seteze cookie-ul**//
if ( empty( $_GET['content'] ) || "multipage" !== $_GET['content'] ) {
    //**Elimină onepage() doar când content=multipage**//
    add_action('wp','onepage');
    setcookie( 'content', 'multipage', time()+3600, COOKIEPATH, COOKIE_DOMAIN );
}

Și adaugă codul după //**PAGEBREAK SECTION - END**// în codul tău:

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

    $is_multipage = false;
    // Dacă parametrul "content" nu este setat, verifică dacă valoarea cookie-ului "content" este exact "multipage".
    if ( ! isset( $_GET['content'] ) && isset( $_COOKIE['content'] ) && 'multipage' === $_COOKIE['content'] ) {
        $is_multipage = true;
    }
    // Dacă parametrul "content" este setat și valoarea sa este "multipage", setează cookie-ul.
    elseif ( isset( $_GET['content'] ) && 'multipage' === $_GET['content'] ) {
        setcookie( 'content', 'multipage', time()+3600, COOKIEPATH, COOKIE_DOMAIN );
        $is_multipage = true;
    }

    // Conectează onepage() la `wp`, dacă este cazul.
    if ( ! $is_multipage ) {
        add_action( 'wp', 'onepage' );
    }
}

Notă: Trebuie să ții cont că folosirea acestei soluții înseamnă că cookie-urile trebuie să fie activate în browser (adică să fie suportate și utilizatorul să accepte cookie-uri).

10 aug. 2019 14:49:37
Comentarii

Sper că nu te superi că am repostat răspunsul ca un răspuns nou și spune-mi cum merge. :)

Sally CJ Sally CJ
10 aug. 2019 14:53:19

Uimitor! Funcționează perfect!

Discover Discover
11 aug. 2019 02:34:56