Este código en PHP está diseñado para realizar scraping del puntaje de una empresa en Trustpilot y actualizarlo automáticamente en un campo de ACF (Advanced Custom Fields) en una página de opciones de WordPress. Aquí se explica cada sección del código:

1. Función Principal de Scraping (scrape_trustpilot_rating)

Esta función se encarga de realizar el scraping en Trustpilot para obtener el puntaje de calificación de la empresa y actualizarlo en el campo correspondiente en WordPress.

phpCopiar códigofunction scrape_trustpilot_rating() {
    // Obtiene la lista de plataformas del campo repetidor de ACF en la página de opciones
    $platforms = get_field('prueba_social_plataformas', 'option');

    // Verifica si existen plataformas en los datos
    if ($platforms) {
        foreach ($platforms as $index => $platform) {
            // Comprueba si la plataforma es Trustpilot
            if ($platform['nombre'] === 'Trustpilot') {
                $trustpilot_url = $platform['enlace']['url'];

                // Realiza una solicitud GET para obtener el contenido de la página de Trustpilot
                $response = wp_remote_get($trustpilot_url);

                // Verifica si la solicitud fue exitosa
                if (is_wp_error($response)) {
                    return 'Error fetching Trustpilot page: ' . $response->get_error_message();
                }

                $html = wp_remote_retrieve_body($response);

                // Extrae el puntaje de la página con expresión regular
                if (preg_match('/<p class="typography_body-l__KUYFJ typography_appearance-subtle__8_H2l" data-rating-typography="true">(\d+,\d+)<\/p>/', $html, $matches)) {
                    $rating = $matches[1];

                    // Reemplaza la coma con un punto para formatear correctamente el número
                    $numeric_rating = str_replace(',', '.', $rating);

                    // Convierte el puntaje a un valor numérico
                    $numeric_rating = floatval($numeric_rating);

                    // Imprime el puntaje extraído en un comentario HTML para depuración
                    echo '<!-- Trustpilot Rating Extracted: ' . esc_html($numeric_rating) . ' -->';

                    // Actualiza el campo 'valoracion' en el repetidor de ACF
                    $platforms[$index]['valoracion'] = $numeric_rating;
                    update_field('prueba_social_plataformas', $platforms, 'option');

                    return 'Updated Trustpilot rating to: ' . $numeric_rating;
                } else {
                    return 'Could not extract Trustpilot rating.';
                }
            }
        }
    } else {
        return 'No platforms data found in ACF.';
    }
}

Explicación:

2. Ejecutar la Función al Guardar la Página de Opciones

Este código vincula la función scrape_trustpilot_rating para que se ejecute cada vez que se guarde la página de opciones.

phpCopiar códigoadd_action('acf/save_post', 'update_trustpilot_rating_on_save', 20);

function update_trustpilot_rating_on_save($post_id) {
    // Comprueba si es la página de opciones
    if ($post_id === 'options') {
        scrape_trustpilot_rating();
    }
}

Explicación:

3. Programación Automática Mensual

El siguiente bloque de código programa la ejecución mensual de scrape_trustpilot_rating para mantener la calificación de Trustpilot actualizada sin intervención manual.

phpCopiar código// Programar un evento mensual para actualizar la calificación de Trustpilot
if (!wp_next_scheduled('update_trustpilot_rating_monthly')) {
    wp_schedule_event(time(), 'monthly', 'update_trustpilot_rating_monthly');
}

// Vincular la función de scraping a la programación mensual
add_action('update_trustpilot_rating_monthly', 'scrape_trustpilot_rating');

Explicación:

Resumen

Este código realiza lo siguiente:

  1. Scraping: Extrae la calificación de Trustpilot desde el HTML de la página usando una expresión regular y la actualiza en un campo de ACF.
  2. Actualización Manual: La función se ejecuta automáticamente cada vez que se guarda la página de opciones.
  3. Programación Mensual: Programa una actualización mensual para mantener el puntaje de Trustpilot actualizado.

Este proceso permite automatizar la sincronización de la calificación de Trustpilot en WordPress, asegurando que el sitio tenga siempre el puntaje más reciente sin intervención manual.

Extrair reviews do Google para utilizá-los em sites ou relatórios pode ser muito útil para negócios que desejam exibir suas avaliações de maneira eficiente. Neste tutorial, vamos construir um sistema simples em WordPress para extrair reseñas de páginas do Google e gerar um arquivo CSV. Esse arquivo CSV pode ser baixado e utilizado para diferentes fins, como exibição em seu site ou análise.

