web-dev-qa-db-ja.com

The_content()の内容を分割します。

ある列の<!--more-->タグの前のコンテンツと別の列の残りのコンテンツ(single.php)のみが必要です。

私は私が望むようにそれを得るために私がすべての投稿を編集する必要があるところでプラグインを使いたくありません。

私は次のことをして、それを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;
}

そして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>';?>'

問題は、最初にecho '<div id="column1">', array_shift($content), '</div>';が読み込まれ、次に下のサイドバーが読み込まれることです(Facebookのコメントリンク内)。

それからecho '<div id="column2">', implode($content), '</div>';がロードされ、それから一番下のサイドバーが再びロードされます(Facebook comments link within)。

サイドバー(内のFacebookのコメントリンク)が(column2の後に)一度だけロードされるような提案はありますか?

1
mscgl

少なくとも部分的には推測していますが、FaceBookコンテンツがthe_contentのフィルターとしてロードされているように思えます。これは両方のコンテンツブロックで実行されます。

あなたのコードの大部分をそのままにしておくための素早い解決策は、 最初の配列のFaceBookフィルタ を削除し、次に2番目の配列に戻すことです。

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

ただし、コンテンツを挿入するフィルタで問題が発生する可能性があるため、これを実行するのは最善の方法ではありません。問題を引き起こすフィルタを削除して追加し直す必要があります。コードの大部分を関数に移動し、文字列を作成してthe_contentフィルタを実行するとよいでしょう。

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

完全にテストされておらず、おそらくバグがありますが、それがアイデアです。

移植性があること、つまり複数のテーマで使用されることが意図されている場合、これはうまく機能しません。テーマの編集が必要なためです。注意してください。しかしそれがあなただけのためであれば、それは大丈夫なはずです。

1
s_ha_dum