PHP DOM в WordPress - добавить атрибут в выходной буфер HTML - PullRequest
0 голосов
/ 27 мая 2019

Я хочу сделать все теги input на странице товара и корзины с классом qty, иметь атрибуты type="number" и readonly="readonly" путем изменения DOM с помощью PHP.

Когда я ограничу его в корзине иСтраница продукта, это «только» делает плагин ленивой загрузки и плагин Autoptimize перестают работать для этих 2 страниц, в то время как другие страницы в порядке.Я не могу обнаружить никаких ошибок консоли, а также на страницах администратора.

Когда я разрешаю запускать ее для каждой страницы, происходит следующее:

  1. В консоли нет ошибокна странице продукта и корзины.
  2. Запрос Ajax на Ajax добавляет к разрывам плагинов корзины.
  3. Я получаю несколько консольных ошибок, которые нарушают макет многих страниц администратора, перемещая и скрывая части содержимого.

Эти модификации выходного буфера выглядят как взлом с возникающими ошибками / несовместимостью.Может ли это быть из-за libxml_use_internal_errors(true);, который скрывает предупреждения и фактически ничего не исправляет?

Dom loadHTML не работает должным образом на сервере

Это то, чтоЯ имею в моих функциях. Php:

add_action( 'template_redirect', 'acau_activate_buffer', 99999 );
function acau_activate_buffer() {
    // cart and product page only, WooCommerce required for below line to work, remove to reproduce issues without WooCommerce      
    if ( ! is_cart() && ! is_product() ) return;
    ob_start();
}

add_action('shutdown', function() {
    // cart and product page only, WooCommerce required for below line to work, remove to reproduce issues without WooCommerce          
    if ( ! is_cart() && ! is_product() ) return;
    $final = '';

    // Collect output from all previous buffers.
    $levels = ob_get_level();

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

    echo apply_filters('acau_output', $final);

}, -99999);

// Filter final output.
add_filter('acau_output', function($output) {

    $dom = new DOMDocument();
    libxml_use_internal_errors(true);
    $dom->loadHTML(mb_convert_encoding($output, 'HTML-ENTITIES', 'UTF-8'));

    foreach ($dom->getElementsByTagName('input') as $node) {
        $classes = explode (' ', $node->getAttribute('class') );
        if ( in_array ( 'qty', $classes ) ) {
            $node->setAttribute('type', 'number');
            $node->setAttribute('readonly', 'readonly');
        }
    }
    $newHtml = $dom->saveHtml();
    return $newHtml;

});

1 Ответ

0 голосов
/ 28 мая 2019

Я нашел решение своей проблемы, основываясь на том, что Роланд из nextendweb разместил на форумах поддержки WordPress. Он подал отчет об ошибке:

https://bugs.php.net/bug.php?id=76563

То, что он предлагает, будет в моем случае:

$final .= ob_get_contents();
ob_clean();

вместо:

$final .= ob_get_clean();

потому что он работает не так, как должен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...