web-dev-qa-db-fra.com

Réorganiser les éléments générés par comment_form ()

Je développe actuellement un thème personnalisé à partir de zéro.

La semaine dernière, j'ai essayé de modifier l'ordre des éléments HTML générés par la fonction comment_form().

En principe, je ne connais aucun PHP, et je n’ai pas pu trouver d’informations sur la comment_form() qui explique comment réorganiser la présentation de sa sortie, y compris le Codex WordPress.

Quelqu'un peut-il expliquer s'il vous plaît comment réorganiser les éléments générés par la comment_form(), de préférence sans avoir à maîtriser PHP et le fonctionnement interne de WordPress?

Veuillez ne pas fournir de solutions qui reposent sur le repositionnement d'éléments avec CSS; cela ne peut pas être la façon dont vous avez l'intention de personnaliser la sortie.

S'il s'avère qu'il n'y a pas de moyen optimal pour atteindre cet objectif, serait-il alors possible de personnaliser comments.php sans utiliser la fonction comment_form(), comme vous le feriez avant l'introduction de la fonction?

Les liens suivants couvrent certaines des méthodes les plus pertinentes que j'ai essayées. Ils ne fonctionnent pas du tout ou ne donnent pas le bon résultat:

http://freetexthost.com/wplcq61i3d

(Désolé, mais je ne suis pas autorisé à publier plus de deux liens directement dans le message.)

Je vous remercie.

3
Magnus Lind Oxlund

Réorganiser les champs de commentaire

La zone de texte comment a été déplacée au sommet de WordPress 4.4:

default 4.4

Et si nous préférions l'ancienne configuration, où elle se trouvait en bas?

Réorganisation des champs de commentaire author, url et email

Nous pouvons modifier l'ordre d'affichage des champs author, url et email, avec:

/**
 * Re-arranging the author, url and email comment fields
 */
add_filter( 'comment_form_defaults', function( $defaults )
{
    $_defaults = [];

    // Re-arrange the fields to your needs:
    $fields = [ 'author', 'url', 'email' ];

    foreach( $fields as $field )
        $_defaults['fields'][$field] = $defaults['fields'][$field]; 

    return $_defaults;
} );

mais nous devrons trouver une autre approche pour réorganiser la zone de texte comment et le bouton submit.

Contournement personnalisé

Pour réorganiser les cinq champs de commentaire, nous pouvons utiliser le filtre personnalisé wpse_comment_fields:

add_filter( 'wpse_comment_fields', function( $fields )
{       
    return $fields;
} );

dans le fichier functions.php ou dans un plugin.

Exemple: Author champ en haut

Déplaçons le champ author vers le haut:

/**
 * Display the 'author' comment field at top:
 */
add_filter( 'wpse_comment_fields', function( $fields )
{
    // Re-arrange fields
    $fields = [ 'author', 'comment', 'url', 'email', 'submit' ];

    return $fields;
} );

Le formulaire de commentaire s'affichera alors comme suit:

custom 1

Exemple: champ Comment en bas et suppression du champ Url

Ici, nous affichons le champ comment en bas et supprimons le champ url:

/**
 * Display the 'comment' field at the bottom and remove the 'url' field:
 */
add_filter( 'wpse_comment_fields', function( $fields )
{
    // Re-arrange fields
    $fields = [ 'email', 'author', 'comment', 'submit' ];

    return $fields;
} );

Ensuite, le formulaire de commentaire affichera:

custom 2

Plugin de démonstration

Voici notre plugin de démonstration qui supporte le filtre wpse_comment_fields (PHP 5.4+):

<?php
/**
 * Plugin Name: Rearrange Comment Fields
 * Plugin URI:  http://wordpress.stackexchange.com/a/207449/26350
 * Author:      Birgir Erlendsson (birgire)
 * Description: Support for rearranging the comment fields: 'comment', 'auhtor', 'url', 'email' and 'submit' through the 'wpse_comment_fields' filter.
 * Version:     0.0.1
 */

add_action( 'comment_form_before', function()
{
    if( class_exists( 'WPSE_Rearrange_Comment_Fields' ) )
    {
        $fields = apply_filters( 
            'wpse_comment_fields', 
            [ 'comment', 'author', 'url', 'email', 'submit' ]
        );

        $o = new WPSE_Rearrange_Comment_fields;
        $o->set_fields( $fields )
          ->init();
    }
});

class WPSE_Rearrange_Comment_Fields
{
    private $html       = [];
    private $defaults   = [];
    private $fields     = [];

    public function set_fields( array $fields )
    {
        $this->fields = $fields;
        return $this;
    }

    public function init()
    {
        // Default
        $this->defaults = [ 'comment', 'author', 'url', 'email', 'submit' ];

        // Check for defaults
        if( empty( $this->fields ) )
            $this->fields = $this->defaults;

        // Hooks
        add_action( 'comment_form',                 [$this, 'display'],                     PHP_INT_MAX );
        add_filter( 'comment_form_field_comment',   [$this, 'comment_form_field_comment'],  PHP_INT_MAX );
        add_filter( 'comment_form_submit_field',    [$this, 'comment_form_submit_field'],   PHP_INT_MAX );
        foreach( [ 'author', 'url', 'email' ] as $field )
            add_filter( "comment_form_field_{$field}",  [$this, 'comment_form_field'], PHP_INT_MAX );       
    }

    public function display()
    {
        // Display fields in the custom order                   
        $html = '';
        foreach( (array) $this->fields as $field )
        {
            if( in_array( $field, $this->defaults ) ) 
                $html .= $this->html[$field]; 
        }
        echo $html;
    }

    public function comment_form_submit_field( $submit_field )
    {
        $this->html['submit'] = $submit_field;
        return '';
    }

    public function comment_form_field_comment( $comment_field )
    {
        $this->html['comment'] = $comment_field;
        return '';
    }

    public function comment_form_field( $field )
    {
        $key = str_replace( 'comment_form_field_', '', current_filter() );
        $this->html[$key] = $field;
        return '';
    }

} // end class
2
birgire