PHP ob_start () не закрывается HTML теги внутри <script> - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь заменить alt-теги изображений в WordPress. Вот мой код.

add_action( 'template_redirect', 'activate_buffer', 0 );
function activate_buffer() {
    ob_start();
}

add_action('shutdown', function() {
    $final = '';

    $levels = ob_get_level();

    for ($i = 0; $i < $levels; $i++) {
        $final .= ob_get_contents();
        ob_end_clean();
    }

    echo apply_filters('final_output', $final);

}, 0);

add_action('final_output', 'new_alt');

function new_alt($content) {

    $dom = new DOMDocument();
    @$dom->loadHTML($content);
    $x = new DOMXPath($dom);

    foreach($x->query("//img") as $node)
    {   
        $node->setAttribute("alt","Hello NEW ALT");
    }
    $content = $dom->saveHtml();

    return $content;
}

Этот код работает нормально, за исключением того, что при загрузке есть несколько проблем. Например, Фотография профиля BuddyPress или загрузка изображения обложки или любая другая страница переднего плана, у которой есть опция загрузки, не работает. (например: WFCM: Front-end Manager)

Проблема в том, что скрипт загрузки WordPress определяет div и другие теги html внутри <script>. Пожалуйста, отметьте media-template. php в репозитории WordPress github. И все эти теги не закрываются должным образом, когда я использую метод ob_start ().

Вот обычный HTML код для скрипта загрузки на странице профиля BuddyPress Photo Photo.

<script type="text/html" id="tmpl-upload-window">
    <div id="{{data.container}}">
        <div id="{{data.drop_element}}">
            <div class="drag-drop-inside">
                <p class="drag-drop-info">Drop your file here</p>

                <p class="drag-drop-buttons">
                    <label for="{{data.browse_button}}" class="bp-screen-reader-text">
                        Select your file                        </label>
                    <input id="{{data.browse_button}}" type="button" value="Select your file" class="button" />
                </p>
            </div>
        </div>
    </div>
</script>

<script type="text/html" id="tmpl-progress-window">
    <div id="{{data.id}}">
        <div class="bp-progress">
            <div class="bp-bar"></div>
        </div>
        <div class="filename">{{data.filename}}</div>
    </div>
</script>

Но new_alt function с ob_start() возвращает HTML следующим образом.

<script type="text/html" id="tmpl-upload-window">
    <div id="{{data.container}}">
        <div id="{{data.drop_element}}">
            <div class="drag-drop-inside">
                <p class="drag-drop-info">Drop your file here

                <p class="drag-drop-buttons">
                    <label for="{{data.browse_button}}" class="bp-screen-reader-text">
                        Select your file                        
                    <input id="{{data.browse_button}}" type="button" value="Select your file" class="button" />

            </script>
        </div>
    </div>
</div>

<script type="text/html" id="tmpl-progress-window">
    <div id="{{data.id}}">
        <div class="bp-progress">
            <div class="bp-bar"></script></div>
        </div>
    <div class="filename">{{data.filename}}</div>
</article></main></div>

закрытие </p> пропало, в то время как </div> закрывается после </script>, что разрывает страницу и опция загрузки не позволяет работа.

Любая помощь будет принята с благодарностью. Существует аналогичный вопрос на Stackoverflow без какого-либо ответа, и я видел похожую проблему на форумах wordpress.org без какого-либо решения. Так что это должно помочь довольно многим людям.

Спасибо

...