Cum să setați un cookie pentru parametrul URL și să-l pasați între pagini pentru a modifica postarea
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?

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).
