web-dev-qa-db-fra.com

Pages privées qui fonctionnent lorsque vous n'êtes pas connecté WP admin

D'après ce que je comprends des publications/pages privées, elles ne fonctionnent que lorsque vous êtes connecté au système WP admin en tant qu'administrateur ou éditeur.

J'ai un site sur lequel je dois parfois partager des publications personnalisées avec des utilisateurs via des liens et je ne souhaite pas qu'elles apparaissent ailleurs sur le site. Définir les publications sur "privé" fait presque ce que je veux, car elle supprime instantanément les publications de la page d'accueil du site et des autres zones normalement incluses.

Le seul problème est que la fonction de publication privée suppose que je souhaite consulter la publication lorsque vous êtes connecté à l'administrateur, ce qui n'est pas le cas, car une erreur 404 s'affiche lorsque vous n'êtes pas connecté. Je souhaite partager cette publication avec des inconnus manuellement, en tant que et quand j'ai besoin de sans mot de passe et pour qu'ils apparaissent comme d'habitude via leur permalien standard.

C’est peut-être un territoire de plugin, mais à ma grande surprise, je n’en ai trouvé aucun qui le fasse.

Pour clarifier, le type de publication sur lequel j'ai besoin d'implémenter est un type de publication personnalisé défini par un plug-in dont le site a besoin pour s'exécuter.

2
AdamJones

Si vous not voulez utiliser un plugin (ou ne trouvez pas celui qui fait ce dont vous avez besoin), vous voudrez peut-être l'approcher de cette façon:

  1. Ajoutez une boîte à méta personnalisée qui vous permet de marquer la publication en tant que hidden.
  2. Modifier la requête avec pre_get_posts pour supprimer les messages que vous avez étiquetés comme masqués de votre site (mais qui seront disponibles avec un lien direct).

UPDATE

En suivant la suggestion ci-dessus, voici une solution possible.

Crée une méta-boîte personnalisée

Commencez par créer la méta-boîte personnalisée en en enregistrant une:

function yourtextdomain_add_custom_meta_box() {
  add_meta_box("demo-meta-box", "Custom Meta Box", "yourtextdomain_custom_meta_box_markup", "post", "side", "high", null);
}
add_action("add_meta_boxes", "yourtextdomain_add_custom_meta_box");

Ajoutez le balisage à la metabox (une case à cocher dans le cas):

function yourtextdomain_custom_meta_box_markup($object) {
  wp_nonce_field(basename(__FILE__), "meta-box-nonce"); ?>
    <div>
      <br />
      <label for="meta-box-checkbox">Hidden</label>

      <?php $checkbox_value = get_post_meta($object->ID, "meta-box-checkbox", true);
          if($checkbox_value == "") { ?>

          <input name="meta-box-checkbox" type="checkbox" value="true">

      <?php } else if($checkbox_value == "true") { ?>

          <input name="meta-box-checkbox" type="checkbox" value="true" checked>

      <?php } ?>

      <p style="color: #cccccc"><i>When selected, the post will be removed from the WP loop but still accessible from a direct link.</i></p>
    </div>
  <?php
}

Cela vous donnera une boîte méta pour chaque message qui ressemble à ceci:

Et enfin enregistrer la valeur de la boîte à méta:

function yourtextdomain_save_custom_meta_box($post_id, $post, $update) {
    if (!isset($_POST["meta-box-nonce"]) || !wp_verify_nonce($_POST["meta-box-nonce"], basename(__FILE__)))
        return $post_id;

    if(!current_user_can("edit_post", $post_id))
        return $post_id;

    if(defined("DOING_AUTOSAVE") && DOING_AUTOSAVE)
        return $post_id;

    $slug = "post";

    if($slug != $post->post_type)
        return $post_id;

    $meta_box_checkbox_value = "";

    if(isset($_POST["meta-box-checkbox"])) {
      $meta_box_checkbox_value = $_POST["meta-box-checkbox"];
    }
    update_post_meta($post_id, "meta-box-checkbox", $meta_box_checkbox_value);
}
add_action("save_post", "yourtextdomain_save_custom_meta_box", 10, 3);

