Imposta un Cookie per Parametro URL, Passa il Cookie tra Pagine per Modificare il Post
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?
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).
