web-dev-qa-db-fra.com

Make post mot de passe requis pour publier

Je crée un site qui n'aura que des pages protégées par mot de passe. Je voudrais que la boîte de mot de passe soit ouverte par défaut et constitue un champ obligatoire pour publier le message. Idéalement, je supprimerais également les options "public" et "privé".

Est-ce possible?

2
Tom

Vous seriez plus à l'aise en permettant aux membres de s'inscrire sur votre site, puis en donnant à chaque utilisateur des autorisations de niveau pour lire différents messages. Un plugin comme des membres pourrait fonctionner pour cela.

Mais, si vous voulez vraiment faire ce que vous avez demandé, vous devrez faire du javascript, pirater ou supprimer complètement la boîte de méta-publication et lancer le vôtre. Malheureusement, il n'y a pas une tonne de filtres à utiliser.

Pour faire comme JS, vous devez mettre votre script en file d'attente ...

<?php
add_action( 'admin_print_scripts-post.php', 'wpse38806_enqueue_js' );
add_action( 'admin_print_scripts-post-new.php', 'wpse38806_enqueue_js' );
function wpse38806_enqueue_js()
{
    if( 'post' != get_post_type() ) return;

    wp_enqueue_script(
        'wpse38806js',
        plugin_dir_url( __FILE__ ) . 'private.js',
        array( 'jquery' ),
        NULL,
        true
    );
}

... Ce qui ressemblerait probablement à quelque chose comme ça:

jQuery(document).ready(function(){
    // hide the stuff you don't want
    jQuery('label[for=visibility-radio-public], label[for=visibility-radio-private]').hide();
    jQuery('input#visibility-radio-public, input#visibility-radio-private').hide();

    // trigger clicks to open the various things
    jQuery('a.edit-visibility').trigger('click');
    jQuery('input#visibility-radio-password').trigger('click');

    // stop form submission if there's no password, add an error message
    jQuery('form#post').submit(function(){
        if( ! jQuery('input#post_password').val() ){
            jQuery('img#ajax-loading').hide();
            jQuery('input#publish').removeClass('button-primary-disabled');
            jQuery('div.wrap h2').after('<div id="message" class="error"><p>Please enter a password!</p></div>');
            return false;
        }
    });
});

Pour créer votre propre boîte de méta de soumission, vous pouvez ajouter une action à add_meta_boxes_post et, dans la fonction raccordée, supprimer la boîte de soumission actuelle et ajouter la vôtre.

<?php
add_action('add_meta_boxes_post', 'wpse38806_Hijack_meta_boxes' );
function wpse38806_Hijack_meta_boxes( $post )
{
    remove_meta_box( 'submitdiv', $post->post_type, 'side' );
    add_meta_box('submitdiv-2', __('Publish'), 'wpse38806_post_submit_meta_box', $post->post_type, 'side', 'high');
}

Dans votre rappel wpse38806_post_submit_meta_box, vous devez copier le contenu de post_submit_meta_box, trouvé dans int wp-admin/includes/meta-boxes.php, et extraire les sections appropriées. C'est une très longue fonction, donc je ne vais pas tout publier. Je viens de supprimer les quelques bits que nous ne voulons pas et d’ajouter un attribut de style pour forcer l’affichage des éléments.

function wpse38806_post_submit_meta_box($post) {
    // snip snip
    ?>

<div class="misc-pub-section " id="visibility">
<?php if ( $can_publish ) { ?>

<div id="post-visibility-select" class="hide-if-js" style="display:block">
<input type="hidden" name="hidden_post_password" id="hidden-post-password" value="<?php echo esc_attr($post->post_password); ?>" />
<?php if ($post_type == 'post'): ?>
<input type="checkbox" style="display:none" name="hidden_post_sticky" id="hidden-post-sticky" value="sticky" <?php checked(is_sticky($post->ID)); ?> />
<?php endif; ?>
<input type="hidden" name="hidden_post_visibility" id="hidden-post-visibility" value="<?php echo esc_attr( $visibility ); ?>" />

<input type="radio" name="visibility" id="visibility-radio-password" value="password" <?php checked( $visibility, 'password' ); ?> /> <label for="visibility-radio-password" class="selectit"><?php _e('Password protected'); ?></label><br />
<span id="password-span" style="display:block"><label for="post_password"><?php _e('Password:'); ?></label> <input type="text" name="post_password" id="post_password" value="<?php echo esc_attr($post->post_password); ?>" /><br /></span>
</div>
<?php } ?>

</div>
<?php
// snip snip
}

Voici tout cela sous forme de plugin .

2
chrisguitarguy

Vous feriez bien mieux d’utiliser un plugin pour rendre le blog privé, par opposition à chaque message individuel - quelque chose comme uniquement privé ?

0
TheDeadMedic

Vous pouvez le faire en utilisant Javascript:

add_action('admin_head-post.php', 'require_post_password');
add_action('admin_head-post-new.php', 'require_post_password');

function require_post_password(){
    echo "
        <script type='text/javascript'>
                jQuery(document).ready(function($) {
                    $('#publish').bind('click', function(){
                            if($('#post_password').val() == ''){
                                    $('#ajax-loading').hide();
                                    alert('Please enter a post password');
                                    return false;
                            }
                    });
                    $('#visibility-radio-private, label[for=visibility-radio-private], #visibility-radio-public, label[for=visibility-radio-public]').remove();
                    $('#hidden-post-visibility').val('password');
                    $('#post-visibility-display').text('Password Protected');
                });
        </script>
    ";
}
0
Brian Fegter