J'ai un client qui souhaite fermer l'accès à l'ensemble du site, à chaque publication, page de catégorie, archive, etc. (tout en conservant le contenu), à l'exception de trois pages spécifiques (Démarrer, à propos de nous, contacter).
Aucun des plugins d'appartenance ne semble répondre à cela, seulement des rôles connectés? Je pense que c'est la chose la plus simple jamais faite, mais je n'arrive pas à résoudre le problème.
Edit: En gros, ce que je dis, c'est "si la page x, x ou x" continue ", sinon le message".
Si vous souhaitez afficher un message, utilisez ce code dans votre fichier functions.php
-
function se_236335_hide_content( $content ){
$pages = array( 8, 26, 35 ); // allowed page IDs
if( ! in_array( get_the_id(), $pages ) ){
return 'Message here..';
}
return $content;
}
add_filter( 'the_content', 'se_236335_hide_content' );
Si vous voulez une redirection de page, utilisez this-
function se_236335_redirect(){
// allowed pages IDs
$p1 = 9;
$p2 = 11;
$p3 = 35;
// redirect location
$location = 9;
if( ! is_page( [ $p1, $p2, $p3 ] ) ) {
wp_redirect( get_permalink( $location ) );
exit();
}
}
add_action( 'wp', 'se_236335_redirect' );
Une autre approche consisterait à utiliser l'objet $query
pour modifier la requête en conséquence
add_action('init', 'wpse_236335_hide_content' );
function wpse_236335_hide_content(){
// Apply hook everywhere for non logged in users except on wp-login.php page
if( ! is_user_logged_in() && $GLOBALS['pagenow'] !== 'wp-login.php' )
add_action( 'pre_get_posts', 'my_permitted_content' );
}
function my_permitted_content( $query ){
// If we are on any of those pages, by ID, proceed as normal
if( $query->is_page( array( 9, 11, 35 ) ) ) {
return;
}
// set query so nothing is returned. using trash because trashed post are not shown by design
$query->set( 'post_status', 'trash' );
// if we are not on the blog roll or the home page. redirect to home page.
if( ! $query->is_home() || ! $query->is_front_page() ){
wp_redirect( site_url() );
exit;
}
}