{"id":2991,"date":"2017-02-16T13:57:24","date_gmt":"2017-02-16T13:57:24","guid":{"rendered":"https:\/\/antonellaframework.com\/?page_id=2991"},"modified":"2024-09-03T07:45:34","modified_gmt":"2024-09-03T07:45:34","slug":"documentacion","status":"publish","type":"page","link":"https:\/\/legacy.antonellaframework.com\/en\/documentacion\/","title":{"rendered":"Documentaci\u00f3n"},"content":{"rendered":"<section class=\"l-section wpb_row height_medium\"><div class=\"l-section-h i-cf\"><div class=\"g-cols vc_row via_grid cols_1 laptops-cols_inherit tablets-cols_inherit mobiles-cols_1 valign_top type_default stacking_default\"><div class=\"wpb_column vc_column_container\"><div class=\"vc_column-inner\">[vc_custom_heading text=&#8221;We need translate to english!. please contact in twitter account @Antonella_FW&#8221; font_container=&#8221;tag:h2|text_align:center&#8221; use_theme_fonts=&#8221;yes&#8221; link=&#8221;url:https%3A%2F%2Ftwitter.com%2FAntonella_FW||target:%20_blank|rel:nofollow&#8221;]\n<section class=\"l-section wpb_row height_medium\"><div class=\"l-section-h i-cf\"><div class=\"g-cols vc_row via_grid cols_custom laptops-cols_inherit tablets-cols_inherit mobiles-cols_1 valign_top type_default stacking_default\"><\/div><\/div><\/section><div class=\"wpb_column vc_column_container\"><div class=\"vc_column-inner\"><\/div><\/div><div class=\"wpb_text_column\"><div class=\"wpb_wrapper\"><p><a href=\"https:\/\/legacy.antonellaframework.com\/documentacion\/1-1\/\">Ver 1.1\u00a0<\/a> \u00a0|\u00a0 <a href=\"https:\/\/legacy.antonellaframework.com\/documentacion\/1-0\/\">Ver. 1.0<\/a> |\u00a0 <a href=\"https:\/\/legacy.antonellaframework.com\/documentacion\/1-2\/\">Ver. 1.2<\/a> | <a href=\"https:\/\/legacy.antonellaframework.com\/documentacion\/1-5\/\">Ver. 1.5<\/a> | <a href=\"https:\/\/legacy.antonellaframework.com\/documentacion\/1-6\/\">Ver. 1.6<\/a> | <a href=\"https:\/\/legacy.antonellaframework.com\/documentacion\/1-7\/\">Ver 1.7 <\/a>\u00a0| Ver 1.8<\/p>\n<\/div><\/div><div class=\"w-tabs us_custom_7d5e32d4 layout_ver navwidth_auto navpos_left style_default switch_click has_scrolling\" style=\"--sections-title-size:1em\"><div class=\"w-tabs-list items_12 align_none\"><div class=\"w-tabs-list-h\"><button class=\"w-tabs-item active\" aria-controls=\"content-j1d8\" aria-expanded=\"false\"><span class=\"w-tabs-item-title\">Pr\u00f3logo<\/span><\/button><button class=\"w-tabs-item\" aria-controls=\"content-z461\" aria-expanded=\"false\"><span class=\"w-tabs-item-title\">Primeros Pasos<\/span><\/button><button class=\"w-tabs-item\" aria-controls=\"content-yaad\" aria-expanded=\"false\"><span class=\"w-tabs-item-title\">Configuraci\u00f3n<\/span><\/button><button class=\"w-tabs-item\" aria-controls=\"content-ade7\" aria-expanded=\"false\"><span class=\"w-tabs-item-title\">Lo B\u00e1sico<\/span><\/button><button class=\"w-tabs-item\" aria-controls=\"content-t01a\" aria-expanded=\"false\"><span class=\"w-tabs-item-title\">Testing en Localhost<\/span><\/button><button class=\"w-tabs-item\" aria-controls=\"content-m249\" aria-expanded=\"false\"><span class=\"w-tabs-item-title\">Dos v\u00edas de trabajo<\/span><\/button><button class=\"w-tabs-item\" aria-controls=\"content-k492\" aria-expanded=\"false\"><span class=\"w-tabs-item-title\">APIs Endpoint<\/span><\/button><button class=\"w-tabs-item\" aria-controls=\"content-q74c\" aria-expanded=\"false\"><span class=\"w-tabs-item-title\">Consola<\/span><\/button><button class=\"w-tabs-item\" aria-controls=\"content-j9f2\" aria-expanded=\"false\"><span class=\"w-tabs-item-title\">Gutenberg<\/span><\/button><button class=\"w-tabs-item\" aria-controls=\"content-ad27\" aria-expanded=\"false\"><span class=\"w-tabs-item-title\">Packages<\/span><\/button><button class=\"w-tabs-item with_icon\" aria-controls=\"content-bf8f\" aria-expanded=\"false\"><i class=\"fas fa-docker\"><\/i><span class=\"w-tabs-item-title\">Docker<\/span><\/button><button class=\"w-tabs-item\" aria-controls=\"content-y2a4\" aria-expanded=\"false\"><span class=\"w-tabs-item-title\">Blade<\/span><\/button><\/div><\/div><div class=\"w-tabs-sections titles-align_none icon_chevron cpos_right\"><div class=\"w-tabs-section active\" id=\"j1d8\"><button class=\"w-tabs-section-header active\" aria-controls=\"content-j1d8\" aria-expanded=\"true\"><div class=\"w-tabs-section-title\">Pr\u00f3logo<\/div><div class=\"w-tabs-section-control\"><\/div><\/button><div  class=\"w-tabs-section-content\" id=\"content-j1d8\"><div class=\"w-tabs-section-content-h i-cf\"><div class=\"wpb_text_column\"><div class=\"wpb_wrapper\"><h1>Notas de la Versi\u00f3n<\/h1>\n<p>Antonella Framework ha sido creado para poder hacer plugins en equipo o individual de forma limpia y ordenada. Usando el sistema de clases, con estructura PSR-4 hace que podamos preocuparnos por el funcionamiento del plugin y realizar la continuaci\u00f3n de la misma con una curva de aprendizaje corta.<\/p>\n<h2>Versi\u00f3n 1.8<\/h2>\n<h3>Compatibilidad con PHP8<\/h3>\n<p>Se ha hecho compatibilidad con PHP8 con esta versi\u00f3n<\/p>\n<h3>Integraci\u00f3n con Docker<\/h3>\n<p>Es posible usar docker para el desarrollo en tiempo real del plugin usando <a href=\"https:\/\/www.docker.com\/products\/docker-desktop\/\" target=\"_blank\" rel=\"noopener\">Docker desktop.<\/a> Puedes usarlo de forma habitual [code]docker-compose up[\/code]o usando los comandos de Antonella console:<\/p>\n<p>[code]php antonella docker[\/code]<\/p>\n<p>La visualizaci\u00f3n del WordPress ser\u00e1 en http:\/\/localhost:8080. Todo lo que modifiques en el proyecto se ver\u00e1 el tiempo real sin necesidad de usar los comandos de serve o test refresh<\/p>\n<h3>APIs endpoints<\/h3>\n<p>Puedes crear rutas API REST de forma f\u00e1cil y sencilla solo rellenando los arrays en Config.php<\/p>\n<h3>Eliminado NELLA_URL<\/h3>\n<p>Se quita la definici\u00f3n de NELA_URL en esta versi\u00f3n.<\/p>\n<p>&nbsp;<\/p>\n<h2>Versi\u00f3n 1.7<\/h2>\n<h3>Bloques de Gutenberg<\/h3>\n<p>Puedes crear Bloques de Gutenberg desde la consola obviando la preparaci\u00f3n. As\u00ed s\u00f3lo te preocupas por el desarrollo del bloque con el archivo JS de plantilla que se ha preparado para ello a modo de ejemplo.<\/p>\n<p>[code]php antonella block mi-primer-bloque [\/code]<\/p>\n<h3>Archivo de Idioma POT por defecto<\/h3>\n<p>Se ha creado una carpeta &#8220;languages&#8221; donde se almacena el archivo antonella.pot para que sirva de base al momento de crear los idiomas para tu plugin.<\/p>\n<h3>Ajuste en Request (POST y GET)<\/h3>\n<p>En algunos casos era necesario\u00a0 agregar un <a href=\"https:\/\/legacy.antonellaframework.com\/soporte\/guardar-opciones-del-pluging-y-verificar-nonce\/\">include antes de crear una funci\u00f3n para get y post<\/a>. Ahora ya no ser\u00e1 necesario.<\/p>\n<h3>Ajuste en los Helpers<\/h3>\n<p>Cuando creabas dos plugins con antonella en un mismo WordPress generaba un error. Ya est\u00e1 solucionado.<\/p>\n<h3>Ajustes en PostType<\/h3>\n<p><a href=\"https:\/\/legacy.antonellaframework.com\/soporte\/bug-en-la-creacion-de-custom-post-types\/\">La variable\u00a0 supports al crear el PostType se definian en singluar<\/a> y WordPress lo ignoraba. Ya est\u00e1 solucionado.<\/p>\n<p>Cuando creabas un PostType ignoraba la traducci\u00f3n. Ya est\u00e1 solucionado.<\/p>\n<h2>Versi\u00f3n 1.6<\/h2>\n<h3 class=\"_2cuy _50a1 _2vxa\">LIVE TESTING:<\/h3>\n<div class=\"_2cuy _3dgx _2vxa\">Posibilidad de hacer test con un WP de prueba dentro del proyecto. Posibilidad de refrescar el proyecto cada vez que se haga un cambio. Posibilidad de ver un error en el c\u00f3digo durante el testeo (en el refresco). Creaci\u00f3n de archivo .env para la configuraci\u00f3n de la base de datos en testeo y de .env-example para ver un ejemplo.<\/div>\n<div class=\"_2cuy _3dgx _2vxa\">Ser\u00e1 necesario MySQL o MariaDB.<\/div>\n<div>Nuevos comandos para antonella relacionados con este apartado:<\/div>\n<div>Montar el servidor de testing<\/div>\n<div>[code]php antonella serve[\/code]<\/div>\n<div>Refrescar los cambios hechos en el desarrollo y mostrarlos en el servidor de testing<\/div>\n<div>[code]php antonella test refresh[\/code]<\/div>\n<div>El servidor local de prueba se ejecuta en el puerto 8010<\/div>\n<blockquote>\n<div>http:\/\/localhost:8010<\/div>\n<\/blockquote>\n<div class=\"_2cuy _3dgx _2vxa\"><\/div>\n<h3 class=\"_2cuy _50a1 _2vxa\">POSTTYPES:<\/h3>\n<div class=\"_2cuy _3dgx _2vxa\">Se ha mejorado la funci\u00f3n para crear Custom PostTypes de forma sencilla y de forma compleja, todo en el mismo array del config. Tambi\u00e9n puedes crear taxonom\u00edas dentro de la misma creaci\u00f3n del CPT con solo poner el nombre de la nueva taxonom\u00eda. correcciones en la posici\u00f3n del CPT en el men\u00fa del admin y que pueda aceptar como icono un string base64 o un dashicon de wp.<\/div>\n<div class=\"_2cuy _3dgx _2vxa\"><\/div>\n<h3 class=\"_2cuy _50a1 _2vxa\">TAXONOM\u00cdAS:<\/h3>\n<div class=\"_2cuy _3dgx _2vxa\">Se ha creado la posibilidad de crear taxonom\u00edas desde el config.php tambi\u00e9n de forma sencilla y avanzada<\/div>\n<div class=\"_2cuy _3dgx _2vxa\"><\/div>\n<h3 class=\"_2cuy _50a1 _2vxa\">HELPERS:<\/h3>\n<div class=\"_2cuy _3dgx _2vxa\">Damos las bienvenida a los helpers para antonella. Creaci\u00f3n del helper &#8220;view&#8221; para usarlo en blade sin necesidad de asignar las rutas de cach\u00e9 cada vez que lo invoques. Creaci\u00f3n de helpers propios por la consola [code]antonella helper NombreDelHelper[\/code]<\/div>\n<div class=\"_2cuy _3dgx _2vxa\"><\/div>\n<h3 class=\"_2cuy _50a1 _2vxa\">BLADE:<\/h3>\n<div class=\"_2cuy _3dgx _2vxa\">Se preguntar\u00e1 si necesitar\u00e1 blade en el proyecto, ya no se instalar\u00e1 por defecto.<\/div>\n<div class=\"_2cuy _3dgx _2vxa\"><\/div>\n<h3 class=\"_2cuy _50a1 _2vxa\">DASHBOARD:<\/h3>\n<div class=\"_2cuy _3dgx _2vxa\">Las funciones que se creaban con el dashboard sol\u00eda presentar bugs. Esto ya est\u00e1 solucionado.<\/div>\n<div class=\"_2cuy _3dgx _2vxa\"><\/div>\n<p>&nbsp;<\/p>\n<h2>Versi\u00f3n 1.5<\/h2>\n<p>\u00a1Damos la Bienvenida a Blade!. El editor de plantillas usado en Laravel se une como m\u00f3dulo para Antonella Framework.<\/p>\n<p>Nuevos comandos para Antonella Console.<\/p>\n<p>Creaci\u00f3n de nuevas carpetas para las vistas y la cach\u00e9<\/p>\n<p>Automatizaci\u00f3n del namespace al momento de la instalaci\u00f3n<\/p>\n<p>La instalaci\u00f3n de Antonella cambia de clonar al repositorio a usar este comando<\/p>\n<p>[code]composer create-project &#8211;prefer-dist cehojac\/antonella-framework-for-wp:dev-master my-awesome-plugin[\/code]<\/p>\n<p>Sistema de ayuda en Antonella console. [code]php antonella help[\/code]<\/p>\n<p><a href=\"http:\/\/tipeos.com\/anto\">Nuevo canal de Youtube para ense\u00f1ar el funcionamiento del Framework\u00a0<\/a><\/p>\n<h2>Versi\u00f3n 1.2<\/h2>\n<p>Creaci\u00f3n de Widgets con la consola antonella a trav\u00e9s del comando php antonella widget<\/p>\n<p>Ajustes de mejora de rendimiento en el sistema<\/p>\n<h2>Versi\u00f3n 1.1<\/h2>\n<p>Mejora en la creaci\u00f3n de Post Types (desde la secci\u00f3n de config).<\/p>\n<p>Correcciones de algunas funciones en la creaci\u00f3n de post Types hederadas de la versi\u00f3n 1.0<\/p>\n<h2>Versi\u00f3n 1.0<\/h2>\n<p>Sale la versi\u00f3n el cual se espera un<a href=\"https:\/\/legacy.antonellaframework.com\/soporte\/\"> feedback por parte de los usuarios.\u00a0<\/a><\/p>\n<p>Se agrega el sistema PSR-4.<\/p>\n<p>Se agrega la primera versi\u00f3n del archivo Config.php con las variables necesarias para un plugin<\/p>\n<p>Es posible incluir paquetes de terceros agreg\u00e1ndolo en el archivo composer.json<\/p>\n<p>Se agrega clases definidas para el control de POST y GET<\/p>\n<p>Clases para la creaci\u00f3n de post-type de forma f\u00e1cil<\/p>\n<p>Agregado para insertar contenido en el escritorio de administraci\u00f3n de WordPress<\/p>\n<p>Agregado control de usuarios con Clase User<\/p>\n<p>Agregado Control de instalaci\u00f3n y desinstalaci\u00f3n del plugin de forma f\u00e1cil<\/p>\n<p>&nbsp;<\/p>\n<p>Se invita a los programadores a mejorar este plugin y poder crear comunidad a base de ello.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"w-tabs-section\" id=\"z461\"><button class=\"w-tabs-section-header\" aria-controls=\"content-z461\" aria-expanded=\"false\"><div class=\"w-tabs-section-title\">Primeros Pasos<\/div><div class=\"w-tabs-section-control\"><\/div><\/button><div  class=\"w-tabs-section-content\" id=\"content-z461\"><div class=\"w-tabs-section-content-h i-cf\"><div class=\"wpb_text_column\"><div class=\"wpb_wrapper\"><h1>Instalaci\u00f3n<\/h1>\n<h3>Requerimientos M\u00ednimos<\/h3>\n<p>Antonella Framework necesita los siguientes elementos<\/p>\n<p><a href=\"https:\/\/git-scm.com\/\">GIT<\/a><\/p>\n<p><a href=\"https:\/\/getcomposer.org\/\">Composer<\/a><\/p>\n<p><a href=\"http:\/\/php.net\/downloads.php\" target=\"_blank\" rel=\"noopener noreferrer\">PHP 7.0 o superior<\/a><\/p>\n<p>En el Caso de Linux tienes que instalar el complemento <a href=\"https:\/\/duckduckgo.com\/?q=instal+php-zip+on+linux&amp;t=vivaldi&amp;ia=qa\" target=\"_blank\" rel=\"noopener noreferrer\">PHP-ZIP<\/a><\/p>\n<p>Para live testing ser\u00e1 necesario conexi\u00f3n a base de datos MYSQL o MariaDB implementados en la consola<\/p>\n<h3>Instalaci\u00f3n de Antonella Framework<\/h3>\n<p>Puedes instalarlo desde git (Debes instalarlo en una carpeta vac\u00eda)<\/p>\n<p>[code lang =&#8221;Apache&#8221;] composer create-project &#8211;prefer-dist cehojac\/antonella-framework-for-wp:dev-master tu-nombre-de-plugin [\/code]<\/p>\n<p>o<\/p>\n<p>[code lang=&#8221;shell&#8221;]composer create-project cehojac\/antonella-framework-for-wp -s dev tu-nombre-de-plugin[\/code]<\/p>\n<p>colocando donde dice &#8220;tu-nombre-de-plugin&#8221; por el nombre del plugin que vas a crear.<\/p>\n<p>Durante la instalaci\u00f3n se preguntar\u00e1 si deseas instalar el sistema de plantillas Blade para tu proyecto.<\/p>\n<p>[code lang=&#8221;Apache&#8221;]You need add blade? (Template system)\u00a0 Type &#8216;yes&#8217; or &#8216;y&#8217; to continue:[\/code]<\/p>\n<p>Luego<\/p>\n<p>[code lang=&#8221;Bash&#8221;] cd tu-nombre-de-plugin[\/code]<\/p>\n<h3>Estructura<\/h3>\n<p>El sistema de carpetas se mostrar\u00e1 de la siguiente manera:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3239 size-full\" src=\"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2020\/03\/Captura-de-pantalla-de-2020-03-15-16-48-38.png\" alt=\"\" width=\"206\" height=\"551\" srcset=\"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2020\/03\/Captura-de-pantalla-de-2020-03-15-16-48-38.png 206w, https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2020\/03\/Captura-de-pantalla-de-2020-03-15-16-48-38-112x300.png 112w\" sizes=\"auto, (max-width: 206px) 100vw, 206px\" \/><\/p>\n<p>Los archivos del Framework se encuentran en la carpeta SRC.<\/p>\n<p>Los archivos de la vista Blade se encuentran en resources -&gt; views-&gt; template<\/p>\n<p>Los helpers se encuentran en la carpeta src\/Helpers<\/p>\n<p>En el caso de realizar testing los archivos del WP de prueba se alojar\u00e1n en la carpeta wp-test<\/p>\n<p>&nbsp;<\/p>\n<h2>El Namespace<\/h2>\n<p>Al momento de instalar el proyecto Antonnella creara un &#8220;namespace&#8221; aleatorio. Puedes cambiarlo en la consola<\/p>\n<p>[code]php antonella namespace TUNAMESPACE[\/code]<\/p>\n<p>donde en el lugar &#8220;TUNAMESPACE&#8221; debes colocar el nuevo nombre para el namespace<\/p>\n<p>Si deseas generar otro namespace aleatorio solo debes poner en la consola<\/p>\n<p>[code]php antonella namespace[\/code]<\/p>\n<p>y autom\u00e1ticamente generar\u00e1 otro<\/p>\n<p>Para llamar a las funciones dentro de los archivos controladores puedes hacerlo de la siguiente manera<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<p>$tu_variable= __NAMESPACE__.TuClase::TuFuncion;<\/p>\n<p>[\/code]<\/p>\n<p>Esta funci\u00f3n puede ser reutilizado por otros plugins o addons.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"w-tabs-section\" id=\"yaad\"><button class=\"w-tabs-section-header\" aria-controls=\"content-yaad\" aria-expanded=\"false\"><div class=\"w-tabs-section-title\">Configuraci\u00f3n<\/div><div class=\"w-tabs-section-control\"><\/div><\/button><div  class=\"w-tabs-section-content\" id=\"content-yaad\"><div class=\"w-tabs-section-content-h i-cf\"><div class=\"wpb_text_column\"><div class=\"wpb_wrapper\"><h1>Configuraci\u00f3n<\/h1>\n<p>Para asignar el nombre del plugin s\u00f3lo ser\u00e1 nesesario modificar el archivo antonella-framework.php en la seccion Plugin name.<\/p>\n<p>El archivo config.php contienen un sistema de arrays para configurar tu plugin de una manera f\u00e1cil.<\/p>\n<h2>Variable Options<\/h2>\n<p>Esta variable permite introducir las variables que deseas insertar en wordpress<\/p>\n<p>Ejemplo:<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<p>\/*<br \/>\n* Plugins option<br \/>\n* storage in database the option value<br \/>\n* Array (&#8216;option_name&#8217;=&gt;&#8217;default value&#8217;)<br \/>\n* @example [&#8220;example_data&#8221; =&gt; &#8216;foo&#8217;,]<br \/>\n* @return void<br \/>\n*\/<br \/>\npublic $plugin_options=[<br \/>\n&#8220;version&#8221;=&gt;&#8221;1.0&#8221;,<br \/>\n&#8220;valor1&#8221; =&gt; &#8220;algun valor&#8221;,<br \/>\n];<\/p>\n<p>[\/code]<\/p>\n<h2>Variable language_name<\/h2>\n<p>Puedes indicar una \u00fanica palabra para indicar la traducci\u00f3n. por defecto es &#8220;antonella&#8221; pero puedes cambiarla<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<p>\/**<br \/>\n* Language Option<br \/>\n* define a unique word for translate call<br \/>\n*\/<br \/>\npublic $language_name=&#8217;antonella&#8217;;<\/p>\n<p>[\/code]<\/p>\n<h2>Variable plugin_prefix<\/h2>\n<p>indica una \u00fanica palabra para identificar el plugin. por defecto es &#8220;ch_nella&#8221; pero puedes cambiarse.<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<p>\/**<br \/>\n* Plugin text prefix<br \/>\n* define a unique word for this plugin<br \/>\n*\/<br \/>\npublic $plugin_prefix=&#8217;ch_nella&#8217;;<\/p>\n<p>[\/code]<\/p>\n<h2>Variable data_post<\/h2>\n<p>Con esto puedes controlar la llegada de las url tipo post. puedes indicar que si dentro de un post esta una variable que te interesa, invocar a una funci\u00f3n que desees<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<p>\/**<br \/>\n* POST data process<br \/>\n* get the post data and execute the function<br \/>\n* @example [&#8216;post_data&#8217;=&gt;&#8217;CH::function&#8217;]<br \/>\n*\/<br \/>\npublic $post=[&#8220;admin&#8221;=&gt;&#8221;TuClase::tufuncion&#8221;];<\/p>\n<p>&nbsp;<\/p>\n<p>[\/code]<\/p>\n<h2>Variable data_get<\/h2>\n<p>Como en el post, si hay alguna variable que venga del get que te interese puedes invocar a una funci\u00f3n<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<p>\/**<br \/>\n* GET data process<br \/>\n* get the get data and execute the function<br \/>\n* @example [&#8216;get_data&#8217;=&gt;&#8217;CH::function&#8217;]<br \/>\n*\/<br \/>\npublic $get=[&#8220;tu_variable_get&#8221;,&#8221;TuClase::TuFuncion&#8221;];<\/p>\n<p>[\/code]<\/p>\n<h2>Variable add_filter<\/h2>\n<p>Aqui puedes agregar el <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_filter\/\" target=\"_blank\" rel=\"noopener noreferrer\">filtro de WordPress<\/a> que desees, pudiendo agregar la prioridad de la ejecuci\u00f3n de la funcion y si acepta variables o no<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<p>\/**<br \/>\n* add_filter data functions<br \/>\n* @input array<br \/>\n* @example [&#8216;body_class&#8217;,&#8217;CH::function&#8217;,10,2]<br \/>\n* @example [&#8216;body_class&#8217;,[&#8216;CH&#8217;,&#8217;function&#8217;],10,2]<br \/>\n*\/<br \/>\npublic $add_filter=[<br \/>\n[&#8220;init&#8221;,&#8221;TuClase::TuFuncion&#8221;,10,1],<br \/>\n[&#8220;init&#8221;,[&#8220;TuClase&#8221;,&#8221;TuFuncion&#8221;],10,1],<br \/>\n];<\/p>\n<p>[\/code]<\/p>\n<h2>Variable add_action<\/h2>\n<p>Igual que con filter, puedes agregar<a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_action\/\" target=\"_blank\" rel=\"noopener noreferrer\"> acciones de WordPress<\/a><\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<p>\/**<br \/>\n* add_action data functions<br \/>\n* @input array<br \/>\n* @example [&#8216;body_class&#8217;,&#8217;CH::function&#8217;,10,2]<br \/>\n* @example [&#8216;body_class&#8217;,[&#8216;CH&#8217;,&#8217;function&#8217;],10,2]<br \/>\n*\/<br \/>\npublic $add_action=[<br \/>\n[&#8220;save_post&#8221;,&#8221;TuClase::TuFuncion&#8221;,10,1],<br \/>\n[&#8220;save_post&#8221;,[&#8220;TuClase&#8221;,&#8221;TuFuncion&#8221;],10,1],<br \/>\n];<br \/>\n[\/code]<\/p>\n<h2>Variable dashboard<\/h2>\n<p>Siguiendo la referencia para agregar apartados en el Escritorio de WordPress, se ha creado esta variable para configura llamando a la funci\u00f3n que desees<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<p>\/**<br \/>\n* Dashboard<br \/>\n* @reference: https:\/\/codex.wordpress.org\/Function_Reference\/wp_add_dashboard_widget<br \/>\n*\/<br \/>\npublic $dashboard=[<br \/>\n[<br \/>\n&#8216;slug&#8217;=&gt;&#8217;tu_slug&#8217;,<br \/>\n&#8216;name&#8217;=&gt;&#8217;Dato que aparece en el escritorio de WP&#8217;,<br \/>\n&#8216;function&#8217;=&gt;&#8217;TuClase::TuFuncion&#8217;,<br \/>\n&#8216;callback&#8217;=&gt;&#8221;,<br \/>\n&#8216;args&#8217;=&gt;&#8221;,<br \/>\n]<br \/>\n];<\/p>\n<p>[\/code]<\/p>\n<h2>Variable plugin_menu<\/h2>\n<p>Aqui se configura el menu del plugin, es posible agregarlo como parte principal en el Men\u00fa del escritorio de WordPress o puedes que sea una subsecci\u00f3n. depende de tu elecci\u00f3n.<\/p>\n<figure id=\"attachment_3037\" aria-describedby=\"caption-attachment-3037\" style=\"width: 156px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3037 size-full\" src=\"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2017\/02\/antonella-framework-plugin-menu.jpg\" alt=\"\" width=\"156\" height=\"79\" \/><figcaption id=\"caption-attachment-3037\" class=\"wp-caption-text\">Configuraci\u00f3n por defecto<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p>La configuraci\u00f3n del men\u00fa va de la siguiente manera:<\/p>\n<p>&#8220;path&#8221; del tipo array . si Deseas que vaya como men\u00fa principal debes indicar que es &#8220;Page&#8221;<\/p>\n<p>[code]<\/p>\n<p>&#8220;path&#8221;=&gt; [&#8220;page&#8221;],<\/p>\n<p>[\/code]<\/p>\n<p>en caso que quieres se que sea una sub-pagina de alg\u00fan apartado ser\u00eda asi<\/p>\n<p>[code]<\/p>\n<p>&#8220;path&#8221;=&gt; [&#8220;subpage&#8221;,&#8221;tools.php&#8221;],<\/p>\n<p>[\/code]<\/p>\n<p>en caso quieres que sea una opci\u00f3n de los ajustes de WordPress<\/p>\n<p>[code]<\/p>\n<p>&#8220;path&#8221;=&gt;[&#8220;option&#8221;],<\/p>\n<p>[\/code]<\/p>\n<p>&#8220;name&#8221; Es el nombre que se podr\u00e1 como titulo del menu<br \/>\n&#8220;slug&#8221; es el identificador \u00fanico de esta secci\u00f3n<br \/>\n&#8220;function&#8221; la funci\u00f3n que deseas invocar cuando se accede a esta parte de men\u00fa<\/p>\n<p>Puedes crear sub p\u00e1ginas dentro de la p\u00e1gina principal<br \/>\n[code lang=&#8221;php&#8221;]<\/p>\n<p>$plugin_menu=[<br \/>\n[<br \/>\n&#8220;path&#8221;=&gt; [&#8220;page&#8221;],<br \/>\n&#8220;name&#8221;=&gt;&#8221;My Custom Page&#8221;,<br \/>\n&#8220;function&#8221;=&gt;__NAMESPACE__.&#8221;Admin::option_page&#8221;,<br \/>\n\/\/ &#8220;icon&#8221; =&gt; &#8220;antonella-icon.png&#8221;,<br \/>\n&#8220;slug&#8221;=&gt;&#8221;my-custom-page&#8221;,<br \/>\n&#8220;subpages&#8221;=&gt;<br \/>\n[<br \/>\n[<br \/>\n&#8220;name&#8221;=&gt;&#8221;My Custom sub Page&#8221;,<br \/>\n&#8220;slug&#8221;=&gt;&#8221;my-top-sub-level-slug&#8221;,<br \/>\n&#8220;function&#8221;=&gt;__NAMESPACE__.&#8221;Admin::option_page&#8221;,<br \/>\n]<br \/>\n];<\/p>\n<p>[\/code]<\/p>\n<p>El plugin tiene un ejemplo que puedes modificar a tu gusto.<\/p>\n<h2>Variable PostType<\/h2>\n<p>Aqu\u00ed se configura la creaci\u00f3n de un post Type, puedes hacer uno o varios desde este apartado.<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<div>\n<div>public $post_types =[<\/div>\n<div>[<\/div>\n<div>&#8216;singular&#8217;=&gt;&#8217;El nombre de tu post-type en singular como por ejemplo bicicleta&#8217;,<\/div>\n<div>&#8216;plural&#8217;=&gt;&#8217;El nombre de tu post-type en plural como por ejemplo bicicletas&#8217;,<\/div>\n<div>&#8216;slug&#8217;=&gt;&#8217;la url amigable que desees&#8217;,<\/div>\n<div>&#8216;translate&#8217;=&gt;false,\u00a0 \/\/ si quieres que se incluya una traducci\u00f3n de tu post type<\/div>\n<div>&#8216;position&#8217;=&gt;4, \/\/la posicion en el menu de la administraci\u00f3n<\/div>\n<div>&#8216;taxonomy&#8217;=&gt;[&#8216;category&#8217;], \/\/para agregar taxonom\u00edas a tu post type, estas taxonom\u00edas se crean desde aqu\u00ed s\u00f3lo con poner el nombre<\/div>\n<div>&#8216;image&#8217;=&gt;&#8221;, \/\/icono de la imagen\u00a0 -&gt; debes guardarla en img y solo poner el nombre de la imagen con su extensi\u00f3n, tambi\u00e9n acepta iconos de <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\">dash-icon<\/a> y un string basado en BASE64<\/div>\n<div>&#8216;gutemberg&#8217; =&gt; true para mostrar el editor gutember en vez del clasico. Por defecto es true, Para mostrar en este PostType el editor cl\u00e1sico debe ser false el valor<\/div>\n<div>],<\/div>\n<\/div>\n<p>[\/code]<\/p>\n<p>Variables avanzadas para crear un PostType puedes agregar las variables &#8220;labels&#8221;, &#8220;args&#8221; y &#8220;rewrite&#8221; entro del array y seguir las mismas subvariables de la creaci\u00f3n de un Custom PostType\u00a0 basado en la funci\u00f3n <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/register_post_type\">registrer_post_type de WordPress<\/a><\/p>\n<h2>Variable Taxonom\u00eda<\/h2>\n<p>Aqu\u00ed se configura la creaci\u00f3n de taxonom\u00edas para PostTypes existentes o para crear taxonom\u00edas m\u00e1s complejas.<\/p>\n<p>[code]<\/p>\n<div>\n<div>public $taxonomies = [<\/div>\n<div>[<\/div>\n<div>&#8220;post_type&#8221; =&gt; &#8220;&#8221;, \/\/nombre el PostType para asignar la taxonom\u00eda<\/div>\n<div>&#8220;singular&#8221; =&gt; &#8220;&#8221;,\u00a0 \/\/nombre de la taxonom\u00eda en singular<\/div>\n<div>&#8220;plural&#8221; =&gt; &#8220;&#8221;, \/\/ nombre de la taxonom\u00eda e n plural<\/div>\n<div>&#8220;slug&#8221; =&gt; &#8220;&#8221;, \/\/nombre slug (amigable)<\/div>\n<div>&#8220;gutemberg&#8221; =&gt; true, \/\/ para mostrar la taxonom\u00eda en el editor Gutemberg.<\/div>\n<div>]<\/div>\n<\/div>\n<p>[\/code]<\/p>\n<p>Puedes usar variables adicionales avanzadas &#8220;args&#8221;, &#8220;rewrite&#8221;, &#8220;labels&#8221; y &#8220;capacities&#8221; de la misma forma que en la funci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_taxonomy\/#parameters\">registrer_taxonomy de WordPress<\/a><\/p>\n<h2>Variable Widget<\/h2>\n<p>Para crear Widgets S\u00f3lo necesitas crear en la consola un nuevo Controlador del tipo Widget<\/p>\n<p>[code]php antonella Widget MiClaseWidget[\/code]<\/p>\n<p>donde MiClaseWidget es el nombre de la clase. Generar\u00e1 un archivo como en los controladores MiClaseWidget.php con el c\u00f3digo necesario para empezar a programar<\/p>\n<p>Luego en configuraci\u00f3n debes agregar la clase en su secci\u00f3n<\/p>\n<p>[code]<\/p>\n<div>\n<div>\/**<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0Widget<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0For\u00a0register\u00a0a\u00a0Widget\u00a0please:<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0Console:\u00a0php\u00a0antonella\u00a0Widget\u00a0&#8220;NAME_OF_WIDGET&#8221;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0@input\u00a0array<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0@example\u00a0public\u00a0$widget\u00a0=\u00a0[__NAMESPACE__.&#8217;YouClassWidget&#8217;]\u00a0\u00a0\/\/only\u00a0the\u00a0class<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0*\/<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0$widgets=[<\/div>\n<div>\/\/ aqu\u00ed van las clases de los Widgets<\/div>\n<div>];<\/div>\n<\/div>\n<p>[\/code]<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2>Llamando a la configuraci\u00f3n<\/h2>\n<p>En caso necesites alg\u00fan dato de la configuraci\u00f3n para tus funciones puedes hacer \u00a0lo siguiente:<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<p>$config= new __NAMESPACE__Config;<\/p>\n<p>$options= $config-&gt;plugin_options;<\/p>\n<p>[\/code]<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"w-tabs-section\" id=\"ade7\"><button class=\"w-tabs-section-header\" aria-controls=\"content-ade7\" aria-expanded=\"false\"><div class=\"w-tabs-section-title\">Lo B\u00e1sico<\/div><div class=\"w-tabs-section-control\"><\/div><\/button><div  class=\"w-tabs-section-content\" id=\"content-ade7\"><div class=\"w-tabs-section-content-h i-cf\"><div class=\"wpb_text_column\"><div class=\"wpb_wrapper\"><h2>Controladores por defecto<\/h2>\n<p>Antonella Framework tiene por defecto controladores que ordenan las funciones que deseas crear. tiene funciones por defecto el cual puedes usar en cualquier otro apartado de los controladores.<\/p>\n<h3>Init.php<\/h3>\n<p>En la funci\u00f3n index por defecto puedes poner lo que necesites cada vez que se ejecuta el plugin.<\/p>\n<blockquote>\n<p>Los POST y los GET son controlados desde Config.php en las opciones de GET y POST<\/p>\n<\/blockquote>\n<h3>AdminPageAdmin.php<\/h3>\n<p>Este archivo puedes colocar la vista de la p\u00e1gina admin en caso necesitas crearlo.<\/p>\n<h3>Install.php<\/h3>\n<p>Install.php controlar\u00e1 todo lo referente a la instalaci\u00f3n del plugin. como la creaci\u00f3n de tablas dentro de la base de datos de WordPress. La creaci\u00f3n de las opciones del plugin se configurar desde Config.php<\/p>\n<h3>Creando tablas<\/h3>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<p>$options=[<\/p>\n<p>[<\/p>\n<p>&#8220;table&#8221;=&gt;&#8221;tu_tabla&#8221;,<\/p>\n<p>&#8220;query&#8221; =&gt;&#8221; id int(11) NOT NULL AUTO_INCREMENT, columna TEXT &#8220;,<\/p>\n<p>],<\/p>\n<p>];<\/p>\n<p>$install= $this-&gt;table_make($options)<\/p>\n<p>[\/code]<\/p>\n<p>donde:<\/p>\n<p>&#8220;table&#8221; es el nombre de la tabla<\/p>\n<p>&#8220;query&#8221; son las columnas a crear siguiendo los patrones de <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/create-table.html#create-table-types-attributes\" target=\"_blank\" rel=\"noopener noreferrer\">MySQL siguiendo los patrones de column options<\/a><\/p>\n<p>Puedes crear varias tablas en en array $options<\/p>\n<p>la Variable $this es en caso que crees la funcion dentro del archivo Install.php, en caso contrario ser\u00eda<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<p>$tables= new __NAMESPACE__.Install;<\/p>\n<p>$tables-&gt;table_make($options);<\/p>\n<p>[\/code]<\/p>\n<h3>Unistall.php<\/h3>\n<p>Aqu\u00ed puedes poner tus funciones referentes cuando el plugin es borrado de WordPress. por defecto se borran las opciones de WordPress que usa este plugin y que se encuentra en Config.php<\/p>\n<h3>Users.php<\/h3>\n<p>Aqu\u00ed puedes poner las funciones referentes a las opciones de <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_get_current_user\" target=\"_blank\" rel=\"noopener noreferrer\">usuarios de WordPress<\/a>. por defecto genera las variables del usuario activado en ese momento<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<p>$data= new __NAMESPACE__.Users;<\/p>\n<p>\/\/puedes llamar las opciones de usuario de WP<\/p>\n<p>$login_name= $data-&gt;user-&gt;user_login;<\/p>\n<p>[\/code]<\/p>\n<h2>Creando tu controlador<\/h2>\n<p>en caso deseas crear tu propio controlador puedes hacerlo usando la consola de antonella<\/p>\n<p>[code lang=&#8221;bash&#8221;]<\/p>\n<p>php antonella make TuControlador<\/p>\n<p>[\/code]<\/p>\n<p>donde &#8220;<em>TuControlador<\/em>&#8221; es el nombre de tu controlador.<\/p>\n<p>Antonella consola creara un archivo en la carpeta src como TuControlador.php donde esta el c\u00f3digo inicial para empezar<\/p>\n<h4>LLamando tu controlador<\/h4>\n<p>desde cualquier parte del plugin<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<p>$foo= new __NAMESPACE__.TuControlador<\/p>\n<p>$foo-&gt;TuFuncion(); \/\/para llamar a una funci\u00f3n<\/p>\n<p>$foo-&gt;data; \/\/para llamar a una variable de la clase<\/p>\n<p>[\/code]<\/p>\n<h2>Creando Widgets<\/h2>\n<p>Antonella te ayuda a crear Widgets usando la consola<\/p>\n<p>[code lang=&#8221;bash&#8221;]<\/p>\n<p>php antonella widget EjemploWidget<\/p>\n<p>[\/code]<\/p>\n<p>donde <em>EjemploWidget\u00a0<\/em>es el nombre de tu Widget<\/p>\n<p>Antonella crear\u00e1 un archivo llamado EjemploWidget.php en la carpeta src con lo necesario para crear tu widget.<\/p>\n<h4>Registrar mi Widget<\/h4>\n<p>Para ello debes ir al archivo Config.php e ir a la secci\u00f3n $widgets<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<div>\n<div>\/**<\/div>\n<div>* Widget<\/div>\n<div>* For register a Widget please:<\/div>\n<div>* Console: php antonella Widget &#8220;NAME_OF_WIDGET&#8221;<\/div>\n<div>* @input array<\/div>\n<div>* @example public $widget = [__NAMESPACE__.&#8217;YouClassWidget&#8217;] \/\/only the class<\/div>\n<div>*\/<\/div>\n<div>public $widgets=[__NAMESPACE__.&#8217;EjemploWidget&#8217;];<\/div>\n<\/div>\n<p>[\/code]<\/p>\n<p>&nbsp;<\/p>\n<h2>Creando Helpers<\/h2>\n<p>Desde la versi\u00f3n 1.6 de Antonella es posible crear Helpers. Los helpers son funciones comunes que puedes invocar desde cualquier clase.<\/p>\n<h4>Helper ya existentes en Antonella Framework<\/h4>\n<p>view: para mostrar las plantillas Blade en caso que hayas instalado Blade. m\u00e1s detalles en el Apartado Blade.<\/p>\n<h4>Registrar mis Helpers<\/h4>\n<p>Puedes crear tus propios helpers con el comando<\/p>\n<p>[code lang=&#8221;bash&#8221;]php antonella helper mihelper[\/code]<\/p>\n<p>donde mihelper es el nombre del helper que vas a crear. Antonella crea un archivo &#8220;mihelper.php&#8221; en la carpeta Helpers<\/p>\n<p>&nbsp;<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"w-tabs-section\" id=\"t01a\"><button class=\"w-tabs-section-header\" aria-controls=\"content-t01a\" aria-expanded=\"false\"><div class=\"w-tabs-section-title\">Testing en Localhost<\/div><div class=\"w-tabs-section-control\"><\/div><\/button><div  class=\"w-tabs-section-content\" id=\"content-t01a\"><div class=\"w-tabs-section-content-h i-cf\"><div class=\"wpb_text_column\"><div class=\"wpb_wrapper\"><h1>Testing en Localhost<\/h1>\n<p>Desde la vesri\u00f3n 1.6 hay la posibilidad de probar tu plugin sin necesidad de subirlo a un servidor. Desde tu ordenador local puedes hacer una prueba de forma sencilla.<\/p>\n<p>Necesario:<\/p>\n<ol>\n<li>PHP<\/li>\n<li>MySQL<\/li>\n<li>PHPMyadmin (opcional)<\/li>\n<\/ol>\n<h3>Preparando el entorno<\/h3>\n<p>Debes de tener MySQL funcionando. Con la l\u00ednea de comando o phpmyadmin debes crear una base de datos vac\u00eda y asignar un usuario para esa base de datos (puede ser el mismo admin de MySQL)<\/p>\n<p>Dentro del proyecto de Antonella hay un archivo .ENV el cual aparece de esta forma<\/p>\n<p>[code]<\/p>\n<p>DBUSER=root<br \/>\nDBNAME=<br \/>\nDBPASS=<\/p>\n<p>[\/code]<\/p>\n<p>Debes rellenar esos campos correpondiente a:<\/p>\n<p>DBUSER: El usuario de la base de datos que has creado y que tiene permisos totales.<\/p>\n<p>DBNAME: El nombre de la base de datos que haz creado<\/p>\n<p>DEBPASS: El password del usuario asignado a la base de datos<\/p>\n<blockquote>\n<p>Esto debe ser rellenado sin comillas<\/p>\n<\/blockquote>\n<p>Luego debes ejecutar en la consola<\/p>\n<p>[code]php antonella serve[\/code]<\/p>\n<p>Antonella Instalar\u00e1 un WordPress en tu proyecto dentro de la carpeta wp-test. Luego configurar\u00e1 WordPress, har\u00e1 una copia del plugin, lo instalar\u00e1 y activar\u00e1.<\/p>\n<p>Crear\u00e1 un puerto para que puedas entrar al WordPress de prueba. Ser\u00e1 el puerto 8010<\/p>\n<div>\n<blockquote>\n<div><a href=\"http:\/\/localhost:8010\">http:\/\/localhost:8010<\/a><\/div>\n<div>Antonella se encargar\u00e1 de instalar todo para que s\u00f3lo entres al WordPress de prueba ya instalado y configurado<\/div>\n<\/blockquote>\n<\/div>\n<p>Para entrar al panel de administraci\u00f3n debes poner http:\/\/localhost:8010\/wp-admin<\/p>\n<p>El admin por defecto es<\/p>\n<p>Usuario: test<\/p>\n<p>Password: test<\/p>\n<p>&nbsp;<\/p>\n<h3>Testing<\/h3>\n<p>WordPress estar\u00e1 con el DEBUG activado por defecto, Podr\u00e1s analizar y revisar los errores que PHP devuelva.<\/p>\n<p>En caso deseas corregir un error debes ir a tu proyecto, hacer la correci\u00f3n y luego en la consola:<\/p>\n<p>[code]php antonella test refresh[\/code]<\/p>\n<p>Crear\u00e1 una copia del proyecto en forma de plugin y lo volver\u00e1 a instalar en el WordPress de prueba.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"w-tabs-section\" id=\"m249\"><button class=\"w-tabs-section-header\" aria-controls=\"content-m249\" aria-expanded=\"false\"><div class=\"w-tabs-section-title\">Dos v\u00edas de trabajo<\/div><div class=\"w-tabs-section-control\"><\/div><\/button><div  class=\"w-tabs-section-content\" id=\"content-m249\"><div class=\"w-tabs-section-content-h i-cf\"><div class=\"wpb_text_column\"><div class=\"wpb_wrapper\"><h1>Dos v\u00edas de trabajo<\/h1>\n<p>Antonella Framework sigue el sistema PSR-4 para poder crear un proyecto grande en equipo pero tambi\u00e9n es posible poder generar un solo controlador que maneje lo necesario para tu plugin. Aqu\u00ed explicamos las dos formas de de trabajar:<\/p>\n<p>&nbsp;<\/p>\n<h3>Usando el sistema de archivos del framework.<\/h3>\n<p>Cada cosa en su sitio y cada sitio en su lugar. \u00a0El sistema de archivos ubicados en la carpeta src contiene controladores para apartados espec\u00edficos de un plugin estandar de WordPress. puedes crear funciones dentro de su controlador e incluirlo dentro de la configuraci\u00f3n (srcconfig.php). Este sistema es recomendable para trabajos en equipos.<\/p>\n<p>Podemos agregar shortcodes (shortcodes.php)<\/p>\n<p>Agregar funciones al instalar y desinstalar (Install.php y Unistall.php)<\/p>\n<p>Agregar funciones al iniciar el plugin (Init.php)<\/p>\n<p>Agregar funciones referente a los datos del usuario registrado (Users.php)<\/p>\n<p>Agregar funciones referente al PostType (PostTypes.php)<\/p>\n<h3>Creando Controladores propios<\/h3>\n<p>Si tu plugin es muy sencillo puedes usar un solo archivo creando un controlador y creando tus funciones en ese controlador<\/p>\n<p>puedes crearlo desde la consola con Antonella console:<\/p>\n<p>[code lang=&#8221;shell&#8221;]<\/p>\n<p>php antonella make TuControlador<\/p>\n<p>[\/code]<\/p>\n<p>Se crear\u00e1 un controlador con una clase con el mismo nombre de tu archivo creado (en este ejemplo TuControlador.php)<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<div>\n<div>&lt;?php<\/div>\n<div>namespace CH;<\/div>\n<div>class TuControlador<\/div>\n<div>{<\/div>\n<div>\u00a0 \u00a0 \u00a0public function__construct()<\/div>\n<div>\u00a0 \u00a0 \u00a0{<\/div>\n<div><\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 \u00a0}<\/div>\n<div>}<\/div>\n<\/div>\n<p>[\/code]<\/p>\n<p>Puedes crear tus funciones en la clase y luego agregarlos en config.php<\/p>\n<p>por ejemplo creas la funcion Mifuncion() dentro de tu controlador y deseas que sea una parte del init de WordPress<\/p>\n<p>dentro de config.php<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<div>\n<div>public $add_action=[&#8216;init&#8217;,&#8217;CHTucontrolador::Mifuncion&#8217;];<\/div>\n<div><\/div>\n<\/div>\n<p>[\/code]<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"w-tabs-section\" id=\"k492\"><button class=\"w-tabs-section-header\" aria-controls=\"content-k492\" aria-expanded=\"false\"><div class=\"w-tabs-section-title\">APIs Endpoint<\/div><div class=\"w-tabs-section-control\"><\/div><\/button><div  class=\"w-tabs-section-content\" id=\"content-k492\"><div class=\"w-tabs-section-content-h i-cf\"><div class=\"wpb_text_column\"><div class=\"wpb_wrapper\"><h2>APIs endpoins<\/h2>\n<p>Puedes crear rutas APIs en WordPress de manera simple.<\/p>\n<p>Ejemplo: https:\/\/tuweb.com\/wp-json\/my-plugin-endpoint\/v1\/author\/<\/p>\n<p>La configuraci\u00f3n est\u00e1 en Config.php<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<div>\n<div>\u00a0\/**<\/div>\n<div>\u00a0 \u00a0 \u00a0* add APIs Endpoints<\/div>\n<div>\u00a0 \u00a0 \u00a0* @param array<\/div>\n<div>\u00a0 \u00a0 \u00a0* @example [[&#8216;name&#8217;,&#8217;GET&#8217;,__NAMESPACE__.&#8217;apiController::index&#8217;]]<\/div>\n<div>\u00a0 \u00a0 \u00a0* @example route: \/wp-json\/my-plugin-endpoint\/v1\/name<\/div>\n<div>\u00a0 \u00a0 \u00a0*\/<\/div>\n<div>\u00a0 \u00a0 public $api_endpoint_name= &#8220;my-plugin-endpoint&#8221;;<\/div>\n<div>\u00a0 \u00a0 public $api_endpoint_version=1;<\/div>\n<div>\u00a0 \u00a0 public $api_endpoints_functions=[<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 [&#8216;author&#8217;,&#8217;GET&#8217;,__NAMESPACE__.&#8217;ExampleController::example_api&#8217;]<\/div>\n<div>\u00a0 \u00a0 ];<\/div>\n<\/div>\n<p>[\/code]<\/p>\n<p>Configurando el nombre de tu endpoint, la versi\u00f3n y un listado de endpoints para poder llamar a funciones diferentes ubicados en tu plugin. Puedes crear todos los que desees siendo:<\/p>\n<p>&#8220;author&#8221; el nombre de tu endpoint. puedes renombrarlo al que desees<\/p>\n<p>&#8220;GET&#8221; el m\u00e9todo para solicitar la API. Solo hay GET, POST y DELETE<\/p>\n<p>&#8220;__NAMESPACE__.&#8217;ExampleController::example_api&#8217;&#8221; la funci\u00f3n donde se ejecutar\u00e1 tu endpoint<\/p>\n<p>Recuerda que la funci\u00f3n debe ser llamada est\u00e1ticamente<\/p>\n<p>[code lang=&#8221;php&#8221;]<\/p>\n<p>public static function example_api($data){<\/p>\n<p>\/\/este es un ejemplo creado desde un controlador como ExampleController.<\/p>\n<div>\n<div>$posts = get_posts( array(<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#8216;author&#8217; =&gt; $data[&#8216;id&#8217;],<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ) );<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if ( empty( $posts ) ) {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return null;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/div>\n<div><\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return $posts[0]-&gt;post_title;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 }<\/div>\n<\/div>\n<p>}<\/p>\n<p>[\/code]<\/p>\n<p>Seg\u00fan la documentaci\u00f3n de WordPress sobre este apartado, el resultado siempre se retorna en json de forma autom\u00e1tica.<\/p>\n<p>Si deseas saber m\u00e1s sobre los endpoints puedes hacerlo aqui <a href=\"https:\/\/developer.wordpress.org\/rest-api\/extending-the-rest-api\/adding-custom-endpoints\/\">Adding Custom Endpoints | REST API Handbook | WordPress Developer Resources<\/a><\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"w-tabs-section\" id=\"q74c\"><button class=\"w-tabs-section-header\" aria-controls=\"content-q74c\" aria-expanded=\"false\"><div class=\"w-tabs-section-title\">Consola<\/div><div class=\"w-tabs-section-control\"><\/div><\/button><div  class=\"w-tabs-section-content\" id=\"content-q74c\"><div class=\"w-tabs-section-content-h i-cf\"><div class=\"wpb_text_column\"><div class=\"wpb_wrapper\"><h1>Consola Antonella<\/h1>\n<p>Antonella Framework contiene su propia consola al mismo estilo de artisan de <a href=\"https:\/\/symfony.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Symfony<\/a>\u00a0el cual tiene las siguientes opciones:<\/p>\n<h3>Crear controlador<\/h3>\n<p>[code lang=&#8221;bash&#8221;]<\/p>\n<p>php antonella make TuControlador<\/p>\n<p>[\/code]<\/p>\n<p>Crear\u00e1 autom\u00e1ticamente un archivo .php en la carpeta src con el nombre TuControlador.php con el c\u00f3digo necesario para empezar a programar.<\/p>\n<h3>Crear Helper<\/h3>\n<p>[code lang=&#8221;bash&#8221;]<\/p>\n<p>php antonella helper TuHelper<\/p>\n<p>[\/code]<\/p>\n<p>Crear\u00e1 autom\u00e1ticamente un archivo .php en la carpeta src\/Helper con el nombre TuHelper.php con el c\u00f3digo necesario para empezar a programar tu helper<\/p>\n<h3>Cambiar namespace<\/h3>\n<p>El <a href=\"http:\/\/php.net\/manual\/en\/language.namespaces.php\" target=\"_blank\" rel=\"noopener noreferrer\">namespace de php<\/a> es necesario para programar con el framework. por defecto es CH pero puedes cambiarlo<\/p>\n<p>[code lang=&#8221;bash&#8221;]<\/p>\n<p>php antonella namespace TUNAMESPACE<\/p>\n<p>[\/code]<\/p>\n<p>Donde TUNAMESPACE es el nombre nuevo que \u00a0deseas asignar<\/p>\n<blockquote>\n<p>En caso de usar Antonella framework en m\u00e1s de un plugin en el mismo WordPress ser\u00e1 necesario que tengan Namespace distintos.<\/p>\n<\/blockquote>\n<p>Puedes crear Namespaces aleatorios si no le pones un nombre<\/p>\n<p>[code]php antonella namespace[\/code]<\/p>\n<p>Antonella se encargar\u00e1 de generar uno.<\/p>\n<p>Crear Widgets<\/p>\n<p>[code lang=&#8221;bash&#8221;]<\/p>\n<p>php antonella widget\u00a0 EjemploWidget<\/p>\n<p>[\/code]<\/p>\n<p>Genera un archivo php en la carpeta src con el nombre EjemploWidget.php con el c\u00f3digo necesario para crear tu widget<\/p>\n<h3>Testing<\/h3>\n<p>Previamente debes configurar tu archivo .env con los accesos a la base de datos para testing<\/p>\n<p>[code lang=&#8221;bash&#8221;]<\/p>\n<p>php antonella serve<\/p>\n<p>[\/code]<\/p>\n<p>Crea un entorno de desarrollo, instala WordPress localmente y lo pone a funcionar en el servidor 8010 (http:\/\/localhost:8010), instala en ese WordPress el plugins activado y funcionando en la carpeta wp-test<\/p>\n<p>[code lang=&#8221;bash&#8221;]<\/p>\n<p>php antonella test refresh<\/p>\n<p>[\/code]<\/p>\n<p>Refresca la informaci\u00f3n del plugin en el WordPress de test.<\/p>\n<p>en caso deseas cambiar la informaci\u00f3n de la base de datos del archivo .env debes forzar la recarga del archivo wp-config.php con<\/p>\n<p>[code lang=&#8221;bash&#8221;]php antonella test refresh force[\/code]<\/p>\n<h3>Quitando y a\u00f1adiendo Blade<\/h3>\n<p>Antonella Framework viene con la opci\u00f3n de instalar blade . Si deseas usarlo puedes agregarlo con este comando<\/p>\n<p>[code]php antonella add blade[\/code]<\/p>\n<p>As\u00ed mismo si deseas removerlo:<\/p>\n<p>[code]php antonella remove blade[\/code]<\/p>\n<p>&nbsp;<\/p>\n<h3>Exportar tu plugin<\/h3>\n<p>[code lang=&#8221;bash&#8221;]<\/p>\n<p>php antonella makeup<\/p>\n<p>[\/code]<\/p>\n<p>genera un archivo .zip del plugin con los archivos necesarios para que funcione el plugin.<\/p>\n<h3>Ayuda<\/h3>\n<p>Antonella dispone de un sistema de ayuda<\/p>\n<p>[code]php antonella help[\/code]<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3190 size-full\" src=\"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2019\/10\/Captura-de-pantalla-de-2019-10-26-00-05-49.png\" alt=\"\" width=\"726\" height=\"467\" srcset=\"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2019\/10\/Captura-de-pantalla-de-2019-10-26-00-05-49.png 726w, https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2019\/10\/Captura-de-pantalla-de-2019-10-26-00-05-49-300x193.png 300w, https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2019\/10\/Captura-de-pantalla-de-2019-10-26-00-05-49-600x386.png 600w\" sizes=\"auto, (max-width: 726px) 100vw, 726px\" \/><\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"w-tabs-section\" id=\"j9f2\"><button class=\"w-tabs-section-header\" aria-controls=\"content-j9f2\" aria-expanded=\"false\"><div class=\"w-tabs-section-title\">Gutenberg<\/div><div class=\"w-tabs-section-control\"><\/div><\/button><div  class=\"w-tabs-section-content\" id=\"content-j9f2\"><div class=\"w-tabs-section-content-h i-cf\"><div class=\"wpb_text_column\"><div class=\"wpb_wrapper\"><h1>Creando Bloques de Gutenberg<\/h1>\n<p>Bas\u00e1ndose en la <a href=\"https:\/\/developer.wordpress.org\/block-editor\/contributors\/document\/\" target=\"_blank\" rel=\"noopener noreferrer\">documentaci\u00f3n de WordPress para la creaci\u00f3n de bloques de Gutenberg<\/a> Se ha desarrollado un entorno f\u00e1cil para crear cada bloque que desees.<\/p>\n<h3>Creando el bloque<\/h3>\n<p>Debes asignarle un nombre (sin espacios, con guiones si es necesario) y ejecutar en la consola<\/p>\n<p>[code]php antonella block nombre-de-mi-bloque[\/code]<\/p>\n<p>Crear\u00e1 en el archivo Config.php en el apartado de gutenberg<\/p>\n<p>[code]<\/p>\n<p>public $gutenberg_blocks =[<\/p>\n<div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0&#8216;nombre-de-mi-bloque&#8217;,<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0];<\/div>\n<\/div>\n<p>[\/code]<\/p>\n<p>Adem\u00e1s crear\u00e1 dos archivos dentro de la carpeta assets.<\/p>\n<p>en la carpeta css el archivo nombre-de-mi-bloque.css para agregar los estilos que desees<\/p>\n<p>en la carpeta js el archivo nombre-de-mi-bloque.js donde est\u00e1 un ejemplo para la creaci\u00f3n de bloques.<\/p>\n<p>[code]<\/p>\n<div>\n<div>wp.blocks.registerBlockType(&#8216;antonella\/nombre-de-mi-bloque&#8217;,\u00a0{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0title:\u00a0&#8216;nombre-de-mi-bloque&#8217;,<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0icon:\u00a0&#8216;smiley&#8217;,<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0category:\u00a0&#8216;common&#8217;,<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0attributes:\u00a0{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0content:\u00a0{type:\u00a0&#8216;string&#8217;},<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0color:\u00a0{type:\u00a0&#8216;string&#8217;}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},<\/div>\n<div>&#8230;<\/div>\n<\/div>\n<p>[\/code]<\/p>\n<p>Dentro de WordPress aparecer\u00e1 un nuevo bloque llamado &#8220;nombre-de-mi-bloque&#8221; con un \u00edcono de una carita feliz que activar\u00e1 el bloque de ejemplo (hacer un h3 con colores)<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3283 size-full\" src=\"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2020\/11\/gutemberg.png\" alt=\"\" width=\"426\" height=\"460\" srcset=\"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2020\/11\/gutemberg.png 426w, https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2020\/11\/gutemberg-278x300.png 278w\" sizes=\"auto, (max-width: 426px) 100vw, 426px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3282 size-full\" src=\"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2020\/11\/gutenberg2.png\" alt=\"\" width=\"1046\" height=\"870\" srcset=\"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2020\/11\/gutenberg2.png 1046w, https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2020\/11\/gutenberg2-300x250.png 300w, https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2020\/11\/gutenberg2-1024x852.png 1024w, https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2020\/11\/gutenberg2-768x639.png 768w, https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2020\/11\/gutenberg2-600x499.png 600w\" sizes=\"auto, (max-width: 1046px) 100vw, 1046px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Deber\u00e1s tener conocimiento en javascript. Ya no ser\u00e1 necesario que sepas PHP para poder registrar tu bloque.<\/p>\n<p>&nbsp;<\/p>\n<p>Puedes agregar tantos bloques como desees.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"w-tabs-section\" id=\"ad27\"><button class=\"w-tabs-section-header\" aria-controls=\"content-ad27\" aria-expanded=\"false\"><div class=\"w-tabs-section-title\">Packages<\/div><div class=\"w-tabs-section-control\"><\/div><\/button><div  class=\"w-tabs-section-content\" id=\"content-ad27\"><div class=\"w-tabs-section-content-h i-cf\"><div class=\"wpb_text_column\"><div class=\"wpb_wrapper\"><h1>Paquetes Externos<\/h1>\n<p>Antonella Framework acepta paquetes de terceros ya sean hechos para WordPress o no.<\/p>\n<p>Puedes encontrar una gran variedad en <a href=\"https:\/\/packagist.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Packagist.org<\/a>\u00a0y poder invocarlos desde el archivo composer.json. Estos paquetes se guardar\u00e1n en la carpeta Vendor.<\/p>\n<blockquote>\n<p>Aviso: el uso se paquetes externos aumenta considerablemente el tama\u00f1o de tu plugin y si es un paquete no seguro puede llevar a huecos de seguridad en tu WordPress por lo que se recomienda usarlos s\u00f3lo si es necesario y si son paquetes de confianza<\/p>\n<\/blockquote>\n<p>Ejemplo:<\/p>\n<p>Si estamos acostumbrados con el paquete Eloquent para el control de base de datos de WordPress o para invocar una base de datos externa podemos hacer lo siguiente:<\/p>\n<p>buscamos en Packagits &#8220;eloquent for WordPress&#8221;<\/p>\n<p>lo agregamos a nuestro composer.json<\/p>\n<p>[code lang=&#8221;javascript&#8221;]<br \/>\n{<br \/>\n<span class=\"pl-s\"><span class=\"pl-pds\">&#8220;<\/span>require<span class=\"pl-pds\">&#8220;<\/span><\/span><span class=\"pl-k\">:<\/span> {<br \/>\n<span class=\"pl-s\"><span class=\"pl-pds\">&#8220;<\/span>tareq1988\/wp-eloquent<span class=\"pl-pds\">&#8220;<\/span><\/span><span class=\"pl-k\">:<\/span> <span class=\"pl-s\"><span class=\"pl-pds\">&#8220;<\/span>dev-master<span class=\"pl-pds\">&#8220;<\/span><\/span><br \/>\n}<br \/>\n}<br \/>\n[\/code]<\/p>\n<p>y luego ejecutamos composer<\/p>\n<p>[code lang=&#8221;bash&#8221;]<\/p>\n<p>composer update<\/p>\n<p>[\/code]<\/p>\n<p>Con esto ya podemos utilizar Eloquent para nuestro WordPress<\/p>\n<p>[code lang=&#8221;php&#8221;]<br \/>\n$db = WeDevsORMEloquentDatabase::instance();<\/p>\n<p>var_dump( $db-&gt;table(&#8216;users&#8217;)-&gt;find(1) );<br \/>\nvar_dump( $db-&gt;select(&#8216;SELECT * FROM wp_users WHERE id = ?&#8217;, [1]) );<br \/>\nvar_dump( $db-&gt;table(&#8216;users&#8217;)-&gt;where(&#8216;user_login&#8217;, &#8216;john&#8217;)-&gt;first() );<br \/>\n[\/code]<br \/>\nExisten muchos paquetes que nos pueden ayudar para el desarrollo de nuestro plugin. Disfruta!<\/p>\n<p>&nbsp;<\/p>\n<h3>Agregar Plugins a nuestro proyecto como m\u00f3dulos<\/h3>\n<p>Puedes hacer que cualquier plugin del repositorio de WordPress sea parte de tu plugin como un m\u00f3dulo<\/p>\n<p>Desde <a href=\"https:\/\/wpackagist.org\">https:\/\/wpackagist.org<\/a> puedes obtener la linea que necesitas agregar en la parte &#8220;require&#8221; de tu archivo composer.json<\/p>\n<h3><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3191 size-full\" src=\"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2019\/10\/Captura-de-pantalla-de-2019-10-26-00-11-34.png\" alt=\"\" width=\"1071\" height=\"652\" srcset=\"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2019\/10\/Captura-de-pantalla-de-2019-10-26-00-11-34.png 1071w, https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2019\/10\/Captura-de-pantalla-de-2019-10-26-00-11-34-300x183.png 300w, https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2019\/10\/Captura-de-pantalla-de-2019-10-26-00-11-34-1024x623.png 1024w, https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2019\/10\/Captura-de-pantalla-de-2019-10-26-00-11-34-768x468.png 768w, https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2019\/10\/Captura-de-pantalla-de-2019-10-26-00-11-34-600x365.png 600w\" sizes=\"auto, (max-width: 1071px) 100vw, 1071px\" \/><\/h3>\n<p>Como los plugins de WordPress no cumplen con el sistema de desarrollo PSR-4 Debes agregar el archivo de inicio del plugin en la secci\u00f3n &#8220;autoload&#8221; de tu archivo composer.json.<\/p>\n<p>&nbsp;<\/p>\n<p>[code]<\/p>\n<div>\n<div>\n<div>&#8220;autoload&#8221;:\u00a0{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;psr-4&#8221;: {&#8220;CH&#8221;: &#8220;src\/&#8221;},<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &#8220;files&#8221;:{[<span class=\"pl-s\"><span class=\"pl-pds\">&#8220;<\/span>vendor\/contact-form-7\/wp-contact-form-7.php<span class=\"pl-pds\">&#8220;<\/span><\/span>]}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0},<\/div>\n<\/div>\n<\/div>\n<p>[\/code]<\/p>\n<p>en caso quieras agregar ContactForm7 como un m\u00f3dulo<\/p>\n<p>Video explicativo: <a href=\"https:\/\/www.youtube.com\/watch?v=qv-rHY_4zhk\">https:\/\/www.youtube.com\/watch?v=qv-rHY_4zhk<\/a><\/p>\n<p>&nbsp;<\/p>\n<h3>Crear Paquetes para Antonella Framework<\/h3>\n<p>Es posible crear paquetes para WordPress y usarlo con AntonellaFramework.<\/p>\n<p>Ejemplos:<\/p>\n<p><a href=\"https:\/\/github.com\/ArroyoLabs\/erdiko-wordpress\">https:\/\/github.com\/ArroyoLabs\/erdiko-wordpress<\/a><\/p>\n<p><a href=\"https:\/\/packagist.org\/packages\/drewjbartlett\/wordpress-eloquent\">https:\/\/packagist.org\/packages\/drewjbartlett\/wordpress-eloquent<\/a><\/p>\n<p>Para ellos es recomendable seguir la documentaci\u00f3n de\u00a0https:\/\/packagist.org<\/p>\n<p>Puedes seguir el <a href=\"https:\/\/styde.net\/curso-crea-componentes-para-php-y-laravel\/\" target=\"_blank\" rel=\"noopener noreferrer\">curso de creaci\u00f3n de paquetes para php de styde<\/a><\/p>\n<p>Puedes publicar tu paquete dentro de la documentaci\u00f3n de Antonella Framework enviando el link al email <a href=\"mailto:packages@antonellaframework.com\">packages@antonellaframework.com<\/a><\/p>\n<p>&nbsp;<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"w-tabs-section\" id=\"bf8f\"><button class=\"w-tabs-section-header with_icon\" aria-controls=\"content-bf8f\" aria-expanded=\"false\"><i class=\"fas fa-docker\"><\/i><div class=\"w-tabs-section-title\">Docker<\/div><div class=\"w-tabs-section-control\"><\/div><\/button><div  class=\"w-tabs-section-content\" id=\"content-bf8f\"><div class=\"w-tabs-section-content-h i-cf\"><div class=\"wpb_text_column\"><div class=\"wpb_wrapper\"><h1>Usando Docker para el desarrollo del plugin de WordPress<\/h1>\n<p>Puedes usar docker ahora con Antonella Framework.<\/p>\n<p>Se ha usado un archivo de docker con la configuraci\u00f3n adecuada para que funcione con el desarrollo. Con el puedes modificar tu plugin el tiempo real y se ver\u00e1 en el WordPress montado en Docker. Puedes cambiar la configuraci\u00f3n para cambiar la versi\u00f3n de WP, mysql o PHP.<\/p>\n<h2>Requisitos<\/h2>\n<p>Tener instalado Docker Desktop. <a href=\"https:\/\/www.docker.com\/products\/docker-desktop\/\" target=\"_blank\" rel=\"noopener\">Download Docker Desktop | Docker<\/a><\/p>\n<p>Ejecutar con Antonella Console.<\/p>\n<p>[code]php antonella docker[\/code]<\/p>\n<p>este comando levanta docker y monta WordPress en un contenedor Docker.<\/p>\n<p>Tambi\u00e9n puedes usar los comandos cl\u00e1sicos de docker-compose<\/p>\n<p><a href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/compose\/#:~:text=You%20can%20use%20compose%20subcommand%2C%20docker%20compose%20%5B-f,specify%20the%20location%20of%20a%20Compose%20configuration%20file.\" target=\"_blank\" rel=\"noopener\">docker compose | Docker Documentation<\/a><\/p>\n<p>Archivo de configuraci\u00f3n del contenedor:<\/p>\n<p>[code lang=&#8221;yarn&#8221;]<\/p>\n<div>\n<div>version: &#8216;3&#8217;<\/div>\n<div>services:<\/div>\n<div>\u00a0 mysql:<\/div>\n<div>\u00a0 \u00a0 image: mariadb<\/div>\n<div>\u00a0 \u00a0 restart: always<\/div>\n<div>\u00a0 \u00a0 ports:<\/div>\n<div>\u00a0 \u00a0 \u00a0 &#8211; 8081:3306<\/div>\n<div>\u00a0 \u00a0 environment:<\/div>\n<div>\u00a0 \u00a0 \u00a0 MYSQL_USER: wordpress<\/div>\n<div>\u00a0 \u00a0 \u00a0 MYSQL_ROOT_PASSWORD: wordpress<\/div>\n<div>\u00a0 \u00a0 \u00a0 MYSQL_DATABASE: wordpress<\/div>\n<div>\u00a0 \u00a0 \u00a0 MYSQL_PASSWORD: wordpress<\/div>\n<div>\u00a0 phpmyadmin:<\/div>\n<div>\u00a0 \u00a0 image: phpmyadmin\/phpmyadmin<\/div>\n<div>\u00a0 \u00a0 ports:<\/div>\n<div>\u00a0 \u00a0 \u00a0 &#8211; 80:80<\/div>\n<div>\u00a0 \u00a0 environment:<\/div>\n<div>\u00a0 \u00a0 \u00a0 MYSQL_USERNAME: &#8216;user&#8217;<\/div>\n<div>\u00a0 \u00a0 \u00a0 MYSQL_ROOT_PASSWORD: &#8216;password&#8217;<\/div>\n<div>\u00a0 wordpress:<\/div>\n<div>\u00a0 \u00a0 depends_on:<\/div>\n<div>\u00a0 \u00a0 \u00a0 &#8211; mysql<\/div>\n<div>\u00a0 \u00a0 image: wordpress:php8.0-apache<\/div>\n<div>\u00a0 \u00a0 ports:<\/div>\n<div>\u00a0 \u00a0 \u00a0 &#8211; 8080:80<\/div>\n<div>\u00a0 \u00a0 restart: always<\/div>\n<div>\u00a0 \u00a0 volumes:<\/div>\n<div>\u00a0 \u00a0 \u00a0 &#8211; .\/:\/var\/www\/html\/wp-content\/plugins\/antonella-framework<\/div>\n<div>\u00a0 \u00a0 environment:<\/div>\n<div>\u00a0 \u00a0 \u00a0 WORDPRESS_DB_HOST: mysql:3306<\/div>\n<div>\u00a0 \u00a0 \u00a0 WORDPRESS_DB_USER: wordpress<\/div>\n<div>\u00a0 \u00a0 \u00a0 WORDPRESS_DB_PASSWORD: wordpress<\/div>\n<div>\u00a0 \u00a0 links:<\/div>\n<div>\u00a0 \u00a0 \u00a0 &#8211; mysql<\/div>\n<\/div>\n<p>[\/code]<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"w-tabs-section no_indents\" id=\"y2a4\"><button class=\"w-tabs-section-header\" aria-controls=\"content-y2a4\" aria-expanded=\"false\"><div class=\"w-tabs-section-title\">Blade<\/div><div class=\"w-tabs-section-control\"><\/div><\/button><div  class=\"w-tabs-section-content\" id=\"content-y2a4\"><div class=\"w-tabs-section-content-h i-cf\"><div class=\"wpb_text_column\"><div class=\"wpb_wrapper\"><h1>Sistema de Plantillas Blade<\/h1>\n<p>Blade es un simple pero poderoso motor de plantillas. A diferencia de otros populares motores de plantillas para PHP, Blade no limita el uso de c\u00f3digo PHP puro en las vistas. Las vistas en Blade se compilan a c\u00f3digo PHP y se cachean hasta que son modificadas, lo que genera un alto rendimiento de compilaci\u00f3n. Las vistas en Blade usan la extensi\u00f3n .blade.php y normalmente se almacenan en el directorio resources\/views.<\/p>\n<p>&nbsp;<\/p>\n<h2>Llamando a la plantilla<\/h2>\n<p>desde tu controlador<\/p>\n<p>[code]<\/p>\n<p>$query = WPQuery();<\/p>\n<p>return view(&#8216;index&#8217;,[&#8216;query&#8217;=&gt;$query]);<\/p>\n<div>\n<div>[\/code]<\/div>\n<\/div>\n<p>con esto estas llamando a la vista index.blade.php y enviando los valores de la variable $query<\/p>\n<p>La funci\u00f3n view() es un helper que detecta previamente si blade est\u00e1 instalado o no.<\/p>\n<h2>Generaci\u00f3n de Plantillas (Layouts)<\/h2>\n<h2>Definir una plantilla<\/h2>\n<p>Dos de los principales beneficios de usar Blade son la herencia de plantillas y las secciones. Primero, examinaremos un layout &#8220;master&#8221;. Es recomendable definir este layout como una \u00fanica vista Blade:<\/p>\n<p>[code]<\/p>\n<p>&lt;!&#8211; Guardada en resources\/views\/layouts\/app.blade.php &#8211;&gt;<\/p>\n<p>&lt;div class=&#8221;warp&#8221;&gt;<br \/>\n&lt;div&gt;App Name &#8211; @yield(&#8216;title&#8217;)&lt;\/div&gt;<\/p>\n<p>&lt;div class=&#8221;container&#8221;&gt;<br \/>\n@yield(&#8216;content&#8217;)<br \/>\n&lt;\/div&gt;<\/p>\n<p>&lt;\/div&gt;<\/p>\n<p>[\/code]<\/p>\n<p>Como puedes observar, este archivo contiene una estructura HTML t\u00edpica. Sin embargo, tiene 2 cosas poco comunes: @section y @yield. La directiva @section,\u00a0 define un secci\u00f3n de contenido, mientras que la directiva @yield es utilizada para mostrar el contenido de una secci\u00f3n.<\/p>\n<p>Una vez que se tiene definido un layout para la aplicaci\u00f3n, se puede definir una p\u00e1gina hija que hereda de este layout.<\/p>\n<h2>Usar una plantilla Hija<\/h2>\n<p>[code]<\/p>\n<p>&lt;!&#8211; Stored in resources\/views\/child.blade.php &#8211;&gt;<\/p>\n<p>@extends(&#8216;layouts.app&#8217;)<\/p>\n<p>@section(&#8216;title&#8217;, &#8216;Page Title&#8217;)<\/p>\n<p>@section(&#8216;content&#8217;)<br \/>\n&lt;p&gt;This is my body content.&lt;\/p&gt;<br \/>\n@endsection<\/p>\n<p>[\/code]<\/p>\n<p>Cuando defina una vista hija, utiliza la directiva Blade @extends para especificar de qu\u00e9 layout debe &#8220;heredar&#8221;.<\/p>\n<h2>Mostrar Datos en la Vista<\/h2>\n<p>Cuando llamas a la plantilla blade lo puedes hacer enviando valores del tipo string, array u objeto.<\/p>\n<p>para mostrarlos s\u00f3lo necesitas<\/p>\n<p>[code]<\/p>\n<p>{{ $dato }} \/\/en caso de ser string o int<\/p>\n<p>[\/code]<br \/>\n[code]<\/p>\n<p>@foreach($query as $q)<\/p>\n<p>{{ $q }}<\/p>\n<p>@endforeach<\/p>\n<p>[\/code]<\/p>\n<p>En caso de ser un array u objeto<\/p>\n<h2>Definiendo condicionantes<\/h2>\n<p>[code]<\/p>\n<p>@if (count($records) === 1)<br \/>\nI have one record!<br \/>\n@elseif (count($records) &gt; 1)<br \/>\nI have multiple records!<br \/>\n@else<br \/>\nI don&#8217;t have any records!<br \/>\n@endif<\/p>\n<p>[\/code]<br \/>\n[code]<\/p>\n<p>@isset($records)<br \/>\n\/\/ $records is defined and is not null&#8230;<br \/>\n@endisset<\/p>\n<p>@empty($records)<br \/>\n\/\/ $records is &#8220;empty&#8221;&#8230;<br \/>\n@endempty<\/p>\n<p>[\/code]<\/p>\n<h2>Switch<\/h2>\n<p>[code]<\/p>\n<p>@switch($i)<br \/>\n@case(1)<br \/>\nFirst case&#8230;<br \/>\n@break<\/p>\n<p>@case(2)<br \/>\nSecond case&#8230;<br \/>\n@break<\/p>\n<p>@default<br \/>\nDefault case&#8230;<br \/>\n@endswitch<\/p>\n<p>[\/code]<\/p>\n<h2>Comentarios<\/h2>\n<p>Blade tambi\u00e9n permite definir comentarios en las vistas. Sin embargo, a diferencia de los comentarios HTML, los comentarios Blade no se incluyen en el HTML final de la aplicaci\u00f3n:<\/p>\n<p>[code] {{&#8211; Este es un comentario que no se mostrar\u00e1 en el HTML final &#8211;}} [\/code]<\/p>\n<p>&nbsp;<\/p>\n<h2>Usar PHP puro<\/h2>\n<p>En algunas situaciones, es \u00fatil incrustar c\u00f3digo PHP en sus vistas. Puede usar la directiva Blade @php para ejecutar un bloque de PHP simple dentro de su plantilla:<\/p>\n<p>[code]<\/p>\n<p>@php<br \/>\n\/\/<br \/>\n@endphp<\/p>\n<p>[\/code]<\/p>\n<h2>Incluir SubVistas<\/h2>\n<p>La directiva @include le permite incluir una vista Blade desde otra vista. Todas las variables disponibles en la vista padre se pondr\u00e1n usar:<\/p>\n<p>[code] @include(&#8216;shared.errors&#8217;) [\/code]<br \/>\n[code] @include(&#8216;view.name&#8217;, [&#8216;some&#8217; =&gt; &#8216;data&#8217;]) [\/code]<\/p>\n<p>&nbsp;<\/p>\n<p>Disfruta!<\/p>\n<\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/section>","protected":false},"excerpt":{"rendered":"[vc_custom_heading text=\"We need translate to english!. please contact in twitter account @Antonella_FW\" font_container=\"tag:h2|text_align:center\" use_theme_fonts=\"yes\" link=\"url:https%3A%2F%2Ftwitter.com%2FAntonella_FW||target:%20_blank|rel:nofollow\"] Ver 1.1\u00a0 \u00a0|\u00a0 Ver. 1.0 |\u00a0 Ver. 1.2 | Ver. 1.5 | Ver. 1.6 | Ver 1.7 \u00a0| Ver 1.8 Pr\u00f3logoPrimeros PasosConfiguraci\u00f3nLo B\u00e1sicoTesting en LocalhostDos v\u00edas de trabajoAPIs EndpointConsolaGutenbergPackagesDockerBladePr\u00f3logoNotas de la Versi\u00f3n Antonella Framework ha sido creado para poder hacer...","protected":false},"author":1,"featured_media":2953,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"class_list":["post-2991","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Documentaci\u00f3n - Antonella Framework<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/legacy.antonellaframework.com\/documentacion\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Antonella Framework Documentaci\u00f3n 1.5\" \/>\n<meta property=\"og:description\" content=\"Antonella Framework ha sido creado para poder hacer plugin en equipo o individual de forma limpia y ordenada. Usando el sistema de clases, con estructura PSR-4 hace que podamos preocuparnos por el funcionamiento del plugin y realizar la continuaci\u00f3n de la misma con una curva de aprendizaje corta.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/legacy.antonellaframework.com\/documentacion\/\" \/>\n<meta property=\"og:site_name\" content=\"Antonella Framework\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-03T07:45:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2016\/08\/antonella-framwork.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1700\" \/>\n\t<meta property=\"og:image:height\" content=\"1083\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@Antonella_FW\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"24 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/documentacion\\\/\",\"url\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/documentacion\\\/\",\"name\":\"Documentaci\u00f3n - Antonella Framework\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/documentacion\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/documentacion\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/wp-content\\\/uploads\\\/2017\\\/01\\\/cropped-logo-antonella-framework-512_2.png\",\"datePublished\":\"2017-02-16T13:57:24+00:00\",\"dateModified\":\"2024-09-03T07:45:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/documentacion\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/legacy.antonellaframework.com\\\/documentacion\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/documentacion\\\/#primaryimage\",\"url\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/wp-content\\\/uploads\\\/2017\\\/01\\\/cropped-logo-antonella-framework-512_2.png\",\"contentUrl\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/wp-content\\\/uploads\\\/2017\\\/01\\\/cropped-logo-antonella-framework-512_2.png\",\"width\":512,\"height\":512},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/documentacion\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Documentaci\u00f3n\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/#website\",\"url\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/\",\"name\":\"Antonella Framework\",\"description\":\"El mejor framework para el desarrollo de plugins en WordPress\",\"publisher\":{\"@id\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/#\\\/schema\\\/person\\\/59c038779fe663c173c1ec78e2ae8901\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/legacy.antonellaframework.com\\\/#\\\/schema\\\/person\\\/59c038779fe663c173c1ec78e2ae8901\",\"name\":\"Carlos Herrera\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8a724c66fdb042b1403f35d88aa426f4a6619f697e64cb8662b898e6e437c6da?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8a724c66fdb042b1403f35d88aa426f4a6619f697e64cb8662b898e6e437c6da?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8a724c66fdb042b1403f35d88aa426f4a6619f697e64cb8662b898e6e437c6da?s=96&d=mm&r=g\",\"caption\":\"Carlos Herrera\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8a724c66fdb042b1403f35d88aa426f4a6619f697e64cb8662b898e6e437c6da?s=96&d=mm&r=g\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Documentaci\u00f3n - Antonella Framework","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/legacy.antonellaframework.com\/documentacion\/","og_locale":"en_US","og_type":"article","og_title":"Antonella Framework Documentaci\u00f3n 1.5","og_description":"Antonella Framework ha sido creado para poder hacer plugin en equipo o individual de forma limpia y ordenada. Usando el sistema de clases, con estructura PSR-4 hace que podamos preocuparnos por el funcionamiento del plugin y realizar la continuaci\u00f3n de la misma con una curva de aprendizaje corta.","og_url":"https:\/\/legacy.antonellaframework.com\/documentacion\/","og_site_name":"Antonella Framework","article_modified_time":"2024-09-03T07:45:34+00:00","og_image":[{"width":1700,"height":1083,"url":"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2016\/08\/antonella-framwork.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@Antonella_FW","twitter_misc":{"Est. reading time":"24 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/legacy.antonellaframework.com\/documentacion\/","url":"https:\/\/legacy.antonellaframework.com\/documentacion\/","name":"Documentaci\u00f3n - Antonella Framework","isPartOf":{"@id":"https:\/\/legacy.antonellaframework.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/legacy.antonellaframework.com\/documentacion\/#primaryimage"},"image":{"@id":"https:\/\/legacy.antonellaframework.com\/documentacion\/#primaryimage"},"thumbnailUrl":"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2017\/01\/cropped-logo-antonella-framework-512_2.png","datePublished":"2017-02-16T13:57:24+00:00","dateModified":"2024-09-03T07:45:34+00:00","breadcrumb":{"@id":"https:\/\/legacy.antonellaframework.com\/documentacion\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/legacy.antonellaframework.com\/documentacion\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/legacy.antonellaframework.com\/documentacion\/#primaryimage","url":"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2017\/01\/cropped-logo-antonella-framework-512_2.png","contentUrl":"https:\/\/legacy.antonellaframework.com\/wp-content\/uploads\/2017\/01\/cropped-logo-antonella-framework-512_2.png","width":512,"height":512},{"@type":"BreadcrumbList","@id":"https:\/\/legacy.antonellaframework.com\/documentacion\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/legacy.antonellaframework.com\/"},{"@type":"ListItem","position":2,"name":"Documentaci\u00f3n"}]},{"@type":"WebSite","@id":"https:\/\/legacy.antonellaframework.com\/#website","url":"https:\/\/legacy.antonellaframework.com\/","name":"Antonella Framework","description":"El mejor framework para el desarrollo de plugins en WordPress","publisher":{"@id":"https:\/\/legacy.antonellaframework.com\/#\/schema\/person\/59c038779fe663c173c1ec78e2ae8901"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/legacy.antonellaframework.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/legacy.antonellaframework.com\/#\/schema\/person\/59c038779fe663c173c1ec78e2ae8901","name":"Carlos Herrera","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/8a724c66fdb042b1403f35d88aa426f4a6619f697e64cb8662b898e6e437c6da?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/8a724c66fdb042b1403f35d88aa426f4a6619f697e64cb8662b898e6e437c6da?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8a724c66fdb042b1403f35d88aa426f4a6619f697e64cb8662b898e6e437c6da?s=96&d=mm&r=g","caption":"Carlos Herrera"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/8a724c66fdb042b1403f35d88aa426f4a6619f697e64cb8662b898e6e437c6da?s=96&d=mm&r=g"}}]}},"_links":{"self":[{"href":"https:\/\/legacy.antonellaframework.com\/en\/wp-json\/wp\/v2\/pages\/2991","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/legacy.antonellaframework.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/legacy.antonellaframework.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/legacy.antonellaframework.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/legacy.antonellaframework.com\/en\/wp-json\/wp\/v2\/comments?post=2991"}],"version-history":[{"count":67,"href":"https:\/\/legacy.antonellaframework.com\/en\/wp-json\/wp\/v2\/pages\/2991\/revisions"}],"predecessor-version":[{"id":3371,"href":"https:\/\/legacy.antonellaframework.com\/en\/wp-json\/wp\/v2\/pages\/2991\/revisions\/3371"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/legacy.antonellaframework.com\/en\/wp-json\/wp\/v2\/media\/2953"}],"wp:attachment":[{"href":"https:\/\/legacy.antonellaframework.com\/en\/wp-json\/wp\/v2\/media?parent=2991"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}