Kommentare Enfold

Enfold ist ein tolles Theme. Ich arbeite seit Jahren mit Enfold und es gefällt mir wirklich gut. Doch auch die besten Themes haben ihre Schwachstellen.

Das ist mir aufgefallen, als ich bei Enfold Dofollow Kommentare aktivieren wollte. Üblicherweise gibt es dafür Plugins, die genau an den richtigen Stellen ansetzen und sich je nach Funktionsumfang dann um alles kümmern. Diese Plugins funktionieren bei Enfold aber nicht.
Das hat den einfachen Grund. Enfold nutzt die WordPress eigenen Hooks und Filter nicht, um Kommentare auszugeben.

WordPress stellt hervorragende Methoden zur Verfügung, um Kommentare entsprechend anzupassen. Der wichtigste Hook für mich in diesem Fall ist der get_comment_author_link-Filter. Diese Funktion ist klipp und klar dafür zuständig den Autoren-Link bei Kommentaren auszugeben. Leider nutzt Enfold diese Funktion nicht und baut sich den Autoren-Link des Kommentars selbst zusammen. Das hat zu Folge, dass auch die üblichen Plugins nicht greifen, die alle den get_comment_author_link-Filter nutzen. Wieso Enfold das an dieser Stelle genau so macht bleibt für mich rätselhaft.

Schön und gut. Enfold lässt sich ja dank Child-Theme beliebig verändern. Der nötige Code, der den Kommentarlink ausgibt befindet sich unter:

/wp-content/themes/enfold/includes/loop-comments.php

Ich geh jetzt nicht genau auf die Praxis von Child-Themes ein und wie man solche verwendet. Dafür gibts genug bessere Anleitungen im Netz. Da wir im Child-Theme nur Dateien der ersten Ebene überschreiben können, kann ich die loop-comments.php nicht direkt in mein Child-Theme kopieren und somit überschreiben. Abhilfe schafft ein weiterer Trick. Wir können nämlich mit der Child-Theme-Technik einzelne Funktion aus dem Template überschreiben. Die loop-comments.php-Datei enthält die Funktion avia_inc_custom_comments, die für die Ausgabe der Kommentare im Enfold-Theme zuständig ist. Diese können wir nun in unserer eigenen functions.php im Child-Theme überschreiben. Enfold überprüft üblicherweise bei der Definition von Funktionen, ob diese bereits existieren (im Child-Theme). Wenn ja, wird die Funktion nicht definiert, damit sichergestellt ist, dass die Funktion aus dem Child-Theme aufgerufen wird. Das Child-Theme wird zuerst aufgerufen und somit unsere Funktion ausgefüht. Bei doppelter Definition bricht das Script mit einer Fehlermeldung ab und die Seite crasht. Enfold schützt die Funktionen in seinem eigenen Theme davor doppelt definiert zu werden über folgenden Code:

if(!function_exists('avia_set_title_tag'))

Leider ist die Funktion avia_inc_custom_comments jedoch nicht so gewrappt. Das wurde anscheinend vergessen. Komisch ist, dass bereits 2014 im Enfold-Forum auf diesen „Fehler“ hingewiesen wurde. Bis heute hat sich daran aber nichts verändert. Sehr sehr ärgerlich.

Da wir natürlich nicht die Enfold-Core-Dateien verändern wollen (werden bei jedem Theme-Update überschrieben), bleibt uns nur die Möglichkeit eine Datei aus der ersten Ebene des Enfold-Themes zu überschreiben. Und zwar genau jene, die die Funktion avia_inc_custom_comments aufruft. Das ist die comments.php im Enfold Root-Ordner. Wir kopieren die Datei in unser Child-Theme und suchen die Stelle, an der die Funktion avia_inc_custom_comments aufgerufen wird. Fündig werden wir in Zeile 103:

wp_list_comments( array( 'type'=> 'comment', 'callback' => 'avia_inc_custom_comments' ) );

Wir ändern nur den Funktionsnamen ab, damit Enfold nicht mehr auf seine eigene Funktion, sondern unsere Funktion zugreift.

wp_list_comments( array( 'type'=> 'comment', 'callback' => 'avia_inc_custom_comments_dofollow' ) );

Jetzt sucht Enfold beim Aufrufen der Kommentare nach der Funktion avia_inc_custom_comments_dofollow. Diese müssen wir jetzt natürlich noch definieren. Dazu öffnen wir die Datei /wp-content/themes/enfold/includes/loop-comments.php und kopieren die Funktion avia_inc_custom_comment. Diese fügen wir in unserer functions.php im Child-Theme ein. Jetzt müssen wir noch den Funktionsnamen in avia_inc_custom_comments_dofollow ändern. An der fett-markierten Stelle habe ich das Link-Attribut nofollow entfernt und dafür das Attribut external eingefügt. Die Links werden nach dem Speichern dann als DoFollow-Links ausgegeben.

function avia_inc_custom_comments_dofollow($comment, $args, $depth)
{
    $GLOBALS['comment'] = $comment;

    ?>
    <li <?php comment_class(); ?> id="li-comment-<?php comment_ID() ?>">

        <div id="comment-<?php comment_ID(); ?>">
        <article>
            <div class="gravatar">
                <?php
                //display the gravatar
                $gravatar_alt = esc_html(get_comment_author());
                echo get_avatar($comment,'60', '', $gravatar_alt); ?>
            </div>

            <!-- display the comment -->
            <div class='comment_content'>
                <header class="comment-header">
                    <?php
                    $author = '<cite class="comment_author_name">'.get_comment_author().'</cite>';
                    $link = get_comment_author_url();
                    if(!empty($link))
                        $author = '<a rel="external" href="'.$link.'" >'.$author.'</a>';

					printf('<cite class="author_name heading">%s</cite> <span class="says">%s</span>', $author, __('says:','avia_framework')) ?>
                    <?php edit_comment_link(__('(Edit)','avia_framework'),'  ','') ?>

                    <!-- display the comment metadata like time and date-->
                        <div class="comment-meta commentmetadata">
                            <a href="<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ) ?>">
                                <time <?php /* avia_markup_helper(array('context' => 'comment_time'));*/ ?> >
                                    <?php printf(__('%1$s at %2$s','avia_framework'), get_comment_date(),  get_comment_time()) ?>
                                </time>
                            </a>
                        </div>
                </header>

                <!-- display the comment text -->
                <div class='comment_text entry-content-wrapper clearfix' <?php /* avia_markup_helper(array('context' => 'comment_text')); */ ?>>
                <?php comment_text(); ?>
                <?php if ($comment->comment_approved == '0') : ?>
                <em><?php _e('Your comment is awaiting moderation.','avia_framework') ?></em>
                <?php endif; ?>
                <?php comment_reply_link(array_merge( $args, array('depth' => $depth, 'max_depth' => $args['max_depth']))) ?>
                </div>
            </div>

        </article>
    </div>
<?php
}
0 Kommentare

Dein Kommentar

An Diskussion beteiligen?
Hinterlasse uns Deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.