web-dev-qa-db-fra.com

Tout masquer sur le site pour les visiteurs sauf les identifiants de page spécifiques

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

1
talven

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' );
2
mukto90

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;
  } 

}
0
bynicolas