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:
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.';
}
}
get_field
para obtener el contenido del campo prueba_social_plataformas
desde la página de opciones en ACF.wp_remote_get
para obtener el HTML de la página de Trustpilot y preg_match
con una expresión regular para extraer el puntaje.valoracion
en el repetidor de ACF usando update_field
y devuelve un mensaje de éxito o error según el resultado.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();
}
}
update_trustpilot_rating_on_save
se ejecuta después de guardar la página de opciones (acf/save_post
).$post_id === 'options'
), llama a scrape_trustpilot_rating
.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');
wp_next_scheduled
verifica si ya existe un evento programado; si no, programa uno usando wp_schedule_event
para que se ejecute mensualmente.add_action
vincula el evento update_trustpilot_rating_monthly
con la función scrape_trustpilot_rating
, lo que asegura que la función se ejecutará automáticamente cada mes.Este código realiza lo siguiente:
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 Builder, Script Organizer e um pouco de PHP para processar o HTML das avaliações do Google.
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.
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');
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.
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.
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:
range
, com valor de 1 a 5).url
).image
).post_object
).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:
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.
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.
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.
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.
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.
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.
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.
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.