Aqui vamos combinar o uso de Oxygen BuilderScript Organizer e um pouco de PHP para processar o HTML das avaliações do Google.

Passos para Implementação

1. Preparando o Formulário no Oxygen Builder

Primeiro, precisamos de um formulário simples para o usuário colar o HTML das reseñas do Google que deseja extrair. Para isso, vamos criar um bloco de código dentro do Oxygen Builder com o seguinte HTML:

<h1>Extrator de Reseñas de Google</h1>
<form method="post">
    <label for="google_reviews_html">Pega aqui o HTML das reseñas:</label><br>
    <textarea id="google_reviews_html" name="google_reviews_html" placeholder="Pega o HTML aqui..." style="width:100%; height:200px;"></textarea><br><br>
    <button type="submit">Extrair e Baixar CSV</button>
</form>

Esse formulário simples contém um campo de texto onde o usuário pode colar o código HTML das reseñas e um botão que, ao ser clicado, envia o formulário.

2. Script PHP no Script Organizer

Agora vamos escrever o script PHP que irá processar o HTML, extrair as reseñas e gerar o arquivo CSV.

// Função para processar o HTML e extrair as reseñas
function handle_google_reviews_submission() {
    // Verifica se o formulário foi submetido
    if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['google_reviews_html'])) {
        $htmlContent = stripslashes($_POST['google_reviews_html']);  // Remove as barras desnecessárias

        // Função para analisar o HTML e extrair os dados das reseñas
        function parse_reviews($htmlContent) {
            $dom = new DOMDocument;
            @$dom->loadHTML(mb_convert_encoding($htmlContent, 'HTML-ENTITIES', 'UTF-8'));
            $xpath = new DOMXPath($dom);
            $reviews = [];

            // Seleciona os blocos de reseñas
            $entries = $xpath->query('//div[contains(@class, "p7bv ar9V1 DfMusf YXe3R")]');
            foreach ($entries as $entry) {
                // Extrai o nome do autor
                $authorNode = $xpath->query('.//div[contains(@class, "R8BTeb")]', $entry);
                $author = $authorNode->length ? html_entity_decode(trim($authorNode->item(0)->textContent), ENT_QUOTES, 'UTF-8') : 'N/A';

                // Extrai a imagem de perfil
                $profileImageNode = $xpath->query('.//img[contains(@class, "XNo5Ab")]', $entry);
                $profileImage = $profileImageNode->length ? $profileImageNode->item(0)->getAttribute('src') : 'N/A';

                // Extrai o conteúdo da reseña
                $reviewContentNode = $xpath->query('.//div[contains(@class, "OA1nbd")]', $entry);
                $reviewContent = $reviewContentNode->length ? html_entity_decode(trim($reviewContentNode->item(0)->textContent), ENT_QUOTES, 'UTF-8') : 'N/A';

                // Extrai a classificação (rating)
                $ratingNode = $xpath->query('.//span[contains(@class, "z3HNkc")]', $entry);
                $rating = ($ratingNode->length && preg_match('/\d+,\d+/', $ratingNode->item(0)->getAttribute('aria-label'), $matches)) ? str_replace(',', '.', $matches[0]) : 'N/A';

                // Extrai o link para a reseña completa
                $reviewLinkNode = $xpath->query('.//a[contains(@class, "y9pG6d")]', $entry);
                $reviewLink = $reviewLinkNode->length ? $reviewLinkNode->item(0)->getAttribute('href') : 'N/A';

                // Extrai a imagem da reseña, se houver
                $reviewImageNode = $xpath->query('.//img[contains(@class, "AQhqab")]', $entry);
                $reviewImage = $reviewImageNode->length ? $reviewImageNode->item(0)->getAttribute('src') : 'N/A';

                // Armazena todos os dados extraídos em um array
                $reviews[] = [
                    'post_title' => $author,
                    'post_thumb' => $profileImage,
                    'Review Content' => $reviewContent,
                    'Rating' => $rating,
                    'Review Link' => $reviewLink,
                    'Review Image' => $reviewImage,
                ];
            }
            return $reviews;
        }

        // Função para gerar o CSV e forçar o download
        function generate_csv($reviews) {
            $filename = "reviews.csv";
            header('Content-Type: text/csv; charset=UTF-8');
            header('Content-Disposition: attachment;filename="' . $filename . '"');
            header('Pragma: no-cache');
            header('Expires: 0');

            // Abre o fluxo de saída para gerar o CSV
            $output = fopen('php://output', 'w');
            // Inclui o BOM para garantir compatibilidade UTF-8 em programas como Excel
            fputs($output, chr(0xEF) . chr(0xBB) . chr(0xBF));

            // Escreve os cabeçalhos das colunas no CSV
            fputcsv($output, array('Post Title', 'Post Thumb', 'Review Content', 'Rating', 'Review Link', 'Review Image'));

            // Escreve os dados das reseñas
            foreach ($reviews as $review) {
                fputcsv($output, $review);
            }
            fclose($output);
            exit;
        }

        // Processa o HTML e gera o CSV
        $reviews = parse_reviews($htmlContent);
        if (!empty($reviews)) {
            generate_csv($reviews);
        } else {
            echo "<p>Não foi possível extrair os dados das reseñas. Verifique a estrutura do HTML fornecido.</p>";
        }
    }
}

