Como hacer un plugin para wordpress: Añadir una nueva Frase

PHP, Tutoriales, Wordpress

Lo primero que haremos de lo que nos queda sera dar de alta una nueva frase. Para ello usaremos un formulario, pero con vistas al futuro usaremos también este formulario para poder editar posteriormente las frases. Primero crearemos una función para añadir la frase a la base de datos, que será la siguiente:

[codesyntax lang=”php”]

[/codesyntax]


En caso de que la frase o la categoría estén vacías devolveremos un mensaje de error que mostraremos posteriormente. Las clases de la capa que enviamos son las que usa el propio wordpress así nos ahorramos darle nosotros el diseño.

Luego comprobamos si existe nuestra tabla en la base de datos… que realmente es una mera formalidad… pues debería estar.

Limpiamos las variables de los caracteres de escape () y algo muy importante que aparece en el codex de wordpress sobre wpdb es usar la funcion escape() de wpdb para limpiarlo de posible código de ataque malicioso

Note: As with all functions in this class that execute SQL queries, you must SQL escape all inputs (e.g., wpdb->escape($user_entered_data_string)). See the section entitled Protect Queries Against SQL Injection Attacks below.

Y poco más que contar de esta función… si todo sale bien devuelve un mensaje de ok y sino pues uno de error. Realmente más que un mensaje es una capa…. para poder pasarle el estilo de update (si va bien) o error (si va mal) aparte del mensaje. Como veréis… para los mensajes usamos la funcion __() de wordpress que se usa para el tema de traducciones por si en un futuro queremos traducir nuestro plugin por ejemplo.  __() devuelve y _e() lo escribe por pantalla como si hiciéramos echo __(); El segundo parámetro es el nombre de nuestro plugin y como lo usaremos muchas veces usaremos una variable que añadiremos al comienzo de nuestro fichero php.

[codesyntax lang=”php”]

[/codesyntax]

Ahora el código del formulario que será la función que se llame cuando pulsemos en el menu Añadir Frase.

[codesyntax lang=”php”]

[/codesyntax]

Cuando demos de alta una frase nos dirigiremos a la misma página por si queremos seguir añadiendo frases por lo que lo primero que haremos será comprobar si estamos recibiendo los datos de una nueva frase para poder darla de alta. Así que comprobamos si hemos recibido algún dato “submit” en el array $_POST[]. Y aunque no sea ahora mismo necesario pues en esta página solo puede pasar cuando demos de alta, comprobamos que el valor sea igual al de “Nueva Frase” que es valor del input type=submit. No use el valor Añadir Frase pues la ñ me daba problemas aun usando código  ñ  que es el encargado de mostrar la ñ.

Con la función extract al array $_POST[] conseguimos tener en variables separadas cada clave del array así podemos usar $frase, $categoria y $autor en vez de $_POST(‘frase’), $_POST(‘categoria’) y $_POST(‘autor’).

Después de ello ya podemos llamar a la función que vimos antes para poder añadir una nueva frase.

Como ya dije anteriormente usaremos esta función también para editar alguna frase por lo que deberemos comprobar si estamos añadiendo o modificando, para ello comprobamos si existe $_GET[‘id’] y dependiendo del resultado realizamos una serie de acciones y damos valores a ciertas variables. Si estamos editando también debemos coger los datos de la frase en cuestión con la función  mdua_getFrasebyId

[codesyntax lang=”php”]

[/codesyntax]

Si existe la variable $msg la mostramos al comienzo de la página y ya podemos ponernos con el diseño de la página y la verdad es que no hay mucho más que añadir.

El resultado sería esto:

Formulario de nueva frase

Ahora para probar que esto funciona deberemos realizar la parte del listado de las frases.

