0

ショートコード タグとその属性を解析する単純な関数がありますが、出力に問題があります。

同様に、これはcontentショートコードを含む文字列内の私のものです:

$content = 'This is lorem ispium test [gallery image="10"] and text continues...'

次のような結果出力が必要です。

This is lorem ispium test 
----------------------------------------------
|        This is output of gallery            |

-----------------------------------------------
and text continues...

しかし、このショートコードが上部にレンダリングされるのではなく、ショートコードが呼び出された場所にショートコードがレンダリングされなくなりました。お気に入り:

    ----------------------------------------------
    |        This is output of gallery            |

    -----------------------------------------------
    This is lorem ispium test and text continues...

ショートコードが呼び出された場所でレンダリングする方法を教えてください

function shortcode($content) {

    $shortcodes = implode('|', array_map('preg_quote', get('shortcodes')));
    $pattern    = "/(.?)\[($shortcodes)(.*?)(\/)?\](?(4)|(?:(.+?)\[\/\s*\\2\s*\]))?(.?)/s";

    echo preg_replace_callback($pattern, array($this,'handleShortcode'), $content);
}

function handleShortcode($matches) {

    $prefix    = $matches[1];
    $suffix    = $matches[6];
    $shortcode = .$matches[2];

    // allow for escaping shortcodes by enclosing them in double brackets ([[shortcode]])
    if($prefix == '[' && $suffix == ']') {
        return substr($matches[0], 1, -1);
    }

    $attributes = array(); // Parse attributes into into this array.

    if(preg_match_all('/(\w+) *= *(?:([\'"])(.*?)\\2|([^ "\'>]+))/', $matches[3], $match, PREG_SET_ORDER)) {
        foreach($match as $attribute) {
            if(!empty($attribute[4])) {
                $attributes[strtolower($attribute[1])] = $attribute[4];
            } elseif(!empty($attribute[3])) {
                $attributes[strtolower($attribute[1])] = $attribute[3];
            }
        }
    }
    //callback to gallery
    return $prefix. call_user_func(array($this,$shortcode), $attributes, $matches[5], $shortcode) . $suffix;
}


function gallery($att, $cont){
    //gallery output
}

注: wordpress とは関係なく、カスタム スクリプトです。

4

1 に答える 1

1

問題はあなたのにあると思いますfunction gallery($att, $cont)
その関数がの代わりにechoorを使用する場合、実際のコンテンツが表示される前に表示されることは完全に理にかなっています。printreturn

編集:
ギャラリー コードを変更できない場合は、はい、使用できますoutput buffering

function handleShortcode($matches) {
  ...
  ob_start();
  call_user_func(array($this,$shortcode), $attributes, $matches[5], $shortcode);
  $gallery_output = ob_get_contents();
  ob_end_clean();

  return $prefix . $gallery_output . $suffix;
}

関連資料:
PHP ob_start
PHP ob_get_contents

于 2013-10-04T04:49:53.300 に答える