web-dev-qa-db-fra.com

Définir automatiquement le mot de passe par défaut pour toutes les publications d'une catégorie spécifique

Disons que nous avons une catégorie avec slug protected_category et quelques publications. Existe-t-il un moyen de forcer toutes les publications de cette catégorie à être protégées par un mot de passe à l'aide d'un mot de passe par défaut?

UPDATE: J'ai trouvé une solution pour définir un mot de passe par défaut pour toutes les publications dans un type de publication personnalisé:

add_filter( 'default_content', 'set_default_values', 10, 2 );
function set_default_values( $post_content, $post ) {
    if ( $post->post_type )
        switch ( $post->post_type ) {
            case 'protected_post':
                $post->post_status = 'protected';
                $post->post_password = '123123';
                break;
        }

    return $post_content; 
}

Alors, comment puis-je modifier cela pour cibler une catégorie spécifique?

1
NoSense

Cela devrait faire ce que vous voulez:

add_filter('save_post', 'wpse_135377_protect_post');
function wpse_135377_protect_post($post_ID) {
    if (in_array(
        'protected_category',
        wp_get_post_categories($post_ID, array('fields' => 'slugs'))
    )) {
        // we have to remove the function
        // as it will be called by `wp_update_post` (=> infinite loop)
        remove_filter('save_post', 'wpse_135377_protect_post');
        wp_update_post(array(
            'ID' => $post_ID,
            'post_password' => '123123',
        ));
        // now we add it again
        add_filter('save_post', 'wpse_135377_protect_post');
    }
} // function wpse_135377_protect_post

Il y avait plusieurs problèmes dans votre base de code:

  • il n'y a pas de statut de publication protected— Les publications protégées par mot de passe ont également le statut de publication publish (et elles ont un mot de passe);
  • vous devez utiliser l'action save_post (comme suggéré dans le commentaire ci-dessous et la réponse associée);
  • l'objet $post qui est passé dans les fonctions (save_post ainsi que default_content) est et non un pointeur (référence) de sorte que tout ce que vous faites à l'objet reste dans la fonction (sauf si vous l'insérez dans la base de données).

Bonne protection!

1
tfrommen