9 Responses to “Como hacer un plugin para wordpress: Añadir una nueva Frase”

  1. edgarcast

    Buenas, Tengo problemas a la hora de crear la frase, me dice que la BD no es encontrado. Soy nuevo en este mundo, así que voy un poco perdido. Te dejo el código aquí abajo a ver si me puedes dar un golpe de mano. Gracias.

    prefix . "sf_frases";
    if ($wpdb->get_var("SHOW TABLES LIKE '$nombreTabla'") == $nombreTabla) {
    //Si la tabla existe...
    //No haremos nada, pero se puede comprobar lo que hay actualizarlo por si había una versión vieja, guardar una copia de lo que hay etc et..
    } else {
    //Si no existe
    $sql = "CREATE TABLE " . $nombreTabla . " (
    idFrase mediumint(9) NOT NULL AUTO_INCREMENT,
    categoria VARCHAR(20),
    frase TEXT NOT NULL,
    autor VARCHAR(50),
    PRIMARY KEY (idCita)
    );";
    $wpdb->query($sql);
    }
    }

    function sf_frases_desinstalar() {
    /* Lo que quereamos hacer al desactivar el plugin
    * * Por ejemplo borrar la bd, pero no es recomndable
    * * pues si le das sin querer perderías todos los datos

    global $wpdb;
    $nombreTabla = $wpdb->prefix . "sf_frases";

    $sql = "DROP TABLE $nombreTabla";
    $wpdb->query($sql);
    */
    }

    register_activation_hook(__FILE__, 'sf_frases_instalar');
    register_deactivation_hook(__FILE__, 'sf_frases_desinstalar');

    add_action("admin_menu", "sf_frases_menu_admin");

    function sf_frases_menu_admin() {
    global $_registered_pages;
    /* Para saber sobre niveles http://codex.wordpress.org/Roles_and_Capabilities */
    $nivel = 'administrator';
    $page = 'tools.php';

    //add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position );
    add_menu_page('Listado de Frases', 'Frases', $nivel, 'lista-frases', 'sf_listado_frases', '', 1);
    //add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function )
    add_submenu_page('lista-frases', 'Nueva Frase', 'Nueva Frase', $nivel, 'nueva-frase', 'sf_menu_addFrase');
    }

    function sf_listado_frases() {

    }

    function sf_addFrase() {

    }

    function sf_addFraseEnBD($frase, $categoria, $autor = "") {
    if (!$frase)
    return '' . __('La frase no puede estar en blanco', $nombrePlugin) . '';
    if (!$categoria)
    return '' . __('La categoría no puede estar en blanco', $nombrePlugin) . '';

    global $wpdb;
    $table_name = $wpdb->prefix . "sf_frases";

    if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name)
    return __('Base de datos no encontrada', $nombrePlugin);
    else { //Add the quote data to the database

    $frase = stripslashes($frase);
    $categoria = stripslashes($categoria);
    $autor = stripslashes($autor);

    $frase = $wpdb->escape($frase);
    $categoria = $wpdb->escape($categoria);
    $autor = $autor ? $wpdb->escape($autor) : "";

    $insert = "INSERT INTO " . $table_name .
    "(frase, categoria, autor)" .
    "VALUES ('$frase', '$categoria', '$autor')";
    $results = $wpdb->query($insert);

    if (FALSE === $results)
    return '' . __('Se ha producido un error', $nombrePlugin) . '';
    else
    return '' . __('Frase añadida', $nombrePlugin) . '';
    }
    }

    function sf_menu_addFrase() {
    if (isset($_POST['submit'])) {
    if ($_POST['submit'] == __('Nueva Frase', $nombrePlugin)) {
    extract($_POST);
    $msg = sf_addFraseEnBD($frase, $categoria, $autor);
    }
    }
    if (isset($_GET['id']) && $_GET['id'] && is_numeric($_GET['id'])) {
    $nombrePagina = 'Editar Frase';
    $url = get_bloginfo('wpurl') . "/wp-admin/admin.php?page=lista-frases";
    $botonEnviar = __('Editar Frase', $nombrePlugin);
    $aFrase = sf_getFrasebyId($_GET['id']);
    extract($aFrase);
    $frase = htmlspecialchars($frase);
    $categoria = htmlspecialchars($categoria);
    $autor = htmlspecialchars($autor);
    $idOculto = '';
    $volver = ' ';
    } else {
    $nombrePagina = 'Añadir Frase Nueva';
    $url = get_bloginfo('wpurl') . "/wp-admin/admin.php?page=nueva-frase";
    $botonEnviar = __('Nueva Frase', $nombrePlugin);
    $frase = $categoria = $autor = $idOculto = $volver = "";
    }

    if ($msg)
    echo $msg;
    ?>

    <form name="addeditFrase" method="post" action="">

    <input type="text" id="sf_frases_categoria" name="categoria" size="40" value="" />

    <input type="text" id="sf _frases_autor" name="autor" size="40" value="" />

    <input name="submit" value="" type="submit" class="button button-primary" />

    prefix . "sf_frases WHERE idFrase = {$idFrase}";
    $resultado = $wpdb->get_row($sql, ARRAY_A);
    return $resultado;
    }

    Responder
  2. edgarcast

    perdón, no lo copié bien
    [spoiler]
    prefix . “sf_frases”;
    if ($wpdb->get_var(“SHOW TABLES LIKE ‘$nombreTabla'”) == $nombreTabla) {
    //Si la tabla existe…
    //No haremos nada, pero se puede comprobar lo que hay actualizarlo por si había una versión vieja, guardar una copia de lo que hay etc et..
    } else {
    //Si no existe
    $sql = “CREATE TABLE ” . $nombreTabla . ” (
    idFrase mediumint(9) NOT NULL AUTO_INCREMENT,
    categoria VARCHAR(20),
    frase TEXT NOT NULL,
    autor VARCHAR(50),
    PRIMARY KEY (idCita)
    );”;
    $wpdb->query($sql);
    }
    }

    function sf_frases_desinstalar() {
    /* Lo que quereamos hacer al desactivar el plugin
    * * Por ejemplo borrar la bd, pero no es recomndable
    * * pues si le das sin querer perderías todos los datos

    global $wpdb;
    $nombreTabla = $wpdb->prefix . “sf_frases”;

    $sql = “DROP TABLE $nombreTabla”;
    $wpdb->query($sql);
    */
    }

    register_activation_hook(__FILE__, ‘sf_frases_instalar’);
    register_deactivation_hook(__FILE__, ‘sf_frases_desinstalar’);

    add_action(“admin_menu”, “sf_frases_menu_admin”);

    function sf_frases_menu_admin() {
    global $_registered_pages;
    /* Para saber sobre niveles http://codex.wordpress.org/Roles_and_Capabilities */
    $nivel = ‘administrator';
    $page = ‘tools.php';

    //add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position );
    add_menu_page(‘Listado de Frases’, ‘Frases’, $nivel, ‘lista-frases’, ‘sf_listado_frases’, ”, 1);
    //add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function )
    add_submenu_page(‘lista-frases’, ‘Nueva Frase’, ‘Nueva Frase’, $nivel, ‘nueva-frase’, ‘sf_menu_addFrase’);
    }

    function sf_listado_frases() {

    }

    function sf_addFrase() {

    }

    function sf_addFraseEnBD($frase, $categoria, $autor = “”) {
    if (!$frase)
    return ” . __(‘La frase no puede estar en blanco’, $nombrePlugin) . ”;
    if (!$categoria)
    return ” . __(‘La categoría no puede estar en blanco’, $nombrePlugin) . ”;

    global $wpdb;
    $table_name = $wpdb->prefix . “sf_frases”;

    if ($wpdb->get_var(“SHOW TABLES LIKE ‘$table_name'”) != $table_name)
    return __(‘Base de datos no encontrada’, $nombrePlugin);
    else { //Add the quote data to the database

    $frase = stripslashes($frase);
    $categoria = stripslashes($categoria);
    $autor = stripslashes($autor);

    $frase = $wpdb->escape($frase);
    $categoria = $wpdb->escape($categoria);
    $autor = $autor ? $wpdb->escape($autor) : “”;

    $insert = “INSERT INTO ” . $table_name .
    “(frase, categoria, autor)” .
    “VALUES (‘$frase’, ‘$categoria’, ‘$autor’)”;
    $results = $wpdb->query($insert);

    if (FALSE === $results)
    return ” . __(‘Se ha producido un error’, $nombrePlugin) . ”;
    else
    return ” . __(‘Frase añadida’, $nombrePlugin) . ”;
    }
    }

    function sf_menu_addFrase() {
    if (isset($_POST[‘submit’])) {
    if ($_POST[‘submit’] == __(‘Nueva Frase’, $nombrePlugin)) {
    extract($_POST);
    $msg = sf_addFraseEnBD($frase, $categoria, $autor);
    }
    }
    if (isset($_GET[‘id’]) && $_GET[‘id’] && is_numeric($_GET[‘id’])) {
    $nombrePagina = ‘Editar Frase';
    $url = get_bloginfo(‘wpurl’) . “/wp-admin/admin.php?page=lista-frases”;
    $botonEnviar = __(‘Editar Frase’, $nombrePlugin);
    $aFrase = sf_getFrasebyId($_GET[‘id’]);
    extract($aFrase);
    $frase = htmlspecialchars($frase);
    $categoria = htmlspecialchars($categoria);
    $autor = htmlspecialchars($autor);
    $idOculto = ”;
    $volver = ‘ ‘;
    } else {
    $nombrePagina = ‘Añadir Frase Nueva';
    $url = get_bloginfo(‘wpurl’) . “/wp-admin/admin.php?page=nueva-frase”;
    $botonEnviar = __(‘Nueva Frase’, $nombrePlugin);
    $frase = $categoria = $autor = $idOculto = $volver = “”;
    }

    if ($msg)
    echo $msg;
    ?>

    <form name="addeditFrase" method="post" action="”>

    <input type="text" id="sf_frases_categoria" name="categoria" size="40" value="” />

    <input type="text" id="sf _frases_autor" name="autor" size="40" value="” />

    <input name="submit" value="” type=”submit” class=”button button-primary” />

    prefix . “sf_frases WHERE idFrase = {$idFrase}”;
    $resultado = $wpdb->get_row($sql, ARRAY_A);
    return $resultado;
    }

    [/spoiler]

    Responder
    • Aprendiz

      Pff así complicado cuando eso usa mejor el tag para poner tu código entre medio…. de todas formas es mucho código.

      Existe tu tabla? tiene como nombre (prefijo de wp)_nombreTabla ?

  3. edgarcast

    Siento lo del código… se me ha ido de las manos.

    La tabla la creamos en la primera función, no? En teoria la tabla se llama sf_frases. (A lo mejor la estoy diciendo muy grande, pero creo que es eso).

    Responder
  4. Aprendiz

    Entra en la base de datos y compruébalo. Mi tabla yo lo doy el nombre de mdua_frases pero realmente le concateno el prefijo que usa wordpress por ejemplo el default ‘wp_’ Por lo tanto en mi base de datos debería haber una tabla llamada ‘wp_mdua_frases’

    Responder
    • Aprendiz

      Pues entonces te sobra mucho código :) Hay que ir poco a poco, ponte con la primera parte de este tuto y solo escribe el código para activar y desactivar. Y cuando actives el plugin se te deberá crear la base de datos, sino algo está mal :D

  5. edgarcast

    Vale, he empezado de nuevo, hasta crear la tabla, cuando le doy a activar plugin me dice que el plugin se activo correctamente, pero después la BD de no me crea la tabla…

    prefix . "sf_frases";
    if ($wpdb->get_var("SHOW TABLES LIKE '$nombreTabla'") == $nombreTabla) {
    } else {
    $sql = "CREATE TABLE " . $nombreTabla . " (
    idFrase mediumint(9) NOT NULL AUTO_INCREMENT,
    categoria VARCHAR(20),
    frase TEXT NOT NULL,
    autor VARCHAR(50),
    PRIMARY KEY (idCita)
    );";
    $wpdb->query($sql);
    }
    }

    function sf_frases_desinstalar() {
    /* Lo que quereamos hacer al desactivar el plugin
    * * Por ejemplo borrar la bd, pero no es recomndable
    * * pues si le das sin querer perderías todos los datos

    global $wpdb;
    $nombreTabla = $wpdb->prefix . "sf_frases";

    $sql = "DROP TABLE $nombreTabla";
    $wpdb->query($sql);
    */
    }

    register_activation_hook(__FILE__, 'sf_frases_instalar');
    register_deactivation_hook(__FILE__, 'sf_frases_desinstalar');

    Responder
    • Aprendiz

      No se porque no se carga el comienzo del código pero aparentemente debería funcionar, no creo qeu haya cambiado nada en versiones mas nuevas de wordpress. Debuggea un poco. Así a lo bestia pon un die(‘entra’) dentro de la funcion instalar para ver si entra al código. si cuando le des a activar la pagina no se queda en blanco con un mensaje que pone entra. Es que el register_activation_hook no funciona como debería, http://codex.wordpress.org/Function_Reference/register_activation_hook

Deja un comentario

  • (will not be published)


+ 6 = 8