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