it-swarm.com.de

Teilen Sie den Inhalt von the_content () auf;

Ich möchte, dass der Inhalt vor dem <!--more-->-Tag in einer Spalte und der Rest in einer anderen Spalte (single.php) steht.

Ich möchte keine Plug-Ins verwenden, bei denen ich alle Posts bearbeiten müsste, um sie nach meinen Wünschen abzurufen.

Ich habe Folgendes getan und es in functions.php hinzugefügt:

// split content at the more tag and return an array
function split_content() {
    global $more;
    $more = true;
    $content = preg_split('/<span id="more-\d+"><\/span>/i', get_the_content('more'));
    for($c = 0, $csize = count($content); $c < $csize; $c++) {
        $content[$c] = apply_filters('the_content', $content[$c]);
    }
    return $content;
}

und fügte Folgendes zu single.php hinzu:

<?php
// original content display
    // the_content();
// split content into array
    $content = split_content();
// output first content section in column1
    echo '<div id="column1">', array_shift($content), '</div>';
// output remaining content sections in column2
    echo '<div id="column2">', implode($content), '</div>';?>'

Das Problem ist, dass zuerst echo '<div id="column1">', array_shift($content), '</div>'; geladen wird und dann die untere Seitenleiste geladen wird (Facebook-Kommentar-Links innerhalb).

Dann wird echo '<div id="column2">', implode($content), '</div>'; geladen und dann wird die untere Seitenleiste erneut geladen (Facebook-Kommentar-Link innerhalb).

Hat jemand irgendwelche Vorschläge, damit die Sidebar (Facebook-Kommentar-Links innerhalb) nur einmal geladen wird (nach column2)?

1
mscgl

Ich vermute, zumindest teilweise, aber es hört sich so an, als ob der FaceBook-Inhalt als Filter für the_content geladen ist, den Sie für beide Inhaltsblöcke ausführen.

Die schnelle Lösung, die den größten Teil Ihres Codes intakt hält, besteht darin, den FaceBook-Filter für das erste Array zu entfernen und ihn dann für das zweite Array zurückzusetzen.

$csize = count($content);
remove_filter('the_content','fb-filter-name');
for($c = 0; $c < $csize; $c++) {
    // Note: this conditional may not be quite right
    // I'd have to test it to make sure it fires at the right time
    if ($csize === $c) add_filter('the_content','fb-filter-name');
    $content[$c] = apply_filters('the_content', $content[$c]);
}

Bei Filtern, die Inhalte einfügen, treten jedoch Probleme auf, sodass dies bei weitem nicht der beste Weg ist. Am Ende müssen Sie alle Filter entfernen und wieder hinzufügen, die Probleme verursachen. Verschieben Sie den größten Teil Ihres Codes in die Funktion, erstellen Sie eine Zeichenfolge und führen Sie den the_content-Filter für das Ganze aus.

// split content at the more tag and return an array
function split_content() {
    global $more;
    $more = true;
    $content = preg_split('/<span id="more-\d+"><\/span>/i', get_the_content('more'));
    // first content section in column1
    $ret = '<div id="column1">'. array_shift($content). '</div>';
    // remaining content sections in column2
    if (!empty($content)) $ret .= '<div id="column2">'. implode($content). '</div>';
    return apply_filters('the_content', $ret);
}

Völlig ungetestet und möglicherweise fehlerhaft, aber das ist die Idee.

Dies funktioniert nicht gut, wenn es portabel sein soll - das heißt, von mehr als einem Thema verwendet -, da es eine Themenbearbeitung erfordert. Sei dir also bewusst. Aber wenn es nur für dich ist, sollte es in Ordnung sein.

1
s_ha_dum