// Hooka a função no evento 'init' do WordPress
add_action('init', 'handle_google_reviews_submission');

Resultado Final

Com este sistema, você pode facilmente extrair reseñas do Google e gerar um arquivo CSV que poderá ser utilizado para exibir as avaliações em seu site ou para outras finalidades de análise. Essa implementação simples permite automatizar um processo que antes era manual e trabalhoso.

Agora, você pode facilmente copiar e colar o HTML das reseñas do Google no formulário e baixar as avaliações já formatadas para o CSV, com o suporte correto a caracteres acentuados e outros detalhes importantes.

Continuação do Post: Importando o CSV no WordPress

Depois de configurar o extrator de reseñas do Google para gerar arquivos CSV com as avaliações, o próximo passo é importar esses dados diretamente no seu site WordPress. Utilizaremos o Advanced Custom Fields (ACF) para criar uma página de opções que permita fazer upload do arquivo CSV e, então, automatizar a importação das informações no Custom Post Type review.

3. Configurando o Post Type e Campos Personalizados (ACF)

Já configuramos um Custom Post Type chamado Reviews que será utilizado para armazenar as avaliações importadas. Esse post type contém campos personalizados criados com o Advanced Custom Fields (ACF).

Os campos criados são:

  1. Rating: Classificação da avaliação (tipo de campo: range, com valor de 1 a 5).
  2. Review Link: URL da review no Google Maps (tipo de campo: url).
  3. Imagen Ajunta: Imagem extra associada à avaliação (tipo de campo: image).
  4. Estilos: Objeto de publicação vinculado para referências a estilos (tipo de campo: post_object).

4. Importando o JSON de Configuração do ACF e Post Type

Você pode baixar o JSON de configuração e importar diretamente no ACF para replicar a estrutura utilizada. Isso irá criar tanto os campos personalizados quanto o post type automaticamente.

Para importar esse JSON no seu site WordPress:

  1. No painel do WordPress, navegue até Custom Fields > Tools.
  2. Na aba Import Field Groups, faça o upload do arquivo JSON baixado.
  3. Clique em Import para carregar os campos e post type automaticamente.

5. Script de Importação de CSV

Com o Post Type e os Campos Personalizados já configurados, o próximo passo é adicionar o Script de Importação CSV que criamos anteriormente no Script Organizer. Esse script lê o arquivo CSV que você carrega na página de opções e cria automaticamente posts no post type Review, preenchendo os campos personalizados como classificação, link e imagem.

Código do Script de Importação

Aqui está o código que será utilizado para fazer a importação dos dados CSV e gerar os posts no WordPress com as reviews do Google:

<?php
// Función para importar una imagen desde una URL y asignarla a una entrada.
function importar_imagen($url, $name) {
    // Verifica si la URL es válida
    if (empty($url)) return false;

    // Configura el nombre de archivo
    $file_name = sanitize_file_name($name) . '.png';
    $upload_dir = wp_upload_dir();
    $image_data = file_get_contents($url);
    if (!$image_data) return false; // Verifica que se pueda obtener la imagen

    $file = $upload_dir['path'] . '/' . $file_name;

    // Guarda la imagen en la carpeta de uploads
    file_put_contents($file, $image_data);

    // Genera la imagen en la biblioteca multimedia de WordPress
    $wp_filetype = wp_check_filetype($file_name, null);
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title'     => sanitize_file_name($file_name),
        'post_content'   => '',
        'post_status'    => 'inherit'
    );
    $attach_id = wp_insert_attachment($attachment, $file);
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata($attach_id, $file);
    wp_update_attachment_metadata($attach_id, $attach_data);

    return $attach_id;
}

