Я пытаюсь заменить 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 без какого-либо решения. Так что это должно помочь довольно многим людям.
Спасибо