Brakujące oceny w opiniach produktów woocommerce

Taka oto sytuacja: Google Search Console krzyczy nagle, że zakładka fragmenty opinii zawiera ponad 99% błędów. Zaglądam no i rzeczywiście jest to prawda. A dodatkowo otrzymujemy informację, iż „Ocena wykracza poza określony lub domyślny zakres”:

Google Search Console - Fragmenty opinii - Ocena wykracza poza określony lub domyślny zakres

Oczywiście lampka się zapala, że chodzi o oceny przy komentarzach do produktów, bo pamiętałem, że trzeba je skonfigurować w ustawieniach Woocommerce:

woocommerce ustawienia opinie

Znajdziemy to w Woocommerce->ustawienia druga zakładka produkty.

Pomimo włączenia ocen na nic zda się próba edycji istniejących komentarzy, ponieważ jak nie było tak ocen tam nie ma. Nawet nie zero tylko brak (stąd błąd w GSC). Zresztą uzupełnianie tego ręcznie to byłaby bezsensowna robota. Wszystko siedzi w bazie i tam trzeba zaatakować.

🛠 Skrypt jednorazowy do uzupełnienia braków w już istniejących komentarzach

Jeśli chcesz jednorazowo uzupełnić wszystkie istniejące komentarze bez oceny, możesz dodać ten kod, uruchomić go np. jako jednorazowy snippet lub tymczasowo w functions.php, a potem usunąć:

function uzupelnij_brakujace_oceny() {
    $args = array(
        'type'       => 'review',
        'status'     => 'approve',
        'number'     => 9999, // zwiększ w razie potrzeby
    );

    $comments = get_comments($args);

    foreach ($comments as $comment) {
        $rating = get_comment_meta($comment->comment_ID, 'rating', true);
        if (empty($rating)) {
            update_comment_meta($comment->comment_ID, 'rating', 5);
        }
    }
}
add_action('init', 'uzupelnij_brakujace_oceny');

Po uruchomieniu raz możesz usunąć add_action('init', ...), aby skrypt się nie powtarzał przy każdym odświeżeniu strony.

Parametr number => 9999 w funkcji get_comments() oznacza:

„Pobierz maksymalnie 9999 komentarzy”.

🔍 Szczegóły:

W WordPressie, gdy używasz funkcji get_comments(), domyślnie pobierana jest tylko ograniczona liczba komentarzy (np. 10). Parametr number pozwala ustawić, ile maksymalnie rekordów chcesz pobrać.

W praktyce poniższy fragment kodu oznacza: pobierz maksymalnie 9999 zatwierdzonych komentarzy typu „review” (czyli recenzji produktów).

$args = array(
    'type'   => 'review',
    'status' => 'approve',
    'number' => 9999,
);

Aby automatycznie uzupełnić brakujące oceny przy komentarzach (recenzjach) produktów w WooCommerce (czyli jeśli użytkownik dodał komentarz bez gwiazdek), możesz użyć prostego fragmentu kodu PHP, który:

  • sprawdza, czy recenzja nie ma oceny (ratingu),
  • przypisuje jej domyślną wartość (np. 5 gwiazdek).

Dodaj poniższy kod do pliku functions.php Twojego motywu potomnego, lub za pomocą wtyczki np. „Code Snippets”:

add_action('comment_post', 'uzupelnij_ocene_woocommerce', 20, 1);

function uzupelnij_ocene_woocommerce($comment_ID) {
    $comment = get_comment($comment_ID);

    // Upewniamy się, że to recenzja produktu
    if ($comment->comment_type === 'review') {
        // Sprawdź, czy nie ma oceny
        $rating = get_comment_meta($comment_ID, 'rating', true);

        if (empty($rating)) {
            // Jeśli brak, przypisz domyślną ocenę (np. 5)
            add_comment_meta($comment_ID, 'rating', 5);
        }
    }
}

💡 A co jeśli mam więcej niż 9999 recenzji?

Wtedy:

  • trzeba zastosować stronicowanie (pagination) – czyli pobieranie komentarzy w „porcjach”, np. po 500 lub 1000.
  • lub zwiększyć number (ale zbyt duża wartość może obciążyć serwer przy jednorazowym zapytaniu).

Poniżej znajdziesz przykład kodu z paginacją, który przetwarza komentarze (recenzje) bez oceny partiami – np. po 500 na raz – i automatycznie uzupełnia im domyślną ocenę (np. 5 gwiazdek). Dzięki temu nie obciążysz serwera przy dużej liczbie rekordów.

function uzupelnij_brakujace_oceny_z_paginacja() {
    $paged = 1;
    $per_page = 500;
    $has_more = true;

    while ($has_more) {
        $args = array(
            'type'       => 'review',
            'status'     => 'approve',
            'number'     => $per_page,
            'paged'      => $paged,
        );

        $comments = get_comments($args);

        if (empty($comments)) {
            $has_more = false;
            break;
        }

        foreach ($comments as $comment) {
            $rating = get_comment_meta($comment->comment_ID, 'rating', true);
            if (empty($rating)) {
                update_comment_meta($comment->comment_ID, 'rating', 5);
            }
        }

        $paged++;
    }
}
add_action('init', 'uzupelnij_brakujace_oceny_z_paginacja');

⚠️ Ważne:

  • Ten kod uruchomi się przy każdym odświeżeniu strony (dopóki add_action('init', ...) jest aktywne).
  • Po wykonaniu operacji usuń lub zakomentuj add_action(), by nie działało ponownie.

Możliwe problemy: opinie są komentarzami

Może zdarzyć się tak, że w opiniach produktów będziemy mieli informację, że ich typ to nie opinia a komentarz. Wtedy nie dodamy oceny. Oto kod, który najpierw poprawia typ a potem dodaje ocenę:

function popraw_typ_komentarza_i_dodaj_ocene() {
    global $wpdb;

    $paged = 0;
    $limit = 500;
    $has_more = true;

    while ($has_more) {
        // Pobierz komentarze przypisane do produktów, które nie są jeszcze oznaczone jako recenzje
        $results = $wpdb->get_results($wpdb->prepare("
            SELECT c.comment_ID, c.comment_post_ID
            FROM {$wpdb->comments} c
            INNER JOIN {$wpdb->posts} p ON c.comment_post_ID = p.ID
            WHERE c.comment_type != 'review'
              AND p.post_type = 'product'
              AND c.comment_approved = 1
            LIMIT %d OFFSET %d
        ", $limit, $paged * $limit));

        if (empty($results)) {
            $has_more = false;
            break;
        }

        foreach ($results as $comment) {
            // Zmień typ na 'review'
            $wpdb->update(
                $wpdb->comments,
                array('comment_type' => 'review'),
                array('comment_ID' => $comment->comment_ID)
            );

            // Dodaj ocenę jeśli nie istnieje
            $existing_rating = get_comment_meta($comment->comment_ID, 'rating', true);
            if ($existing_rating === '' || $existing_rating === null) {
                add_comment_meta($comment->comment_ID, 'rating', 5, true);
            }

            // (opcjonalnie) log do debugowania
            error_log("Naprawiono komentarz ID: {$comment->comment_ID}");
        }

        $paged++;
    }
}
// Uruchom tylko raz, potem zakomentuj:
add_action('init', 'popraw_typ_komentarza_i_dodaj_ocene');
Przewijanie do góry