// Función principal para procesar el CSV cuando se actualiza la página de opciones
function importar_reviews_desde_csv() {
    // Obtiene el contenido del archivo CSV desde ACF (debe ser un archivo)
    $csv_file = get_field('archivo_csv', 'option');
    if (!$csv_file) return;

    // Obtiene la URL del archivo CSV y lo procesa
    $csv_path = $csv_file['url'];
    $csv_data = file_get_contents($csv_path);
    if (!$csv_data) return;

    // Procesa el CSV y crea las entradas, omitiendo la primera fila
    $rows = explode(PHP_EOL, $csv_data);
    $is_first_row = true; // Bandera para omitir la primera fila
    foreach ($rows as $row) {
        if ($is_first_row) { // Omitir la primera fila
            $is_first_row = false;
            continue;
        }

        // Divide cada columna (asume que no hay encabezados)
        $columns = str_getcsv($row);

        // Verifica que tenga la cantidad adecuada de columnas (6 columnas en este caso)
        if (count($columns) < 6) continue;

        // Extrae los valores de cada columna en el orden correcto
        $name = $columns[0];                  // Nombre (título de la entrada)
        $profile_pic_url = $columns[1];       // Imagen destacada (URL de perfil)
        $review_content = $columns[2];        // Review (contenido del post)
        $rating = (int)$columns[3];           // Rating
        $review_link = $columns[4];           // Review link
        $review_img_url = isset($columns[5]) ? $columns[5] : '';  // Imagen adicional

        // Crea una nueva entrada para el review
        $post_id = wp_insert_post(array(
            'post_title'   => $name,
            'post_content' => $review_content,
            'post_status'  => 'publish',
            'post_type'    => 'review',
        ));

        if (is_wp_error($post_id)) continue;

        // Asigna el perfil de imagen (Imagen destacada)
        $profile_image_id = importar_imagen($profile_pic_url, $name);
        if ($profile_image_id) {
            set_post_thumbnail($post_id, $profile_image_id);
        }

        // Asigna el campo de rango 'Rating'
        update_field('Rating', $rating, $post_id);

        // Asigna el enlace de la reseña (Review link)
        update_field('review_link', $review_link, $post_id);

        // Asigna la imagen de la reseña (Imagen adicional)
        if ($review_img_url) {
            $review_image_id = importar_imagen($review_img_url, 'review img ' . $name);
            update_field('review_img', $review_image_id, $post_id);
        }
    }
}

// Ejecuta la importación cuando se actualiza la página de opciones
add_action('acf/save_post', 'importar_reviews_desde_csv', 20);

Setting up the right URL structure is one of the primary steps when launching a new website. Deciding whether to include "www" in your site's URL might seem trivial, but it can have implications for SEO and brand consistency. For WordPress sites, establishing "www" as your default URL can enhance user experience and contribute to your online presence's uniformity.

WordPress Settings

In the WordPress admin area, under General Settings, there are two crucial fields: WordPress Address (URL) and Site Address (URL). Ensure both are set to use "www." This consistency guarantees that your site is always accessed with "www," which is vital for maintaining consistency and for search engine indexing.

Editing the wp-config.php File

If you cannot access the WordPress admin area for some reason, you can set these values directly in the wp-config.php file, located in the root directory of your WordPress installation. Right before the comment that says "/* That's all, stop editing! Happy blogging. */", add the following lines:

define('WP_HOME','https://www.yourdomain.com');
define('WP_SITEURL','https://www.yourdomain.com');

This forces WordPress to use the "www" version of your URL.

Simplifying the .htaccess File

The .htaccess file is an Apache configuration file commonly used to implement redirection rules in WordPress. Ensure there are no conflicting rules and simplify your .htaccess with the following basic redirect rules:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

These rules redirect all non-www traffic to the www version and all HTTP traffic to HTTPS without causing a redirect loop.

Checking for Plugin Conflicts

Security or redirection plugins might create additional redirects that conflict with your .htaccess file. If you encounter issues, try disabling all plugins to see if that resolves the problem. If it does, reactivate them one by one to identify the offender.

Contacting Your Hosting Provider

If you're still facing issues after trying the steps above, reach out to your hosting provider. There might be settings in the hosting configuration that are causing the redirect loop.

Try Accessing with Different Devices

Sometimes, the redirect loop might be cached by your local network, or the issue could be isolated to your device. Try accessing the site from a different device or network to see if the issue persists.

Carefully apply these steps, and after each change, check to see if the issue has been resolved. If not, proceed to the next step. Always ensure you back up your .htaccess file before making changes so you can revert to the previous state if necessary.

Need help with your project?
Let’s get it done.

START A PROJECT
Strategic Design.

Contact Us

contact@brucdesign.com