статическая переменная цикла не работает в WordPress

Вопрос или проблема

У меня есть функция в моей теме WordPress, которая удаляет первое встроенное видео в видео посте. Смотрите код ниже. Это в файле functions.php.

/* - функция, которая скрывает первое видео в содержимом поста - */

function process_embed( $embed ){

    if ( is_single() && get_post_format() === 'video' ) {
        static $post_video_num = 0;

        $post_video_num++;

        // Скрыть первое видео в содержимом поста на странице одного видео поста
        if ( 1 === $post_video_num ) {
            return '';
        }
    }

    return $embed;
}

add_filter( 'embed_oembed_html', 'process_embed', 10, 3 );
add_filter( 'video_embed_html', 'process_embed' ); // Jetpack

Как вы можете видеть, если пост является одиночным и имеет формат видео, то он объявляет статическую переменную и итерационно увеличивает её каждый раз, когда в посте есть видео. Если статическая переменная $post_video_num равна 1 (что означает первое видео в посте), она заменяется пустой строкой, удаляя первое встроенное видео.

Этот код прекрасно работает в моей среде разработки на локальном компьютере. Однако он, кажется, не работает на моём живом сервере. Это и есть проблема.

Пока я отлаживал, после вывода переменной $post_video_num, я обнаружил, что он не удаляет первое видео, потому что переменная $post_video_num равна 8 (вместо 1, как должно быть).

После вывода чисел $post_video_num, происходит следующее: он выводит числа с 1 по 8 в верхней части страницы, затем выводит 8-12 на месте, где должно быть первое видео. Конкретно на живом сервере функция, похоже, зацикливается несколько раз, из-за чего она не работает.

Основная проблема, которая меня озадачивает, заключается в том, что эта функция работает, как задумано, на моей локальной машине, но не на живом сервере, так как происходит это странное зацикливание, которое я не могу объяснить.

Что может вызывать работу этой функции на моей локальной машине, но не на живом сервере? Есть ли что-то, что я здесь упускаю?

Спасибо! Надеюсь, это имеет смысл. Ваша помощь очень ценится.

Попробуйте что-то вроде этого:

function realistic_get_first_embed_video($post_id)
 {
     $post = get_post($post_id);
     $content = do_shortcode(apply_filters('the_content', $post->post_content));
     $embeds = get_media_embedded_in_content($content);
     if (!empty($embeds)) {
         //проверка, что является первым встроенным, содержащим видео тег, youtube или vimeo
         $counter = 0;
         foreach ($embeds as $embed) {
            // Проверить условие: если счетчик равен 0,
            // это первая итерация
            if( $counter == 0 ) {
                return '';
            }

             /*
             if (strpos($embed, 'video') || strpos($embed, 'youtube') || strpos($embed, 'vimeo') || strpos($embed, 'dailymotion') || strpos($embed, 'vine') || strpos($embed, 'wordPress.tv') || strpos($embed, 'hulu')) {
                 return $embed;
             }
             */
            $counter = $counter + 1;
         }
     } else {
         //Не найдено встроенное видео
         return;
     }
 }

Возможно, ваша функция вызывается несколько раз на живом сервере из-за различий в том, как WordPress обрабатывает контент в той среде. Вот некоторые возможные причины и решения:

Возможные причины и решения:

  1. Конфликты темы или плагинов:

    • Некоторые темы или плагины могут вызывать the_content несколько раз, из-за чего фильтр выполняется многократно. Попробуйте переключиться на стандартную тему (например, Twenty Twenty-Four) и отключить плагины для проверки.
  2. Проблемы с кешированием:

    • Кеширование на стороне сервера (например, Nginx, Varnish или WP плагины кеширования) может влиять на выполнение функции. Очистите все кеши и попробуйте снова.
  3. Различия версий PHP:

    • Ваш локальный компьютер и живой сервер могут использовать разные версии PHP. Проверьте это с помощью:
      phpinfo();
      
      • Если живой сервер использует старую версию PHP, подумайте об обновлении.
  4. Множество вызовов embed_oembed_html:

    • Некоторые темы вызывают встроенный контент несколько раз, особенно если используется get_the_content() вместо the_content(). Проверьте файлы вашей темы на избыточные вызовы.
  5. Различия в конфигурации сервера:

    • На живом сервере могут быть другие настройки PHP или WordPress. Журналы отладки могут помочь. Добавьте это в wp-config.php:
      define('WP_DEBUG', true);
      define('WP_DEBUG_LOG', true);
      define('WP_DEBUG_DISPLAY', false);
      

      Затем проверьте wp-content/debug.log на наличие ошибок.

Если проблема не исчезнет, возможно, вы столкнулись с более широкой ошибкой, связанной с WordPress. Вы можете обратиться к этому руководству по устранению неполадок для получения дополнительных шагов по отладке, так как некоторые проблемы на стороне сервера могут вызывать неожиданное поведение.

Ответ или решение

Проблема с неработающим циклом статической переменной в теме WordPress, как вы описали, действительно может быть вызвана различиями в средах разработки и рабочего сервера. Давайте подробно разберем возможные причины и решения, чтобы выявить и устранить эту неисправность.

Анализ проблемы

Вы упомянули, что на вашем локальном компьютере код работает исправно, но на рабочем сервере наблюдаются аномалии при обработке видео, в частности, переменная $post_video_num получает значение 8 вместо ожидаемого 1. Это может быть связано с тем, что функция фильтрации запускается несколько раз, вызывая неожиданный результат.

Возможные причины и решения

  1. Конфликты тем или плагинов:

    • Описание: Некоторые темы или плагины могут вызывать функцию the_content несколько раз, что приводит к многократному исполнению вашей функции.
    • Решение: Поменяйте тему на стандартную (например, Twenty Twenty-Four) и отключите все плагины для проверки. Если проблема исчезнет, постепенно возвращайте плагины и темы, чтобы определить виновника.
  2. Кэширование:

    • Описание: Серверное кэширование, например, через Nginx, Varnish или плагины кэширования WordPress, может влиять на выполнение функции.
    • Решение: Очистите все кэши сервера и попробуйте снова. Также проверьте, не активировано ли CSS или JavaScript кэширование.
  3. Различия в версиях PHP:

    • Описание: Возможно, локальный и рабочий серверы используют разные версии PHP.
    • Решение: Проверьте версию PHP на обеих средах с помощью функции phpinfo();. Убедитесь, что ваш рабочий сервер использует последнюю стабильную версию PHP.
  4. Множественные вызовы embed_oembed_html:

    • Описание: Некоторые темы могут вызывать контент несколько раз, особенно если используют get_the_content() вместо the_content().
    • Решение: Проверьте файлы вашей темы на наличие лишних вызовов функции контента и исправьте это.
  5. Конфигурации сервера:

    • Описание: Различные настройки PHP или WordPress на сервере могут вызвать сбои.
    • Решение: Для диагностики ошибок включите логгирование в wp-config.php:

      define('WP_DEBUG', true);
      define('WP_DEBUG_LOG', true);
      define('WP_DEBUG_DISPLAY', false);

      Затем изучите файл wp-content/debug.log для выявления ошибок.

Дополнительные шаги

Если после выполнения вышеперечисленных рекомендаций проблема остается, возможно, она связана с более широкой ошибкой, связанной с WordPress. Рекомендуется воспользоваться гидом по устранению неполадок, чтобы провести дальнейшее расследование.

Заключение

Устранение различий между локальной и рабочей средой зачастую требует детального анализа конфигурации и окружения. Следуя вышеописанным рекомендациям, вы сможете выявить корень проблемы и обеспечить корректное функционирование вашего сайта.

Оцените материал
Добавить комментарий

Капча загружается...