Created
September 15, 2024 19:57
-
-
Save cuxaro/5077f4e77bb298c19e2c19c55637098d to your computer and use it in GitHub Desktop.
Buscar todos los enlaces externos dentro del content de una instalacion WordPress
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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