Skip to content

Instantly share code, notes, and snippets.

@cuxaro
Created September 15, 2024 19:57
Show Gist options
  • Save cuxaro/5077f4e77bb298c19e2c19c55637098d to your computer and use it in GitHub Desktop.
Save cuxaro/5077f4e77bb298c19e2c19c55637098d to your computer and use it in GitHub Desktop.
Buscar todos los enlaces externos dentro del content de una instalacion WordPress
<?php
/**
* Función principal que busca enlaces externos que no apunten a dominios permitidos y los guarda en un archivo CSV.
*
* @param string $output_file El archivo donde se guardarán los enlaces externos.
* @param array $allowed_domains Lista de dominios permitidos.
*/
function ibp_check_external_links( $output_file = 'external_links.csv', $allowed_domains = [] ) {
global $wpdb;
// Añadir el dominio del sitio a la lista de dominios permitidos
$site_url = parse_url( home_url(), PHP_URL_HOST );
$allowed_domains[] = $site_url;
// Filtro para modificar la lista de dominios permitidos
$allowed_domains = apply_filters( 'ibp_check_external_links_allowed_domains', $allowed_domains );
// Crear el patrón regex excluyendo los dominios permitidos
$pattern = '/https?:\/\/(?!' . implode('|', array_map('preg_quote', $allowed_domains)) . ')[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:\/?#[\]@!$&\'()*+,;=.]+/i';
$pattern = apply_filters( 'ibp_check_external_links_pattern', $pattern, $allowed_domains );
// Abrir archivo para guardar los resultados
$file = fopen( $output_file, 'w' );
fputcsv( $file, apply_filters( 'ibp_check_external_links_csv_headers', [ 'Post ID', 'Post Title', 'Post Type', 'Permalink', 'URL Found', 'Host' ] ) );
// Obtener todos los posts publicados (de cualquier tipo)
$posts = $wpdb->get_results( "SELECT ID, post_title, post_content, post_type FROM {$wpdb->posts} WHERE post_status = 'publish'" );
// Acción antes de comenzar el escaneo
do_action( 'ibp_check_external_links_before_scan', $posts );
// Revisar cada post
foreach ( $posts as $post ) {
preg_match_all( $pattern, $post->post_content, $matches );
if ( ! empty( $matches[0] ) ) {
foreach ( $matches[0] as $external_link ) {
// Obtener el host (dominio) del enlace externo
$host = parse_url( $external_link, PHP_URL_HOST );
// Obtener el permalink del post
$permalink = get_permalink( $post->ID );
// Acción antes de procesar cada enlace
do_action( 'ibp_check_external_links_before_process_link', $post, $external_link, $host );
// Mostrar información por pantalla (solo si está en WP-CLI)
if ( defined( 'WP_CLI' ) && WP_CLI ) {
WP_CLI::line( "Post ID: {$post->ID} - Post Title: {$post->post_title} - Post Type: {$post->post_type} - Permalink: {$permalink} - URL: {$external_link} - Host: {$host}" );
}
// Guardar en el archivo CSV
fputcsv( $file, apply_filters( 'ibp_check_external_links_csv_row', [ $post->ID, $post->post_title, $post->post_type, $permalink, $external_link, $host ], $post, $external_link, $host ) );
}
}
}
fclose( $file );
// Acción después de completar el escaneo
do_action( 'ibp_check_external_links_after_scan', $output_file );
$success_message = apply_filters( 'ibp_check_external_links_scan_success_message', "Enlaces externos encontrados y guardados en {$output_file}." );
if ( defined( 'WP_CLI' ) && WP_CLI ) {
WP_CLI::success( $success_message );
}
return $success_message;
}
/**
* Registra un comando WP-CLI para gestionar los enlaces externos.
*/
if ( defined( 'WP_CLI' ) && WP_CLI ) {
class IBP_Check_External_Links_Command {
/**
* Comando WP-CLI que escanea los enlaces externos.
*
* ## OPTIONS
*
* [--output-file=<file>]
* : El archivo donde se guardarán los enlaces externos. Por defecto: "external_links.csv".
*
* [--allowed-domains=<domains>]
* : Una lista separada por comas de dominios permitidos (además del dominio del sitio actual).
*
* ## EXAMPLES
*
* wp ibp_check_external_links --output-file=external_links.csv --allowed-domains="example.com,anotherdomain.com"
*/
public function __invoke( $args, $assoc_args ) {
// Obtener el archivo de salida desde los argumentos o usar un valor por defecto
$output_file = isset( $assoc_args['output-file'] ) ? $assoc_args['output-file'] : 'external_links.csv';
// Obtener los dominios permitidos desde los argumentos o usar un array vacío
$allowed_domains = isset( $assoc_args['allowed-domains'] ) ? explode( ',', $assoc_args['allowed-domains'] ) : [];
// Ejecutar la función principal
ibp_check_external_links( $output_file, $allowed_domains );
}
}
// Registrar el comando en WP-CLI
WP_CLI::add_command( 'ibp_check_external_links', [ 'IBP_Check_External_Links_Command', '__invoke' ] );
}
//wp ibp_check_external_links --output-file=external_links.csv --allowed-domains="example.com,anotherdomain.com"
//ibp_check_external_links( 'external_links.csv', [ 'example.com', 'anotherdomain.com' ] );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment