Soporte » Plugins y Hacks » Plugin WordPress

  • Hola,
    estoy haciendo mi primer plugin y ya he podido crear un menú personalizado. Pero tengo un link que quiero que se envié a la página hotel.php, el problema es que no sé cómo crear páginas y ya he mirado por internet pero no encuentro nada. Porque yo quiero que la página hotel.php siga teniendo el panel de control del administrador, con los menús al lado en la izquierda, header, footer, etc.
    Espero que me podáis ayudar,

    Gracias,

    Gemma

Viendo 15 respuestas - de la 1 a la 15 (de un total de 16)
  • ¿Cómo has creado el menu?

    Por ejemplo, puedes tener el plugin «miplugin». En «wp-content/plugins/miplugin» tener estos archivos:

    miplugin.php -> archivo general del plugin
    hotel.php -> tu página de administración que quieres acceder desde el menu en wp-admin, por ejemplo con este contenido:

    <h1>Wow, aquí estoy</h1>

    Podemos crear el menu así:

    add_action( 'admin_menu', function() {
      add_menu_page (
        'Titulo de la página',
        'Titulo del menu',
        'manage_options',
        'miplugin/hotel.php'
      );
    } );

    Ahora el menu tendría esta URL: wp-admin/admin.php?page=miplugin%2Fhotel.php y mostraría el contenido del archivo wp-content/plugins/miplugin/hotel.php.

    De todas formas creo que es mucho mejor utilizar el quinto parámetro de add_menu_page() y transformar el archivo hotel.php en una función que se pone en este quinto parámetro:

    add_action( 'admin_menu', function() {
      add_menu_page (
        'Titulo de la página',
        'Titulo del menu',
        'manage_options',
        'hotel',
        'function_hotel'
      );
    } );

    Ahora la URL del menu sería wp-admin/admin.php?page=hotel y mostraría el contenido creado por la funcion function_hotel:

    function function_hotel() {
    	echo '<h1>Wow, aquí estoy</h1>';
    }
    Iniciador del debate gpinyol10

    (@gpinyol10)

    Hola,
    mi plugin se llama disponibilidad-habitaciones, entonces tengo disponibilidad-habitaciones.php que es la página principal dónde creo el menú:

    ‘function menu_plugin(){
    add_menu_page(‘Disponibilidad Habitaciones’, ‘Disponibilidad Habitaciones’, ‘manage_options’, __FILE__, ‘disponibilidad_habitaciones’, plugins_url(‘/disponibilidad-habitaciones/hotel.png’,__DIR__),6);
    add_submenu_page(__FILE__, ‘Nueva Tarifa’, ‘Nueva Tarifa’, ‘manage_options’, __FILE__.’/nuevaTarifa’, ‘nuevaTarifa’);
    add_submenu_page(__FILE__, ‘Cargar Precios’, ‘Cargar Precios’, ‘manage_options’, __FILE__.’/cargarPrecios’, ‘cargarPrecios’);
    add_menu_page (
    ‘Habitaciones’,
    ‘Disponibilidad Habitaciones’,
    ‘manage_options’,
    ‘disponibilidad-habitaciones/habitaciones.php’
    );
    }

    function disponibilidad_habitaciones(){
    echo «<h3>Disponibilidad Habitaciones Hotel Playa Golf Sitges</h3>»;
    }

    add_action(‘admin_menu’,’menu_plugin’);’

    La página se llama habitaciones.php, si entro así:
    http://sunwayvps1.telematic.cat:7080/hotelplayagolfsitges2/wp-admin/admin.php?page=disponibilidad-habitaciones%2Fhabitaciones.php

    me dice que no tengo permisos para entrar.

    Gracias por la respuesta rápida,

    Gemma

    me pone que

    Iniciador del debate gpinyol10

    (@gpinyol10)

    Se ha cortado:

    me pone que No se pudo cargar disponibilidad-habitaciones/habitaciones.php.

    No sé cómo poner el código cómo lo has hecho tu, lo siento por el desorden.

    Pega el código, selecciónalo y dale al botón «code», y ya está, así aparece el bloque de código perfecto.

    Estás utilizando mal tanto add_menu_page() como add_submenu_page(). Sigue el ejemplo que puse en el comentario anterior. También utilizas mal __DIR__ y __FILE__:

    Así se crearían las páginas con funciones callback, sin cargar archivos PHP concretos:

    function menu_plugin(){
        add_menu_page(
          // Título de la página
          'Disponibilidad Habitaciones',
          // Nombre del menu
          'Disponibilidad Habitaciones',
          // capcidad del usuario para acceder
          'manage_options',
          // Slug del menu
          'este_es_el_slug_para_disponibilidad_habitaciones',
           // Funcion callback para crear el contenido de la páinga
          'disponibilidad_habitaciones_callback',
          // Icono para el menu
           plugins_url('/hotel.png', __FILE__),
           // Posición del menu
           6
        );
    }
    
    function disponibilidad_habitaciones_callback() {
        echo "<h3>Disponibilidad Habitaciones Hotel Playa Golf Sitges</h3>";
    }

    Con lo anterior, se accedería a través de wp-admin/admin.php?page=este_es_el_slug_para_disponibilidad_habitaciones.

    Ahora, si quieres añadir un submenu:

    function menu_plugin(){
        add_menu_page(
          // Título de la página
          'Disponibilidad Habitaciones',
          // Nombre del menu
          'Disponibilidad Habitaciones',
          // capcidad del usuario para acceder
          'manage_options',
          // Slug del menu
          'este_es_el_slug_para_disponibilidad_habitaciones',
           // Funcion callback para crear el contenido de la páinga
          'disponibilidad_habitaciones_callback',
          // Icono para el menu
           plugins_url('/disponibilidad-habitaciones/hotel.png', __FILE__),
           // Posición del menu
           6
        );
        add_submenu_page (
           // Slug del menu padre
           'este_es_el_slug_para_disponibilidad_habitaciones',
           // Título de la páinga
           'Titulo de la subpágina',
           // Título para el menu
           'Titulo del submenu',
           // Capacidad del usuario para que pueda acceder
           'manage_options',
           // Slug del submenu
           'este_es_el_slug_para_el_submenu',
           // Función callback para generar el contenido de esta sub-página
           'subpagina_callback'
        );
    }
    
    function disponibilidad_habitaciones_callback() {
        echo "<h3>Disponibilidad Habitaciones Hotel Playa Golf Sitges</h3>";
    }
    
    function subpagina_callback() {
      echo '<h1>Estamos en la subpágina</h3>';
    }

    A esta subpágina se accedería con wp-admin/admin.php?page=este_es_el_slug_para_el_submenu.

    Si quieres cargar un archivo php concreto y no generar el contenido de la página en una función, hay que dejar la función callback en blanco, u omitirlo o poner '', y sustituir el parámetro slug por la ruta hacia ese archivo relativa a la carpeta plugins; es una ruta relativa, así que no tienes que utilizar __FILE__ que da una ruta absoluta.

    Por ejemplo, si en el submenu quieres cargar wp-content/plugins/disponibilidad-habitaciones/habitaciones.php:

    function menu_plugin(){
        add_menu_page(
          'Disponibilidad Habitaciones',
          'Disponibilidad Habitaciones',
          'manage_options',
          'este_es_el_slug_para_disponibilidad_habitaciones',
          'disponibilidad_habitaciones_callback',
           plugins_url('/disponibilidad-habitaciones/hotel.png', __FILE__),
           6
        );
        add_submenu_page (
           'este_es_el_slug_para_disponibilidad_habitaciones',
           'Titulo de la subpágina',
           'Titulo del submenu',
           'manage_options',
           // El slug se cambia por la
           // la ruta del archivo relativa al directorio plugins
           'disponibilidad-habitaciones/habitaciones.php',
           // Función callback se deja en blanco
           ''
        );
    }
    
    function disponibilidad_habitaciones_callback() {
        echo "<h3>Disponibilidad Habitaciones Hotel Playa Golf Sitges</h3>";
    }
    Iniciador del debate gpinyol10

    (@gpinyol10)

    Gracias, si que he podido ahora crear un submenu que enlaza a otra página y no a una función.
    Pero sigo sin saber cómo poner lo del link.
    Por ejemplo tengo

    <a href="habitacion.php">Editar habitación</a>

    o

    <form action="habitacion.php" ......> </form>

    Si yo clico a Editar habitación, o envio el formulario, este tiene que ir a habitacion.php, pero cómo creo esta página para que siga teniendo el panel de administración de admin? Tal y cómo las páginas de submenú.

    Gracias,

    Gemma

    Si las habitaciones son un tipo de contenido de tu web que tienes que crear y editar … ¿por que no creas un tipo de post personalizado «habitacion» y dejas que WordPress se encargue de todo, incluyendo la interfaz de creación y edición? Creo que sería muchísimo mejor. Además podrás tener todo el motor de WordPress a tu disposición, incluyendo custom fields, WP_Query, caché, attachments, y un largísimo etcétera de ventajas.

    Iniciador del debate gpinyol10

    (@gpinyol10)

    El problema es que lo estoy programando yo por mi cuenta, por ejemplo la web de habitaciones.php hace varias consultas php, por eso no lo tengo dentro de una página.
    He creado yo esa página dónde hago consultas a la base de datos, inserts, etc.
    No se pueden crear páginas como los submenu, pero que no esté en el submenú.
    Osea crear la página habitaciones.php que la tengo dentro de mi directorio de plugin manteniendo el panel de control.

    Gracias,

    Gemma

    Por eso digo que te pases al API de WordPress, te ahorrarás muchísimo trabajo y el problema desaparecerá. Con los tipos de post personalizados y los custom fields puedes definir el tipo de contenido que quieras, incuido habitaciones, no hay prácticamente límite, y WordPress se encargará de todo automáticamente o semi-auto: interfaz de creación y edición, control de acceso, templates, listados, búsquedas, comentarios, shortcodes, taxonomías ….. y registrar un tipo de post personalizado para tus habitaciones no te costará más que unas pocas líneas de código:

    add_action( 'init', 'register_habitacon_post_type' );
    function codex_custom_init() {
        $args = array(
          'public' => true,
          'label'  => 'Habitaciones'
        );
        register_post_type( 'habitacion', $args );
    }

    Puedes ver todas las opciones disponibles en register_post_type().

    Luego con los custom fields puedes ir añadiendo información adicional que complete tu tipo de contenido. Por ejemplo, precio por noche, número de camas, ….

    Lo tienes todo hecho de forma mucho más rápida y eficaz.

    Si quieres seguir con la otra opción, ya has visto como se puede hacer en los ejemplos que puse antes.

    Iniciador del debate gpinyol10

    (@gpinyol10)

    Hola,
    prefiero crear yo misma las páginas ya que no lo domino lo suficiente lo de la API de WordPress.

    Tengo este código:

    function menu_plugin(){
        add_menu_page(
        // Título de la página
            'Disponibilidad Habitaciones',
            // Nombre del menu
            'Disponibilidad Habitaciones',
            // capcidad del usuario para acceder
            'manage_options',
            // Slug del menu
            'disponibilidad_habitaciones',
            // Funcion callback para crear el contenido de la páinga
            'disponibilidad_habitaciones',
            // Icono para el menu
            plugins_url('/hotel.png', __FILE__),
            // Posición del menu
            6
        );
        add_submenu_page (
        // Slug del menu padre
            'disponibilidad_habitaciones',
            // Título de la páinga
            'Nueva Tarifa',
            // Título para el menu
            'Nueva Tarifa',
            // Capacidad del usuario para que pueda acceder
            'manage_options',
            // Slug del submenu
            'disponibilidad-habitaciones/nuevaTarifa.php',
            // Función callback para generar el contenido de esta sub-página
            ''
        );
        add_submenu_page (
        // Slug del menu padre
            'disponibilidad_habitaciones',
            // Título de la páinga
            'Insertar Precios',
            // Título para el menu
            'Insertar Precios',
            // Capacidad del usuario para que pueda acceder
            'manage_options',
            // Slug del submenu
            'disponibilidad-habitaciones/insertarPrecios.php',
            // Función callback para generar el contenido de esta sub-página
            ''
        );
        add_pages_page (
        // Slug del menu padre
            'disponibilidad_habitaciones',
            // Título de la páinga
            'Habitacion',
            // Título para el menu
            'Habitacion',
            // Capacidad del usuario para que pueda acceder
            'manage_options',
            // Slug del submenu
            'disponibilidad-habitaciones/habitacion.php',
            // Función callback para generar el contenido de esta sub-página
            ''
        );
    }
    
    add_action('admin_menu','menu_plugin');

    La página habitacion.php no quiero que sea un submenu, por eso mismo no puedo crearla como add_submenu_page, pero tampoco me funciona como add_pages_page, ya que si intento entrar, me dice que no tengo suficientes permisos. Estoy creando mal una página normal y corriente que no esté en el menú ni el submenú?

    Gracias,

    Gemma

    Ya puse en mi primer mensaje de este hilo un ejemplo para crear menus y que cargue un scripth php. Míralo. Todos los ejemplos que he puesto los he probado antes y funcionan. De todas formas, si no consigues hacerlo y con una función callback sí, utiliza esa función para cargar lo que tengas en los otros archivos.

    Pero vamos, en 7 horas que llevamos con este hilo en el foro hubieses aprendido a trabajar con tipos de posts personalizados más que de sobra. Como viste en mi anterior mensaje, no hacen falta ni 10 líneas de código para tenerlo funcionando. Y tarde o temprano te arrepentirás de no haberlo hecho. Utilizar un gestor de contenido para luego querer gestionar tu el contenido no es muy práctico. Es un consejo de corazón.

    Iniciador del debate gpinyol10

    (@gpinyol10)

    Hola otra vez,
    siento la insistencia de verdad.
    Yo utilizo el WordPress para enseñar habitaciones y otros textos y más cosas. Pero yo quiero el plugin solo para el administrador, para que pueda cambiar algunos precios de sus habitaciones (mi jefe me ha pedido hacer este plugin personalizado porque hay muchas características que ningún plugin de WordPress hace).
    A lo mejor tienes razón y es más fácil lo de crear posts pesonalizados, pero nunca lo he hecho y voy un poco justa de tiempo para aprender a utilizar esto.
    Si que he visto el ejemplo que has puesto en tu primer mensaje, pero el menú ya lo tengo creado y los submenús también. Yo sólo quiero entrar a una página (que no es menú ni submenú) manteniendo el panel de control, tal y cómo se me muestran en las páginas de menú y de submenú pero sin hacerlas menú ni submenú.

    La dirección:
    http://sunwayvps1.telematic.cat:7080/hotelplayagolfsitges2/wp-admin/admin.php?page=disponibilidad-habitaciones%2FinsertarPrecios.php

    insertarPrecios.php, me funciona y puedo entrar porque esta página la he creado en el submenu, igual que la de nuevaTarifa.php

    pero si por ejemplo quiero acceder a:

    http://sunwayvps1.telematic.cat:7080/hotelplayagolfsitges2/wp-admin/admin.php?page=disponibilidad-habitaciones%2Fhabitacion.php

    me dice que no tengo permisos suficientes, y supongo que es porque no he creado esta página en el plugin. Por eso he pensando que a lo mejor se creaba la página sin tener que añadirla a un menú o submenu con la función add_pages_page() pero no me funciona.

    Siento mucho la insistencia, a lo mejor soy yo que no te entiendo.
    Gracias por tu paciencia,

    Gemma

    Yo sólo quiero entrar a una página (que no es menú ni submenú) manteniendo el panel de control, tal y cómo se me muestran en las páginas de menú y de submenú pero sin hacerlas menú ni submenú.

    No sé si te entiendo.

    ¿No te valdría algo así? (Solo una sugerencia)

    add_action('admin_menu','menu_plugin');
    function menu_plugin(){
        add_menu_page(
        // Título de la página
            'Habitaciones',
            // Nombre del menu
            'Habitaciones',
            // capcidad del usuario para acceder
            'manage_options',
            // Slug del menu
            'habitaciones',
            // Funcion callback para crear el contenido de la páinga
            'habitaciones_callback',
            // Icono para el menu
            plugins_url('/hotel.png', __FILE__),
            // Posición del menu
            6
        );
    }

    Ahora tendrías una página autogenerada por WordPress a la que se entra con wp-admin/admin.php?page=habitaciones, pero sin contenido. El contenido se imprimirá en la función callback.

    Luego puedes construir URLs con parámetros, por ejemplo:

    wp-admin/admin.php?page=habitaciones&action=insertar-precios
    wp-admin/admin.php?page=habitaciones&action=disponibilidad

    Y así en la función callback podrías hacer:

    function habitaciones_callback() {
        if( $_GET['action'] == 'disponibilidad' ) {
            require_once('habitacion.php');
        } elseif( $_GET['action'] == 'insertar-precios' ) {
            require_once('insertarPrecios.php');
        }
    }

    Y así vas cambiando el contenido como necesites sin tener que crear submenus.

    Iniciador del debate gpinyol10

    (@gpinyol10)

    Hola,
    creo que no nos entendemos.
    No sé cómo explicarme mejor.
    La manera que me has puesto ahora, se ha creado un menú Habitaciones. Pero yo no quiero que habitaciones sea un menú. El menú ya es Disponibilidad Habitaciones y tengo dos submenú Nueva Tarifa y Insertar Precios. Hasta ahí bien y todo funciona.
    Pero si por ejemplo estoy dentro de Insertar Precios y quiero hacer un link que vaya a una página habitaciones.php, cómo hago el link a esa página? Ya que habitaciones.php no es ni menú ni submenú, sólo es una página más de mi plugin.
    Si yo hago esto en Insertar Precios:

    <a href="habitaciones.php">Ver habitaciones </a>

    Si clico, me irá a la página habitaciones.php pero que esta página ya no tendrá la estructura del panel de control del administrador, es decir no se verá a la izquierda el menú de entradas, ajustes, posts, etc etc.
    Yo quiero que habitaciones.php forme parte de mi plugin pero sin que sea ni menú ni submenú y que siga manteniendo la estructura del panel de control.

    No sé si ahora me he explicado mejor.

    Muchas gracias,

    Gemma

    Obviamente los ejemplos que pongo son eso, ejemplos, no pretendo que lo copies y pegues y sea exactamente lo que quieres, intento mostrar los métodos que se me ocurren para que tú los implementes como desees.

    Y como método para mostrar diferentes contenidos sin tener que crear nuevos menús o submenús, definitivamente el último ejemplo que te puse es lo mejor que se me ocurre: carga diferentes archivos PHP según necesites utilizando la función callback del menú/submenú y variables en la URL.

    Iniciador del debate gpinyol10

    (@gpinyol10)

    Haciéndolo de esta manera si que puedo hacerlo, pero pensaba que lo que yo pedía, crear páginas web sin que sea menú o submenú, sería algo común.
    Entonces lo haré así, con el require_once().

    Gracias por tu ayuda,

    Gemma

Viendo 15 respuestas - de la 1 a la 15 (de un total de 16)
  • El debate ‘Plugin WordPress’ está cerrado a nuevas respuestas.