• Решено mihail1101

    (@mihail1101)


    Сайт

    Следующая проблема требует решения: добавил код в functions.php для появление If-Modified-Since. Теперь всё корректно работает, за исключением одного — сайта.

    Код:

    add_action( 'template_redirect', 'HTTP_Headers_Last_Modified' );
     
    function HTTP_Headers_Last_Modified() {
     
        if ( ( defined( 'DOING_AJAX' ) && DOING_AJAX ) || ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) || ( is_admin() ) ) {
            return;
        }
     
        $last_modified = '';
     
     
        // Для страниц и записей
        if ( is_singular() ) {
            global $post;
     
            if ( !isset( $post -> post_modified_gmt ) ) {
                return;
            }
     
            $post_time = strtotime( $post -> post_modified_gmt );
            $modified_time = $post_time;
     
            // Если есть комментарий, обновляем дату
            if ( ( int ) $post -> comment_count > 0 ) {
                $comments = get_comments( array(
                    'post_id' => $post -> ID,
                    'number' => '1',
                    'status' => 'approve',
                    'orderby' => 'comment_date_gmt',
                        ) );
                if ( !empty( $comments ) && isset( $comments[0] ) ) {
                    $comment_time = strtotime( $comments[0] -> comment_date_gmt );
                    if ( $comment_time > $post_time ) {
                        $modified_time = $comment_time;
                    }
                }
            }
     
            $last_modified = str_replace( '+0000', 'GMT', gmdate( 'r', $modified_time ) );
        }
     
     
        // Cтраницы архивов: рубрики, метки, даты и тому подобное
        if ( is_archive() || is_home() ) {
            global $posts;
     
            if ( empty( $posts ) ) {
                return;
            }
     
            $post = $posts[0];
     
            if ( !isset( $post -> post_modified_gmt ) ) {
                return;
            }
     
            $post_time = strtotime( $post -> post_modified_gmt );
            $modified_time = $post_time;
     
            $last_modified = str_replace( '+0000', 'GMT', gmdate( 'r', $modified_time ) );
        }
     
     
        // Если заголовки уже отправлены - ничего не делаем
        if ( headers_sent() ) {
            return;
        }
     
        if ( !empty( $last_modified ) ) {
            header( 'Last-Modified: ' . $last_modified );
     
            
                if ( isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) && strtotime( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) >= $modified_time ) {
                    $protocol = (isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1');
                    header( $protocol . ' 304 Not Modified' );
                }
            
        }
    }

    Дело в том, что когда я вношу любые изменения на сайте, даже редактирую комментарий, ничего не происходит. То есть в редакторе есть изменения, на сайте — нет. Как оставить код, размещенный мною в конце php файла, и восстановить работоспособность сайта?

    Большое спасибо.

Просмотр 6 ответов — с 1 по 6 (всего 6)
  • anonymized-17844177

    (@anonymized-17844177)

    mihail1101, привет.

    код, размещенный мною в конце php файла

    А почему вдруг в конце?

    А так, смотрите логи ошибок/дебаг WordPress.

    @vladvector, сначала разместил его в начале, но результат был тем же, поэтому решил поменять место, может что изменилось бы, но нет.

    В итоге решил проблему следующим кодом:

    $LastModified_unix = 1294844676; // время последнего изменения страницы
    $LastModified = gmdate("D, d M Y H:i:s \G\M\T", $LastModified_unix);
    $IfModifiedSince = false;
    if (isset($_ENV['HTTP_IF_MODIFIED_SINCE']))
        $IfModifiedSince = strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5));  
    if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
        $IfModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));
    if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {
        header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
        exit;
    }
    header('Last-Modified: '. $LastModified);

    Всем спасибо.

    И хотя проблема решена, все равно напишу, чтобы другим неповадно было такие глупости делать:

    добавил код в functions.php

    Это называется «Привет из каменного века». Сейчас так уже никто не делает. Для добавления сниппетов в functions.php используют плагины, благодаря чему сайт не только не сломается в результате ошибки в коде, но и эти изменения не будут утрачены при обновлении и даже смене темы.

    Один из таких плагинов: https://ru.wordpress.org/plugins/code-snippets/

    anonymized-17844177

    (@anonymized-17844177)

    zoltsmaster,

    Сейчас так уже никто не делает.

    Откуда через сообщение такая категоричность? Вам достоверно известно, что никто так не делает?

    Если лично ВЫ не любитель каких-то методов — это ничего не значит вообще. Каждый свободен делать свой выбор, каким бы он ни был.

    Откуда через сообщение такая категоричность

    Согласен. Я допустил неточность в своем сообщении. Мне нужно было написать:

    Умные люди так сейчас не делают

    Ну а дальше начинается свобода выбора 🙂

    • Ответ изменён 6 лет, 2 месяца назад пользователем zoltsmaster.
    anonymized-17844177

    (@anonymized-17844177)

    zoltsmaster, если только в вашем воображении 🙂

Просмотр 6 ответов — с 1 по 6 (всего 6)

Тема «Код сломал сайт» закрыта для новых ответов.