A continuaciíón se muestra la implementación de un Plugin que nos puede ayudar a generar consultas de información relevante de cualquier sitio WordPress de forma que pueda implementarse backed y solo presentar los resultados a un usuario final que requiera de información que se haya guardado en la base de datos.
La estrcutura del plugin es el siguiente:
sql-query-plugin/
├── assets/
│ ├── scripts.js
│ └── style.css
├── includes/
│ ├── database.php
│ ├── export.php
│ ├── form-handler.php
│ ├── form.php
│ ├── search.php
│ └── search-form.php
└── sql-query-plugin.php
Archivo Principal del Plugin: sql-query-plugin.php
<?php
/**
* Plugin Name: SQL Query Plugin
* Description: Plugin to capture, test, save, and search SQL queries.
* Version: 1.0
* Author: Your Name
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
define( 'SQP_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
// Include required files
require_once SQP_PLUGIN_DIR . 'includes/form-handler.php';
require_once SQP_PLUGIN_DIR . 'includes/database.php';
require_once SQP_PLUGIN_DIR . 'includes/search.php';
require_once SQP_PLUGIN_DIR . 'includes/export.php';
// Register activation hook
register_activation_hook( __FILE__, 'sqp_activate_plugin' );
// Enqueue scripts and styles
add_action( 'wp_enqueue_scripts', 'sqp_enqueue_assets' );
function sqp_activate_plugin() {
sqp_create_database_table();
}
function sqp_enqueue_assets() {
wp_enqueue_style( 'sqp-styles', plugins_url( 'assets/style.css', __FILE__ ) );
wp_enqueue_script( 'sqp-scripts', plugins_url( 'assets/scripts.js', __FILE__ ), array( 'jquery' ), null, true );
wp_localize_script( 'sqp-scripts', 'sqp_ajax_object', array(
'ajax_url' => admin_url( 'admin-ajax.php' )
));
}
// Register shortcodes
add_shortcode( 'sql_query_form', 'sqp_display_form' );
add_shortcode( 'sql_query_search', 'sqp_display_search' );
?>
Archivo de Estilos: assets/style.css
/* Style for the form */
#sql-query-form {
max-width: 800px;
margin: 20px auto;
}
#sql-query-form div {
margin-bottom: 15px;
}
#sql-query-form label {
display: block;
margin-bottom: 5px;
}
#sql-query-form textarea,
#sql-query-form input[type="text"] {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
}
#sql-query-form button {
padding: 10px 15px;
background-color: #0073aa;
color: #fff;
border: none;
border-radius: 4px;
cursor: pointer;
}
#sql-query-form button:hover {
background-color: #005177;
}
#sql-query-results {
margin-top: 20px;
}
/* Style for the results grid */
#sql-query-results table {
width: 100%;
border-collapse: collapse;
}
#sql-query-results th,
#sql-query-results td {
border: 1px solid #ccc;
padding: 10px;
text-align: left;
}
#sql-query-results th {
background-color: #f2f2f2;
}
/* Style for search form and results */
#sql-query-search-form {
max-width: 800px;
margin: 20px auto;
}
#sql-query-search-results {
margin-top: 20px;
}
Archivo de Scripts: assets/scripts.js
jQuery(document).ready(function($) {
$('#sql-query-form').on('submit', function(event) {
event.preventDefault();
var formData = $(this).serialize();
$.ajax({
url: sqp_ajax_object.ajax_url,
type: 'POST',
data: formData + '&action=sqp_test_query',
success: function(response) {
$('#sql-query-results').html(response);
}
});
});
$('#sql-query-search-form').on('submit', function(event) {
event.preventDefault();
var formData = $(this).serialize();
$.ajax({
url: sqp_ajax_object.ajax_url,
type: 'POST',
data: formData + '&action=sqp_search_queries',
success: function(response) {
$('#sql-query-search-results').html(response);
}
});
});
});
Manejo del Formulario: includes/form-handler.php
<?php
add_action( 'wp_ajax_sqp_test_query', 'sqp_test_query' );
add_action( 'wp_ajax_nopriv_sqp_test_query', 'sqp_test_query' );
function sqp_test_query() {
if ( isset( $_POST['sql_query'] ) ) {
global $wpdb;
$sql_query = stripslashes( $_POST['sql_query'] );
try {
$results = $wpdb->get_results( $sql_query, ARRAY_A );
if ( ! empty( $results ) ) {
echo '<table>';
echo '<tr>';
foreach ( array_keys( $results[0] ) as $header ) {
echo '<th>' . esc_html( $header ) . '</th>';
}
echo '</tr>';
foreach ( $results as $row ) {
echo '<tr>';
foreach ( $row as $cell ) {
echo '<td>' . esc_html( $cell ) . '</td>';
}
echo '</tr>';
}
echo '</table>';
echo '<button id="export-to-excel">Export to Excel</button>';
} else {
echo '<p>No results found.</p>';
}
} catch ( Exception $e ) {
echo '<p>Error: ' . esc_html( $e->getMessage() ) . '</p>';
}
}
wp_die();
}
?>
Manejo de la Base de Datos: includes/database.php
<?php
function sqp_create_database_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'sqp_queries';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
sql_query text NOT NULL,
query_name varchar(255) NOT NULL,
query_description text NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
function sqp_save_query( $sql_query, $query_name, $query_description ) {
global $wpdb;
$table_name = $wpdb->prefix . 'sqp_queries';
$wpdb->insert(
$table_name,
array(
'sql_query' => $sql_query,
'query_name' => $query_name,
'query_description' => $query_description
)
);
}
?>
Manejo de la Búsqueda: includes/search.php
<?php
add_action( 'wp_ajax_sqp_search_queries', 'sqp_search_queries' );
add_action( 'wp_ajax_nopriv_sqp_search_queries', 'sqp_search_queries' );
function sqp_search_queries() {
if ( isset( $_POST['search_term'] ) ) {
global $wpdb;
$search_term = '%' . $wpdb->esc_like( $_POST['search_term'] ) . '%';
$table_name = $wpdb->prefix . 'sqp_queries';
$results = $wpdb->get_results( $wpdb->prepare(
"SELECT id, query_name, query_description FROM $table_name WHERE query_name LIKE %s OR query_description LIKE %s",
$search_term, $search_term
), ARRAY_A );
if ( ! empty( $results ) ) {
echo '<table>';
echo '<tr><th>Name</th><th>Description</th><th>Action</th></tr>';
foreach ( $results as $row ) {
echo '<tr>';
echo '<td>' . esc_html( $row['query_name'] ) . '</td>';
echo '<td>' . esc_html( $row['query_description'] ) . '</td>';
echo '<td><button data-query-id="' . esc_attr( $row['id'] ) . '">Execute</button></td>';
echo '</tr>';
}
echo '</table>';
} else {
echo '<p>No results found.</p>';
}
}
wp_die();
}
?>
Exportación a Excel: includes/export.php
<?php
function sqp_export_to_excel( $data ) {
// Implementación de la exportación a Excel.
}
?>
Shortcode del Formulario: includes/form.php
<?php
function sqp_display_form() {
ob_start();
?>
<form id="sql-query-form">
<div>
<label for="sql_query">SQL Query:</label>
<textarea id="sql_query" name="sql_query" required></textarea>
</div>
<div>
<label for="query_name">Query Name:</label>
<input type="text" id="query_name" name="query_name" required>
</div>
<div>
<label for="query_description">Query Description:</label>
<textarea id="query_description" name="query_description" required></textarea>
</div>
<button type="submit">Test Query</button>
</form>
<div id="sql-query-results"></div>
<?php
return ob_get_clean();
}
?>
Shortcode de Búsqueda: includes/search-form.php
<?php
function sqp_display_search() {
ob_start();
?>
<form id="sql-query-search-form">
<div>
<label for="search_term">Search:</label>
<input type="text" id="search_term" name="search_term" required>
</div>
<button type="submit">Search</button>
</form>
<div id="sql-query-search-results"></div>
<?php
return ob_get_clean();
}
?>
Resumen
Este conjunto de archivos y código proporciona una guía completa para crear un plugin de WordPress que:
- Captura consultas SQL, nombres y descripciones a través de un formulario.
- Permite probar la consulta y mostrar resultados en una rejilla.
- Guarda las consultas válidas en una tabla de la base de datos.
- Permite buscar consultas guardadas y ejecutarlas.