Cum să redirecționez 301 postările private în loc de eroare 404?
Cum pot redirecționa paginile private cu cod 301 în loc să afișez eroarea 404? Când o postare este privată, WordPress o filtrează din interogarea SQL, așa că nu există variabile $post disponibile.
Aș dori ca acest cod să funcționeze, dar nu merge:
add_action('wp','redirect_stuffs', 0);
function redirect_stuffs(){
global $post;
if ( $post->post_status == "private" && !is_admin() ):
wp_redirect("http://dangayle.com/",301);
exit();
endif;
}
Nu știu unde se setează mai devreme decât în wp
, decât faptul că este o problemă legată de rolul utilizatorului. Dacă aș putea seta un utilizator nelogat să aibă această capabilitate, ar rezolva probabil problema:
$publicReader -> add_cap('read_private_posts');
Problema cu add_cap este că numai utilizatorii autentificați au capabilități.

Scuze băieți, am găsit răspunsul:
add_action('wp','redirect_stuffs', 0);
function redirect_stuffs(){
global $wpdb;
if ($wpdb->last_result[0]->post_status == "private" && !is_admin() ):
wp_redirect( home_url(), 301 );
exit();
endif;
}
Articolele/Paginile sunt eliminate din hărțile site-ului, dar pagina încă apare pe site pentru a putea fi redirecționată cu codul 301.

Mi se pare că nu ar trebui să returnați nici 404, nici 301 - ar trebui să returnați fie 401 (Neautorizat / este necesară autentificarea, deși nu veți accepta nicio autentificare oferită) sau 403 (Respins, adică știu ce cereți și nu puteți avea acces).
Există un plugin abandonat Private Page Forbidden care ar putea fi util pentru inspirație, deși la o privire superficială pare să vrea să convertească 404 în 403, ceea ce nu pare o idee bună. Din păcate, deși au existat diverse discuții despre opțiuni (vezi https://core.trac.wordpress.org/ticket/10551 și alte discuții legate), termenul limită pentru remedieri a fost mutat treptat la "Lansare Viitoare".

În primul rând, trebuie să fiu de acord cu răspunsul lui @fencepost. Cu toate acestea, nu am putut rezista să nu postez o soluție, așa că iată-ne aici!
function __intercept_private_page( $posts, &$wp_query )
{
// elimină filtrul acum, astfel încât la interogările ulterioare să nu mai fim implicați!
remove_filter( 'the_posts', '__intercept_private_page', 5, 2 );
if ( !( $wp_query->is_page && empty($posts) ) )
return $posts; // ieși, nu este o pagină fără rezultate
// dacă dorești să verifici explicit că este *privată*, folosește blocul de cod de mai jos:
/*
if ( !empty( $wp_query->query['page_id'] ) )
$page = get_page( $wp_query->query['page_id'] );
else
$page = get_page_by_path( $wp_query->query['pagename'] );
if ( $page && $page->post_status == 'private' ) {
// redirecționează
}
*/
// în caz contrar, presupune că dacă cererea era pentru o pagină și nicio pagină nu a fost găsită, aceasta era privată
wp_redirect( home_url(), 301 );
exit;
}
is_admin() || add_filter( 'the_posts', '__intercept_private_page', 5, 2 );
Actualizare: Cod revizuit pentru a utiliza filtrul the_posts
în loc de posts_results
(care se declanșează înainte ca WordPress să verifice permisiunile, astfel încât $posts
nu a fost încă 'golit').