Dans la table wp_postmeta, vous devriez maintenant voir la méta-valeur 'true' affectée aux publications que vous avez cochées comme étant masquées et enregistrées:

 Post Meta Table 

Modification de la requête avec pre_get_posts

Désormais, il suffit de filtrer les publications marquées comme masquées par la requête principale. Nous pouvons le faire avec pre_get_posts:

add_action( 'pre_get_posts', 'yourtextdomain_pre_get_posts_hidden', 9999 );
function yourtextdomain_pre_get_posts_hidden( $query ){

  // Check if on frontend and main query.
    if( ! is_admin() && $query->is_main_query() ) {

    // For the posts we want to exclude.
    $exclude = array();

    // Locate our posts marked as hidden.
    $hidden = get_posts(array(
      'post_type' => 'post',
      'meta_query' => array(
        array(
          'key' => 'meta-box-checkbox',
          'value' => 'true',
          'compare' => '==',
        ),
      )
    ));

    // Create an array of hidden posts.
    foreach($hidden as $hide) {
      $exclude[] = $hide->ID;
    }

    // Exclude the hidden posts.
    $query->set('post__not_in', $exclude);

    }
}
4
Jami Gibbs

Dans WordPress, les publications privées sont probablement les plus proches que vous puissiez obtenir sans utiliser de plugin. Puisque vous avez mentionné que vous deviez envoyer des liens vers des publications privées à d'autres personnes, je vous recommande de ne pas réinventer la roue et d'utiliser l'un des plug-ins disponibles à cet effet.

Par exemple, je peux fortement recommander Public Post Preview de WordPress Core Committer, Dominik Schilling (ocean90). Je pense que ça fait exactement ce que tu veux:

Vous permet de donner un lien à des utilisateurs anonymes pour un aperçu public d'un message avant sa publication.

Il gère pour vous toutes les tâches liées à l'expiration des liens, aux vérifications des capacités, etc., afin que vous n'ayez pas à vous soucier d'exposer par inadvertance trop de contenu lorsque vous utilisez une solution personnalisée.

1
swissspidy

1) Créez un type de publication personnalisé qui n'est PAS public (par exemple, "hidden_posts").

2) Créez un modèle personnalisé dans le fichier courant et exécutez une requête personnalisée $ wpdb en passant le paramètre post_type à "hidden_posts" dans le modèle.

3) Créez une page régulière en utilisant le modèle que vous venez de créer.

4) Ajoutez la page en (3) au texte de votre robot et refusez l'accès pour vous assurer qu'il n'est pas indexé!

5) Votez ma réponse comme la meilleure :)

NB: Si vous avez besoin d'un code détaillé, faites le moi savoir!

0
codiiv

Vous pouvez créer un type de publication personnalisé pour ce type de publication que vous souhaitez afficher uniquement pour un utilisateur non connecté.

dans le, vous pouvez personnaliser le fichier single.php pour votre type de message personnalisé en le remplaçant par custom-postype.php. Vous pouvez ainsi vérifier si l'utilisateur n'est pas connecté. Vous pouvez également l'afficher.

Faites-moi savoir vos opinions ci-dessous par commentaire

0
Pratik bhatt

Probablement le territoire du plugin, car, comme vous le mentionnez, les pages privées ne sont visibles que par les utilisateurs connectés au niveau administrateur ou éditeur.

Voir https://codex.wordpress.org/Content_Visibility

Ce n'est pas tout à fait clair sur votre cas d'utilisation, mais vous pourrez peut-être créer un type de message personnalisé qui ne soit pas visible sur les pages d'index (définir public sur false, ne pas ajouter d'archive pour cela, etc.), de sorte que seule une personne avec le permalien pourrait le voir. Quelqu'un pourrait deviner le lien permanent cependant, pour que ce ne soit pas totalement "privé".

https://codex.wordpress.org/Function_Reference/register_post_type#Arguments

0
jetyet47