---
title: "Plugin de WordPress para frases aleatorias"
description: "Valencia, 29/08/2026, G.B. Tal y comenté recientemente en este post , aquí va el plugin de WordPress para frases aleatorias. Os paso tamién el archivo.php. Recordad que para subie un plugin a WordPres..."
url: https://indaga.net/plugin-de-wordpress-para-frases-aleatorias/
date: 2026-08-28
modified: 2026-08-27
author: "Directorio Indaga"
image: https://indaga.net/wp-content/uploads/2026/08/frases-aleatorias-plugin.jpg
categories: ["Recursos y Utilidades", "WordPress"]
tags: ["blog", "frases aleatorias", "plugins wordpress", "wordpress"]
type: post
lang: es
---

# Plugin de WordPress para frases aleatorias

Valencia, 29/08/2026, G.B.

Tal y comenté recientemente en [este post](https://indaga.net/script-para-cargar-frases-aleatorias-como-gadget-en-blogger), aquí va el plugin de WordPress para frases aleatorias. Os paso tamién el archivo.php.

Recordad que para subie un plugin a WordPress (que no esté en el repositorio, como es el caso), hay que crear una carpeta con el mismo nombre del archivo .php, comprimirlo en .zip y subirlo por FT Oo SFTP (mejor esto último) al apartado del escritorio de WordPress «Suir plugin».

Aquí va e código de la primera versión del plugin. Si no consigues verlo correcatente en este post, descarga el archivo frases-aleatorias.zip de mi cuenta de [pCloud](https://e.pcloud.link/publink/show?code=XZscoy7ZOO7cgmk4xAYqfkya37prD8ftePLX) e instálalo en WordPRess – > Plugins.

> <?php
> /**
> * Plugin Name: Frases Aleatorias Widget
> * Description: Widget, shortcode
>
>
>
>
> [Traducir al castellano](#)
>
> Otra frase
>
>
> y panel de administración para gestionar frases (añadir, editar, eliminar). Cada frase incluye enlace de traducción automática al castellano. Sin dependencias externas.
> * Version: 2.0
> * Author: Puntocomunica.com
> */
> if ( ! defined( ‘ABSPATH’ ) ) {
> exit; // Salida directa no permitida.
> }
> define( ‘FA_TABLA’, ‘fa_frases’ ); // se le añadirá el prefijo de WP al usarla
> /* ==========================================================
> * INSTALACIÓN: crea la tabla y la rellena con las 50 frases
> * la primera vez que se activa el plugin.
> * ========================================================== */
> function fa_activar_plugin() {
> global $wpdb;
> $tabla = $wpdb->prefix . FA_TABLA;
> $charset_collate = $wpdb->get_charset_collate();
> $sql = «CREATE TABLE $tabla (
> id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
> texto TEXT NOT NULL,
> autor VARCHAR(191) NOT NULL,
> PRIMARY KEY (id)
> ) $charset_collate;»;
> require_once ABSPATH . ‘wp-admin/includes/upgrade.php’;
> dbDelta( $sql );
> // Solo se siembran datos si la tabla está vacía (primera instalación)
> $total = $wpdb->get_var( «SELECT COUNT(*) FROM $tabla» );
> if ( (int) $total === 0 ) {
> $frases_iniciales = array(
> array( «He who blames others has a long way to go on his journey. He who blames himself is halfway there. He who blames no one has arrived.», «Chinese Proverb» ),
> array( «The only way to do great work is to love what you do.», «Steve Jobs» ),
> array( «In the middle of difficulty lies opportunity.», «Albert Einstein» ),
> array( «It does not matter how slowly you go as long as you do not stop.», «Confucius» ),
> array( «Fall seven times, stand up eight.», «Japanese Proverb» ),
> array( «The journey of a thousand miles begins with a single step.», «Lao Tzu» ),
> array( «Whether you think you can or you think you can’t, you’re right.», «Henry Ford» ),
> array( «The best way to predict the future is to create it.», «Abraham Lincoln» ),
> array( «Success is not final, failure is not fatal: it is the courage to continue that counts.», «Winston Churchill» ),
> array( «Believe you can and you’re halfway there.», «Theodore Roosevelt» ),
> array( «Do not go where the path may lead, go instead where there is no path and leave a trail.», «Ralph Waldo Emerson» ),
> array( «The mind is everything. What you think you become.», «Buddha» ),
> array( «Water which is too pure has no fish.», «Chinese Proverb» ),
> array( «A smooth sea never made a skilled sailor.», «African Proverb» ),
> array( «He that can have patience can have what he will.», «Benjamin Franklin» ),
> array( «You miss 100% of the shots you don’t take.», «Wayne Gretzky» ),
> array( «Life is what happens when you’re busy making other plans.», «John Lennon» ),
> array( «The only impossible journey is the one you never begin.», «Tony Robbins» ),
> array( «Not all those who wander are lost.», «J.R.R. Tolkien» ),
> array( «It always seems impossible until it’s done.», «Nelson Mandela» ),
> array( «Do what you can, with what you have, where you are.», «Theodore Roosevelt» ),
> array( «If you want to go fast, go alone. If you want to go far, go together.», «African Proverb» ),
> array( «The best time to plant a tree was 20 years ago. The second best time is now.», «Chinese Proverb» ),
> array( «What lies behind us and what lies before us are tiny matters compared to what lies within us.», «Ralph Waldo Emerson» ),
> array( «Turn your wounds into wisdom.», «Oprah Winfrey» ),
> array( «Knowing yourself is the beginning of all wisdom.», «Aristotle» ),
> array( «The unexamined life is not worth living.», «Socrates» ),
> array( «He who has a why to live can bear almost any how.», «Friedrich Nietzsche» ),
> array( «Out of difficulties grow miracles.», «Jean de La Bruyère» ),
> array( «A journey of a thousand miles must begin with a single step.», «Lao Tzu» ),
> array( «Even a small star shines in the darkness.», «Finnish Proverb» ),
> array( «The bamboo that bends is stronger than the oak that resists.», «Japanese Proverb» ),
> array( «Better to light a candle than curse the darkness.», «Chinese Proverb» ),
> array( «When the winds of change blow, some build walls, others build windmills.», «Chinese Proverb» ),
> array( «Fall down seven times, get up eight.», «Japanese Proverb» ),
> array( «One who plants a tree knows they will not sit in its shade.», «Indian Proverb» ),
> array( «The nail that sticks out gets hammered down.», «Japanese Proverb» ),
> array( «A single arrow is easily broken, but not ten in a bundle.», «Japanese Proverb» ),
> array( «He who has never failed has never tried anything new.», «African Proverb» ),
> array( «Even the greatest of trees was once a nut who held its ground.», «American Proverb» ),
> array( «The river that forgets its source will dry up.», «African Proverb» ),
> array( «A bird does not sing because it has an answer, it sings because it has a song.», «Chinese Proverb» ),
> array( «Patience is bitter, but its fruit is sweet.», «Aristotle» ),
> array( «He who is not courageous enough to take risks will accomplish nothing in life.», «Muhammad Ali» ),
> array( «The best preparation for tomorrow is doing your best today.», «H. Jackson Brown Jr.» ),
> array( «Success usually comes to those who are too busy to be looking for it.», «Henry David Thoreau» ),
> array( «Do not wait for the perfect moment, take the moment and make it perfect.», «Unknown» ),
> array( «Great things are done by a series of small things brought together.», «Vincent van Gogh» ),
> array( «Perseverance is not a long race; it is many short races one after the other.», «Walter Elliot» ),
> array( «You cannot cross the sea merely by standing and staring at the water.», «Rabindranath Tagore» ),
> );
> foreach ( $frases_iniciales as $f ) {
> $wpdb->insert( $tabla, array( ‘texto’ => $f[0], ‘autor’ => $f[1] ) );
> }
> }
> }
> register_activation_hook( __FILE__, ‘fa_activar_plugin’ );
> /* ==========================================================
> * FUNCIONES DE ACCESO A DATOS
> * ========================================================== */
> function fa_obtener_frases() {
> global $wpdb;
> $tabla = $wpdb->prefix . FA_TABLA;
> return $wpdb->get_results( «SELECT id, texto, autor FROM $tabla ORDER BY id ASC» );
> }
> function fa_obtener_frases_json() {
> $frases = fa_obtener_frases();
> $salida = array();
> foreach ( $frases as $f ) {
> $salida[] = array( ‘texto’ => $f->texto, ‘autor’ => $f->autor );
> }
> return wp_json_encode( $salida );
> }
> /* ==========================================================
> * RENDERIZADO EN PORTADA (widget y shortcode)
> * Incluye enlace de traducción automática al castellano
> * (Google Translate), generado por JS según la frase mostrada.
> * ========================================================== */
> function fa_render_markup_y_script( $instancia_id ) {
> ob_start();
> ?>
> <div id=»fa-widget-<?php echo esc_attr( $instancia_id ); ?>» class=»fa-widget» style=»font-family: Georgia, serif; padding: 16px; border-left: 4px solid #444; background: #f9f9f9;»>
> <p class=»fa-texto» style=»font-style: italic; font-size: 16px; line-height: 1.5; margin: 0 0 8px 0;»></p>
> <p class=»fa-autor» style=»text-align: right; font-weight: bold; margin: 0 0 8px 0;»></p>
> <p style=»text-align: right; margin: 0 0 12px 0;»>
> <a class="»fa-traducir»" href="»#»" target="»_blank»" rel="»noopener" noreferrer»="" style="»font-size:" 13px;="" text-decoration:="" underline;»="" data-wpel-link="internal">Traducir al castellano</a>
> </p>
> <button class=»fa-btn» type=»button» style=»cursor: pointer; padding: 6px 14px; border: none; border-radius: 4px; background: #444; color: #fff; font-size: 14px;»>Otra frase</button>
> </div>
> <script>
> (function() {
> var frases = <?php echo fa_obtener_frases_json(); ?>;
> var contenedor = document.getElementById(‘fa-widget-<?php echo esc_js( $instancia_id ); ?>’);
> if (!contenedor || !frases.length) return;
> var elTexto = contenedor.querySelector(‘.fa-texto’);
> var elAutor = contenedor.querySelector(‘.fa-autor’);
> var elTraducir = contenedor.querySelector(‘.fa-traducir’);
> var elBtn = contenedor.querySelector(‘.fa-btn’);
> function mostrarFraseAleatoria() {
> var indice = Math.floor(Math.random() * frases.length);
> var frase = frases[indice];
> elTexto.textContent = ‘\u201C’ + frase.texto + ‘\u201D’;
> elAutor.textContent = ‘\u2014 ‘ + frase.autor;
> elTraducir.href = ‘https://translate.google.com/?sl=en&tl=es&text=’ + encodeURIComponent(frase.texto) + ‘&op=translate’;
> }
> elBtn.addEventListener(‘click’, mostrarFraseAleatoria);
> mostrarFraseAleatoria();
> })();
> </script>
> <?php
> return ob_get_clean();
> }
> function fa_shortcode_frases_aleatorias() {
> static $contador = 0;
> $contador++;
> return fa_render_markup_y_script( ‘sc-‘ . $contador );
> }
> add_shortcode( ‘frases_aleatorias’, ‘fa_shortcode_frases_aleatorias’ );
> class FA_Widget_Frases extends WP_Widget {
> public function __construct() {
> parent::__construct(
> ‘fa_widget_frases’,
> __( ‘Frase Aleatoria’, ‘frases-aleatorias’ ),
> array( ‘description’ => __( ‘Muestra una frase célebre al azar, con enlace de traducción y botón para cambiarla.’, ‘frases-aleatorias’ ) )
> );
> }
> public function widget( $args, $instance ) {
> echo $args[‘before_widget’];
> if ( ! empty( $instance[‘titulo’] ) ) {
> echo $args[‘before_title’] . apply_filters( ‘widget_title’, $instance[‘titulo’] ) . $args[‘after_title’];
> }
> echo fa_render_markup_y_script( ‘widget-‘ . $this->id );
> echo $args[‘after_widget’];
> }
> public function form( $instance ) {
> $titulo = ! empty( $instance[‘titulo’] ) ? $instance[‘titulo’] : __( ‘Frase del día’, ‘frases-aleatorias’ );
> ?>
> <p>
> <label for=»<?php echo esc_attr( $this->get_field_id( ‘titulo’ ) ); ?>»><?php _e( ‘Título:’, ‘frases-aleatorias’ ); ?></label>
> <input class=»widefat» id=»<?php echo esc_attr( $this->get_field_id( ‘titulo’ ) ); ?>» name=»<?php echo esc_attr( $this->get_field_name( ‘titulo’ ) ); ?>» type=»text» value=»<?php echo esc_attr( $titulo ); ?>»>
> </p>
> <?php
> }
> public function update( $new_instance, $old_instance ) {
> $instance = array();
> $instance[‘titulo’] = ( ! empty( $new_instance[‘titulo’] ) ) ? sanitize_text_field( $new_instance[‘titulo’] ) : »;
> return $instance;
> }
> }
> add_action( ‘widgets_init’, function () {
> register_widget( ‘FA_Widget_Frases’ );
> } );
> /* ==========================================================
> * PANEL DE ADMINISTRACIÓN: listar, añadir, editar, eliminar
> * ========================================================== */
> add_action( ‘admin_menu’, function () {
> add_menu_page(
> ‘Frases Aleatorias’,
> ‘Frases Aleatorias’,
> ‘manage_options’,
> ‘fa-frases’,
> ‘fa_pagina_admin’,
> ‘dashicons-format-quote’,
> 58
> );
> } );
> function fa_pagina_admin() {
> if ( ! current_user_can( ‘manage_options’ ) ) {
> return;
> }
> global $wpdb;
> $tabla = $wpdb->prefix . FA_TABLA;
> /* ———- Procesar acciones enviadas por formulario ———- */
> if ( isset( $_POST[‘fa_accion’] ) && check_admin_referer( ‘fa_guardar_frase’, ‘fa_nonce’ ) ) {
> $texto = isset( $_POST[‘fa_texto’] ) ? sanitize_textarea_field( wp_unslash( $_POST[‘fa_texto’] ) ) : »;
> $autor = isset( $_POST[‘fa_autor’] ) ? sanitize_text_field( wp_unslash( $_POST[‘fa_autor’] ) ) : »;
> if ( $texto !== » && $autor !== » ) {
> if ( $_POST[‘fa_accion’] === ‘crear’ ) {
> $wpdb->insert( $tabla, array( ‘texto’ => $texto, ‘autor’ => $autor ) );
> echo ‘<div class=»notice notice-success is-dismissible»><p>Frase añadida.</p></div>’;
> } elseif ( $_POST[‘fa_accion’] === ‘actualizar’ && ! empty( $_POST[‘fa_id’] ) ) {
> $wpdb->update( $tabla, array( ‘texto’ => $texto, ‘autor’ => $autor ), array( ‘id’ => (int) $_POST[‘fa_id’] ) );
> echo ‘<div class=»notice notice-success is-dismissible»><p>Frase actualizada.</p></div>’;
> }
> } else {
> echo ‘<div class=»notice notice-error is-dismissible»><p>El texto y el autor no pueden estar vacíos.</p></div>’;
> }
> }
> if ( isset( $_GET[‘fa_eliminar’] ) && check_admin_referer( ‘fa_eliminar_frase’ ) ) {
> $wpdb->delete( $tabla, array( ‘id’ => (int) $_GET[‘fa_eliminar’] ) );
> echo ‘<div class=»notice notice-success is-dismissible»><p>Frase eliminada.</p></div>’;
> }
> /* ———- ¿Estamos editando una frase? ———- */
> $editando = null;
> if ( isset( $_GET[‘fa_editar’] ) ) {
> $editando = $wpdb->get_row( $wpdb->prepare( «SELECT * FROM $tabla WHERE id = %d», (int) $_GET[‘fa_editar’] ) );
> }
> $frases = fa_obtener_frases();
> ?>
> <div class=»wrap»>
> <h1>Frases Aleatorias</h1>
> <p>Shortcode: <code>
>
>
>
>
> [Traducir al castellano](#)
>
> Otra frase
>
>
> </code> · También disponible como widget en Apariencia → Widgets.</p>
> <h2><?php echo $editando ? ‘Editar frase’ : ‘Añadir nueva frase’; ?></h2>
> <form method=»post» style=»max-width: 600px;»>
> <?php wp_nonce_field( ‘fa_guardar_frase’, ‘fa_nonce’ ); ?>
> <input type=»hidden» name=»fa_accion» value=»<?php echo $editando ? ‘actualizar’ : ‘crear’; ?>»>
> <?php if ( $editando ) : ?>
> <input type=»hidden» name=»fa_id» value=»<?php echo esc_attr( $editando->id ); ?>»>
> <?php endif; ?>
> <table class=»form-table»>
> <tr>
> <th><label for=»fa_texto»>Texto (inglés)</label></th>
> <td><textarea name=»fa_texto» id=»fa_texto» rows=»3″ class=»large-text» required><?php echo $editando ? esc_textarea( $editando->texto ) : »; ?></textarea></td>
> </tr>
> <tr>
> <th><label for=»fa_autor»>Autor</label></th>
> <td><input type=»text» name=»fa_autor» id=»fa_autor» class=»regular-text» required value=»<?php echo $editando ? esc_attr( $editando->autor ) : »; ?>»></td>
> </tr>
> </table>
> <?php submit_button( $editando ? ‘Actualizar frase’ : ‘Añadir frase’ ); ?>
> <?php if ( $editando ) : ?>
> <a href="»&lt;?php" echo="" esc_url(="" admin_url(="" ‘admin.php?page="fa-frases’" )="" );="" ?="" data-wpel-link="internal">» class=»button»>Cancelar edición</a>
> <?php endif; ?>
> </form>
> <h2>Frases existentes (<?php echo count( $frases ); ?>)</h2>
> <table class=»widefat striped»>
> <thead>
> <tr>
> <th style=»width: 55%;»>Texto</th>
> <th>Autor</th>
> <th style=»width: 160px;»>Acciones</th>
> </tr>
> </thead>
> <tbody>
> <?php foreach ( $frases as $f ) : ?>
> <tr>
> <td><?php echo esc_html( $f->texto ); ?></td>
> <td><?php echo esc_html( $f->autor ); ?></td>
> <td>
> <a href="»&lt;?php" echo="" esc_url(="" admin_url(="" ‘admin.php?page="fa-frases&amp;fa_editar=’" .="" $f-="" data-wpel-link="internal">id ) ); ?>»>Editar</a>
> |
> <a href="»&lt;?php" echo="" esc_url(="" wp_nonce_url(="" admin_url(="" ‘admin.php?page="fa-frases&amp;fa_eliminar=’" .="" $f-="" data-wpel-link="internal">id ), ‘fa_eliminar_frase’ ) ); ?>»
> onclick=»return confirm(‘¿Eliminar esta frase?’);» style=»color: #b32d2e;»>Eliminar</a>
> |
> <a href="»https://translate.google.com/?sl=en&amp;tl=es&amp;text=&lt;?php" echo="" rawurlencode(="" $f-="" data-wpel-link="internal">texto ); ?>&op=translate» target=»_blank» rel=»noopener noreferrer»>Traducir</a>
> </td>
> </tr>
> <?php endforeach; ?>
> <?php if ( empty( $frases ) ) : ?>
> <tr><td colspan=»3″>Todavía no hay frases.</td></tr>
> <?php endif; ?>
> </tbody>
> </table>
> </div>
> <?php
> }
