WordPress
Notebook
Custom Content Type Manager (CCTM)
[TODO] ¿Cómo personalizar la pantalla de mantenimiento?
Hay que tener en cuenta que WordPress almacena en la base de datos tanto los url absolutos de los enlaces como las rutas absolutas de los archivos.
Debido a esto, un cambio en el dominio del site, o de ubicación física, puede dejar inutilizable el site, o afectarlo seriamente.
Por el momento, mover un site a otra ubicación, no es una tarea trivial (como con Drupal, por ejemplo), y hay que seguir con cuidado ciertas pautas.
Pasar un site http://localhost/mywordpress a http://mydomain.com/mywordpress puede ser una tarea complicada, ya que la base de datos contiene en duro esos url.
También las rutas de muchos archivos.
Me ha resultado usar los siguientes pasos:
Admin in English with Switch agrega a la barra superior un menú para activar o desactivar el idioma inglés para la interfaz del administrador.
Users, User Role Editor. Para administrar roles de usuario.
Requiere instalar previamente el plugin User Role Editor.
Edit Flow. Para administrar el flujo de publicación.
Requiere instalar previamente el plugin Edit Flow.
Custom Content Type Manager facilita la creación de nuevos tipos de posts, nuevos campos y nuevas taxonomías.
Simple Page Ordering permite ordenar arbitrariamente los posts y custom posts. El reordenamiento se hace diréctamente en la lista de posts. La información de orden se guarda en el campo menu_order.
Cada tipo a reordenar debe tener soporte para page-attributes y además hierarchical en true. Si se usa CTM, para el tipo deseado, hacer click en Edit, tab Fields, check Page Attributes, check Hierarchical, Save.
Post Types Order permite ordenar arbitrariamente los posts y custom posts. Para cada tipo, provee un enlace (Re-order) y una pantalla adicional donde hacer el reordenamiento.
NextGEN Gallery facilita la creación de galerías de imágenes.
Aunque provee varias opciones y plugins adicionales (como NextGEN 3D and 2D Animated Flux Slider Template) para presentación, es posible prescindir de ellas y hacer manualmente los templates, usando cualquier biblioteca:
White Label CMS
White Label CMS facilita la personalización de la Pantalla de Administración (ocultar opciones, menús, entre otras cosas). Permite también personalizar la pantalla de login.
Es similar a: WP Admin UI Customize, AG Custom Admin
/* Theme Name: My Minimal Theme URI: Author: Rulo Kobashikawa Author URI: http://akcdev.blogspot.com Description: My Minimal theme Version: 1.0 License: GNU General Public License v2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html Tags: minimal, simple Text Domain: minimal */ |
style.css | hoja de estilos |
/* Theme Name: My Minimal Theme URI: Author: Rulo Kobashikawa Author URI: http://akcdev.blogspot.com Description: My Minimal theme Version: 1.0 License: GNU General Public License v2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html Tags: minimal, simple Text Domain: minimal */ | modelo de info que se pone como comentario al inicio de style.css |
/* Theme name: Twenty Twenty URI: http://akcdev.blogspot.com Description: twentyten child theme Author: Rulo Kobashikawa Template: twentyten Version: 1.0 */ | Child theme |
index.php | template mínimo |
<?php get_header(); ?> | imprime el contenido de header.php |
<?php get_sidebar(); ?> | imprime el contenido de sidebar.php |
<?php get_footer(); ?> | imprime el contenido de footer.php |
functions.php | funciona como biblioteca común, es incluido automáticamente |
bloginfo($key) | imprime la info correspondiente a $key |
bloginfo('template_url') | imprime la ruta del template |
get_bloginfo($key) | devuelve la info correspondiente a $key |
define( 'TEMPPATH', get_bloginfo('stylesheet_directory')); define( 'IMAGES', TEMPPATH. "/images"); | se puede colocar en functions.php para definir el directorio de imagenes |
<title><?php bloginfo('name'); ?><?php wp_title('|'); ?></title> | bloginfo('name') imprime el nombre del site o blog wp_title() es el título de la página o post | es el código de la barra vertical que se usa como separador |
<link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" /> | bloginfo('stylesheet_url') imprime el url de la hoja de estilos style.css |
<link rel="pingback" href="<?php bloginfo('pingback_url'); ?>" /> | para pingback |
<link rel="shortcut icon" type="image/x-icon" href="<?php bloginfo('template_url'); ?>/favicon.ico" /> | para favicon |
<!--[if lt IE 9]> <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> | html5shim |
<?php wp_head(); ?> | imprime contenido de cabecera relativo al tema y otros plugins |
<?php wp_footer(); ?> | imprime contenido de pie relativo al tema y otros plugins |
searchform.php | usado por el widget Search |
<div class="searchbar"> <form name="search" method="get" action="<?php bloginfo('url'); ?>"> <input type="text" name="s" value="Search..." /> <input type="submit" name="submit" value="Search!" /> </form> </div> | modelo de contenido para searchform.php bloginfo('url') imprime el url del site |
get_search_form() | imprime el contenido de searchform.php |
Si se parte de un template html estático con rutas relativas internas, será necesario colocar al inicio de todas <?php bloginfo('template_url') ?>/ (imprime el url del template) para que sean absolutas y tengan sentido en wordpress.
Es un tema que hereda las definiciones de otro tema, llamado padre.
En la info del tema, el nombre del padre se indica en el campo Template, como en:
/*
Theme name: Twenty Twenty
URI: http://akcdev.blogspot.com
Description: twentyten child theme
Author: Rulo Kobashikawa
Template: twentyten
Version: 1.0
*/
Las definiciones que hubiera en el child theme sobrescriben a las del padre.
Excepto con functions.php, que no es sobrescrito sino extendido.
<?php bloginfo('template_url') ?>/ imprime el url del template padre, para imprimir el url del child theme, puede ser útil definir en functions una constante como:
define('theme_directory', dirname( get_bloginfo('stylesheet_url')) );
Es posible definir muchos archivos de template para producir diversas partes de la página.
Dado un URL, Wordpress usa un sistema de decantado para determinar qué templates se aplican.
Si ninguna regla es aplicable, el template por default es index.php.
Es un php que se usa para generar una página. A cada página se le podría aplicar un template distinto.
La cabecera del template contiene la info con su nombre. Por ejemplo:
intro.php
<?php
/*
Template Name: Intro
*/
?>
<!DOCTYPE HTML>...
Con esto, al editar una página, Intro estará disponible como template.
Si Settings, Reading, Front Page: Your latest posts, front-page.php es usado como template, si no, home.php es usado como template. Si no, se usa index.php.
Settings, Reading, Front page displays: A static page. Luego, indicar cuál página (creada con Pages) será mostrada como Front page y cuál como Posts page.
home.php es ignorado pero front-page.php es usado como template. Si no, se usa el template de la página.
Es usual tener el logo como link a la página de inicio. Para eso puede funcionar algo como:
<div id="logo"> <a href="<?php bloginfo('wpurl'); ?>"> <img src="<?php bloginfo('template_url'); ?>/img/logo.jpg" alt="Site Name"> </a> </div> |
El soporte de menús debe ser declarado explícitamente. En functions.php se puede colocar algo como:
add_action('after_setup_theme', 'mytheme_setup'); function mytheme_setup() { register_nav_menus( array( 'primary' => __( 'Principal' ) ) ); } |
En el template, el menú se puede presentar con un código como:
<?php wp_nav_menu(array( 'menu' => 'header', 'container' => false, )); ?> |
Para más información: http://codex.wordpress.org/Function_Reference/wp_nav_menu
wp_header() y wp_footer() colocan en el header o en el footer los scripts que se hayan registrado en functions.php
Es posible registrar todos los scripts en functions, o parte de ellos.
El siguiente código en functions.php, permite cargar jQuery desde un CDN o localmente, en el estilo de bolierplate:
functions.php
// Replace default jQuery if (!is_admin()) add_action("wp_enqueue_scripts", "my_jquery_enqueue"); function my_jquery_enqueue() { wp_deregister_script('jquery'); wp_register_script('jquery', get_template_directory_uri() . "/js/jquery-local.js", array('jquery-cdn'), null); wp_enqueue_script('jquery'); wp_register_script('jquery-cdn', "//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js", false, null); wp_enqueue_script('jquery-cdn'); } |
jquery-local.js
window.jQuery || document.write('<script src="<?php bloginfo('template_url') ?>/js/vendor/jquery-1.8.3.min.js"><\/script>') |
Para más información:
Settings, Permalinks, elegir una opción distinta de Default.
Luego, el template 404.php es usado si se produce un error 404 (cuando no se encuentra una página).
Settings, Theme My Login, y establecer los parámetros de configuración. Requiere instalar previamente el plugin Theme My Login. El plugin crea automáticamente la página Login, cuyo contenido es:
[theme-my-login]
Esa página se puede personalizar.
También se puede copiar plugins/theme-my-login/theme-my-login.css a la carpeta del tema y personalizarla.
También se pueden copiar los templates de plugins/theme-my-login a la carpeta del tema y personalizarlos.
También se pueden activar opciones para mejorar otros aspectos del login, como seguridad, redirección, etc.
Por ejemplo, para quitar el Menú de Contact 7 En functions.php:
add_action('admin_menu', 'mytheme_remove_menus'); function mytheme_remove_menus() { global $menu; $restrict = array(); $noadmin = array(__('Contacto')); if (!current_user_can('activate_plugins')) { $restrict = array_merge($restrict, $noadmin); } foreach ($menu as $key=>$item) { if ( in_array($item[0], $restrict) ) { unset($menu[$key]); } } } |
is_home() | true si la página es el home home es como se llama a la página de posts recientes |
is_front_page() | true si la página es el front page |
<?php $query = new WP_Query($args); ?>
<?php if ($query): ?>
<?php while($query->have_posts()) : $query->the_post();?>
<?php the_title(); ?>
<?php the_content(); ?>
<?php endwhile; ?>
</ul>
<?php endif; ?>
$args es un array, como
array('post_type'=>'mycustomtype', 'orderby'=>'menu_order', 'order'=>'ASC', 'posts_per_page'=>'-1')
El valor por default de posts_per_page es 10.
$query->found_posts devuelve el número de registros
Sobre el ordenamiento, en CCTM, el tab Advanced, elegir el mismo Order By y Order que el que se indique en el WP_Query, para que corresponda el orden que se muestra en el admin.
/* Plugin Name: Hello World Plugin URI: Description: A simple plugin for Hello World Author: Antonio Kobashikawa Carrasco Version: 1.0 Author URI: http://akcdev.blogspot.com */ |
function myplugin_myfunction() { ?> <div> My HTML </div> <?php } |
Un hook da a un plugin la oportunidad de participar cuando un cierto evento ocurre.
hook | descripción |
wp_head | add_action('wp_head', 'myplugin_myfunction') incluye en el header la salida de 'myplugin_myfunction' |
Es posible definir shortcodes (que son similares a las etiquetas html, excepto que van entre [] en lugar de entre <>):
function hw_hello($who) { return "Hello $who!"; } /* Esto permite usar en el contenido de un post algo como [hw_hello who="World"] */ function hw_insert_hello($atts, $content=null) { extract(shortcode_atts(array( 'who' => $atts['who'] ), $atts)); return hw_hello($who); } add_shortcode('hw_hello', 'hw_insert_hello'); |
Al desarrollar un plugin, puede ayudar este checklist:
__FILE__ | ruta del script |
dirname(__FILE__) | ruta del directorio del script |
plugin_dir_path(__FILE__) | ruta del directorio del script |
plugins_url() | url del directorio de plugins |
plugins_url('img/icon.png', __FILE__) | url de img/icon.png relativo al directorio del script |
includes_url() | url del directorio de includes |
content_url() | url del directorio de contenidos |
admin_url() | url de administrador |
site_url() | url del site |
home_url() | url del home |
register_activation_hook(__FILE__, ‘myplugin_activation’) | para que myplugin_activation se ejecute al activar el plugin |
register_deactivation_hook(__FILE__, 'myplugin_deactivation') | para que myplugin_deactivation se ejecute al desactivar el plugin |
register_uninstall_hook(__FILE__, 'myplugin_uninstall') | para que myplugin_uninstall se ejecute al eliminar el plugin Es recomendable que esta línea vaya dentro de la función de activación. Por ejemplo myplugin_activation. Si existe uninstall.php, se usará en lugar del hook. |