web-dev-qa-db-fra.com

personnalisation du filtre_password_form

J'essaie de personnaliser the_password_form pour l'intégrer à bootstrap inline-forms avec une fonction add_filter ():

function custom_passowrd_form ( $form ) {
global $post;
$label = 'pwbox-'.( empty( $post->ID ) ? Rand() : $post->ID );
$form = 
    '<p>' .
        __( "To view this protected post, enter the password below:" ) .
    '</p>' .
    '<form class="form-inline" action="' .
    esc_url( site_url( 'wp-login.php?action=postpass',
                      'login_post' ) ) .
    '" method="post">' .
        '<div class="form-group"> ' .
            '<label class="sr-only" for="' .
            $label .
            '">' .
                __('Password') .
            ' :</label>' .
            '<input placeholder="'.
            __('Password') .
            '" class="form-control" name="post_password" id="' .
            $label .
            '" type="password" size="20" maxlength="20" />'.
        '</div>' .
        '<input class="btn btn-primary" type="submit" name="Submit" value="' .
            esc_attr__( "Submit" ) . '" />' .
    '</form>';
return $form;
}
if (! is_admin()) {
    add_filter('the_password_form','custom_passowrd_form');
}

tout va bien, mais le problème est la balise <p> supplémentaire qui enveloppe le bouton d'envoi, voici le résultat:

<form class="form-inline" action="http://127.0.0.1/wp-login.php?action=postpass" method="post">
    <div class="form-group">
        <label class="sr-only" for="pwbox-27">
            Password :
        </label>
        <input placeholder="Password" class="form-control" name="post_password" id="pwbox-27" type="password" size="20" maxlength="20">
    </div>
    <p>
        <input class="btn btn-primary" type="submit" name="Submit" value="Submit">
    </p>
 </form>
2
samix73

La sortie du formulaire de mot de passe est filtrée via le filtre the_content lorsque vous appelez the_content() dans votre modèle.

Cela signifie qu'il passe également par la fonction wpautop() qui enveloppe <p></p> autour de votre bouton d'envoi avec ce code:

// Rebuild the content as a string, wrapping every bit with a <p>.
foreach ( $pees as $tinkle ) {
        $pee .= '<p>' . trim($tinkle, "\n") . "</p>\n";
}

Vous pouvez déplacer votre bouton d'envoi dans votre partie <div></div> ou essayer de supprimer le filtrage wpautotop uniquement lorsque le formulaire de mot de passe est affiché.

Une autre approche serait de supprimer les balises <p></p> autour de vos éléments d’entrée:

add_filter( 'the_content', function( $content )
{
    // Check if we have an input element in the content
    if( false !== strpos( $content, '<input ' ) )
        $content = preg_replace('|<p>\s*(<input[^>]+/?>)\s*</p>|', "$1", $content );
    return $content;
}, 11 );

où nous utilisons une priorité après 10.

2
birgire