web-dev-qa-db-fra.com

Diviser le contenu de the_content ();

Je veux le contenu avant la balise <!--more--> dans une colonne et le reste dans une autre colonne (single.php) uniquement.

Je ne veux pas utiliser de plug-ins où je devrais éditer tous les posts pour l'obtenir comme je le souhaite.

J'ai fait ce qui suit et je l'ai ajouté dans functions.php:

// 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;
}

et ajouté ce qui suit à single.php:

<?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>';?>'

Le problème est que echo '<div id="column1">', array_shift($content), '</div>'; est d'abord chargé, puis la barre latérale inférieure est chargée (liens de commentaires Facebook inclus).

Ensuite, echo '<div id="column2">', implode($content), '</div>'; est chargé, puis la barre latérale inférieure est à nouveau chargée (lien vers les commentaires Facebook inclus).

Quelqu'un a-t-il des suggestions pour que la barre latérale (liens de commentaires Facebook au sein de) ne soit chargée qu'une seule fois (après le column2)?

1
mscgl

Je devine, au moins partiellement, mais il semble que le contenu de FaceBook soit chargé en tant que filtre sur the_content, que vous exécutez sur les deux blocs de contenu.

La solution rapide, en gardant la plupart de votre code intact, serait de supprimer le filtre FaceBook pour le premier tableau, puis le remettre pour le second.

$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]);
}

Cependant, vous allez avoir des problèmes avec un filtre qui insère du contenu, ce n'est de loin pas la meilleure façon de le faire. Vous finirez par devoir supprimer et rajouter tous les filtres posant problème. Vous feriez mieux de déplacer la majeure partie de votre code dans la fonction, de créer une chaîne de caractères et d'exécuter le filtre the_content sur l'ensemble.

// 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);
}

Complètement non testé et peut-être un buggy, mais c'est l'idée.

Cela ne fonctionnera pas bien s'il est destiné à être portable (c'est-à-dire utilisé par plusieurs thèmes), car il nécessite une modification de thème. Alors soyez conscient. Mais si c'est juste pour vous, ça devrait aller.

1
s_ha_dum