Tutorial: Cómo añadir un panel de opciones a tu tema de Wordpress

  • Autor Autor mrv89
  • Fecha de inicio Fecha de inicio
M

mrv89

Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Este tutorial lo escribo porque hace un tiempo comencé a desarrollar temas para wordpress con licencias comerciales y de inmediato surgió la necesidad de incorporar un panel de opciones de personalización para cada tema. Al buscar información sobre paneles de usuario (opciones) para wordpress encontré muy pocos tutoriales buenos, y la mayoría incluía mucho pero mucho código. Este tutorial se basa en incorporar un panel de opciones para temas wordpress utilizando un framework llamado NHP Theme Options Panel, que es el framework que utilizo actualmente, y con el cual he obtenido muy buenos resultados.

¿Para qué sirve un panel de opciones?

Ver el archivo adjunto 11925

Un panel de opciones le ofrece a los usuarios distintos niveles de personalización que de otra forma sólo sería posible modificando el código fuente del tema. El panel permite cambiar logos, colores, fondos, títulos, fuentes y una infinidad de opciones.

El NHP Theme Options Framework está disponible para descargarlo en GitHub y puede ser utilizado tanto para proyectos comerciales como personales.

Instalación del Framework

Paso 1
: Descargar desde GitHub.

Paso 2: Extraer los archivos, en ellos encontrarás un documento llamado “nhp-options.php” y una carpeta con el nombre “opt”.

Paso 3: Copia los archivos al directorio raiz de tu theme ej: (wp-content/themes/tu-theme)

Ver el archivo adjunto 11928

Paso 4: Ve al archivo “functions.php” de tu theme y escribe la siguiente línea de código:

PHP:
// NHP Theme Options Panel
if (is_admin()) {
require('nhp-options.php' );
}

Paso 5: Listo!, ahora el panel está instalado y listo para trabajar.

Ver el archivo adjunto 11926

Ahora se viene lo bueno..

Paso 7: Abrir el archivo que incluimos en el directorio del theme (nhp-options.php), en la línea 103 aproximadamente encontraremos este código:

PHP:
//Choose a custom option name for your theme options, the default is the theme name in lowercase with spaces replaced by underscores
$args['opt_name'] = 'twenty_eleven';

Importante: Aquí debemos reemplazar donde dice ‘twenty_eleven’ por el nombre de nuestro theme, o cualquier nombre que deseen.

Paso 8: Personalizar, personalizar!

Ahora viene lo importante, no sacamos nada con tener un panel repleto de opciones que nunca vamos a utilizar, por lo que hay que decidir qué es lo que vamos a necesitar y que es lo que no.

A partir de la línea 153 aprox, encontraremos las opciones del framework, todo que agreguemos o quitemos aqui se vera reflejado en el panel de opciones.

Ver el archivo adjunto 11927

En la imagen anterior podemos ver como funciona el panel, las opciones están almacenadas en arrays, entonces por ejemplo, en la segunda sección se puede ver lo siguiente (Versión simplificada):

PHP:
$sections[] = array(
               'icon' => NHP_OPTIONS_URL.'img/glyphicons/glyphicons_107_text_resize.png', // EL ÍCONO QUE LLEVARÁ LA SECCIÓN
               'title' => __('Text Fields', 'nhp-opts'), //EN NOMBRE QUE LLEVARÁ LA SECCIÓN
               'desc' => __('<p class="description">This is the Description. Again HTML is allowed2</p>', 'nhp-opts'), //LA DESCRIPCIÓN
               'fields' => array( //AQUÍ COMIENZAN LOS CAMPOS DE LA SECCIÓN
                   array(
                       'id' => '1', //EL ID DEL CAMPO (Puede ser en texto por ejemplo: txt_titulo_principal)
                       'type' => 'text', // TIPO DE CAMPO (En este caso es un text)
                       'title' => __('Text Option', 'nhp-opts'), //EL TITULO
                       'sub_desc' => __('La descripción del campo', 'nhp-opts'),
                       'desc' => __('Otra descripción para información adicional', 'nhp-opts'),
                       'std' => '', //EL VALOR POR DEFECTO (Si el usuario lo deja vacio, o el valor con el que vendrá el theme)
                        ),
                  // más campos de aquí hacia abajo...

Ahora a modo de ejemplo voy a agregar una sección que utilizaré en uno de mis temas:

PHP:
$sections[] = array(
				'icon' => NHP_OPTIONS_URL.'img/glyphicons/glyphicons_023_cogwheels.png',
				'title' => __('Opciones Generales', 'nhp-opts'),
				'desc' => __('', 'nhp-opts'),
				'fields' => array(
					array(
                                                //Select para decidir si se usara una imagen como logo o no.
						'id' => 'slc_logo', //El id del campo
						'type' => 'select', //Campo del tipo Select
						'title' => __('Utilizar un logo para el theme?', 'nhp-opts'), //Titulo
						'sub_desc' => __('Selecciona entre si o no', 'nhp-opts'), //Descripción (Opcional)
						'desc' => __('', 'nhp-opts'), //Otra descripción (Opcional)
						'options' => array('1' => 'No','2' => 'Si'),//Valores del Select (No es = 1 y Si es = 2) IMPORTANTE!
						'std' => '1' //El valor por defecto es 1 (Es decir No)
						),
					array(
                                                 //Text para la url de la imagen
						'id' => 'logo_url', //El ID será logo_url
						'type' => 'text', //Campo tipo texto
						'title' => __('Logo URL', 'nhp-opts'), //Titulo
						'sub_desc' => __('Ingresa la URL de tu logo', 'nhp-opts'), //Descripción (Opcional)
						'desc' => __('Deja este campo vacío si no quieres usar una imagen como logo', 'nhp-opts'), //Otra descripción (Opcional)
						'std' => '' //Valor por defecto vacío
						)
					)
				);

En el código de arriba creamos una sección llamada "Opciones Generales", dentro de esa sección van dos campos, uno de tipo SELECT y otro de tipo TEXT, el primero va a servir como estructura de control para decidir si utilizar, o no, una imagen como logo. En caso contrario mostraremos el titulo del Blog, (definido en las opciones generales de wordpress).

Entonces, al guardar el archivo y actualizar, mi nueva sección debería verse así:

seccion de prueba.webp

Y ahora ¿Como diablos utilizo esto en mi tema?, sencillo:

En el paso 7 definimos un nombre para las opciones, ahora debemos insertar este código en el lugar que tu desees del theme (header.php de preferencia, pero probar en otras secciones en caso de que no lo tome):

PHP:
<?php $options = get_option('el_nombre_que_elegiste'); ?>

Esto almacena todas nuestras opciones del theme en $options, y podremos acceder a ellas definiendo su índice o ID que utilizamos para cada campo, cuando creamos el select para decidir si utilizamos o no una imagen como logo se le asignó el id de 'slc_logo'

Y ahora utlizamos la sección que creamos:


En mi caso y para mis necesidades, el código quedo así:

PHP:
<div id="header">
	<h1>
          <?php if($options['slc_logo'] == 2): ?>
           <a href="<?php echo get_option('home'); ?>/"><img class="logot" src="<?php $options['logo_url'] ?>" /></a>
          <?php else: ?>
           <a href="<?php echo get_option('home'); ?>"><?php bloginfo('name'); ?></a>
       </h1>
</div>

En el código de arriba tengo un div que define el header del theme, luego viene el h1 donde estará el titulo del blog o el logo, para determinar esto utilizamos las opciones del theme. Utilizando un if bastante simple verificamos que valor tiene asignado el select que creamos en el panel, en caso de que el select tenga asignado el valor "2" (que significa "si") vamos a mostrar una imagen como logo, la url de la imagen sera la que el usuario ingresó en el segundo de nuestros campos, el text. Llamamos al valor a través de su ID 'logo_url'. Si el select tiene un valor distinto a 2 dentro del h1 va a ir el titulo del blog, esto a través de la funcion de wordpress bloginfo('name').

Como ven es cosa de experimentar, el framework viene con todas las opciones posibles, campos para generar degradados, colores, fechas, seleccionar posts, texto, etc, etc, etc. Es sólo cosa de bajar y probar.

No está demás decir que este es el primer tutorial que hago en mi vida, no tengo experiencia enseñando y si me salió muy enredado me pueden consultar, no tengo problemas en responder cualquier tipo de duda al respecto.

Bueno espero que esto le sirva a alguien, un saludo.
 
Excelente aporte! :encouragement:
 
Gracias por el aporte, le será muy útil a muchos.

Saludos.
 
Gracias, muy interesante!
 
Justo buscaba esto, gracias :3
 
Se ve genial. Ya lo revisaremos con calma. Muchas gracias.

Enviado desde mi SGS3 Mini usando Tapatalk 2
 
Gracias por la informacion pero ya no esta disponible
 
Muy prometedor, prometo revisarlo ...
 
Esta muy bien este panel de opciones, y probandolo he notado un problemilla, y es que entrecomilla el resultado.
por ejemplo si creo una opcion para que puedan meter un iframe o el codigo para la publicidad,

PHP:
<?php echo $options['1'];?>
me devuelve

PHP:
"
<script type="text/javascript"><!--
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="how_ads.js">
</script>

"


y al meter el codigo entrecomillado, no ejecuta el codigo y solo lo toma como texto,
eso no me pasa, con los campos personalizados, o con el menu de opciones que creo manual.

haciendo pruebas, he notado que esto solo ocurre con los textarea, con los campos text funciona correctamente

¿alguna sugerencia?
 
Última edición:
"Archivo Adjunto especificado inválido. Si has seguido un enlace válido, por favor notificalo al administrador"
 
Esa super el Tutorial Pienzo implantarlo en unos de mi sitios web 😀

Gracia buen aporte!
 
no logro que me muestre algo
Tengo lo siguiente
Modifique la linea 103 como mencionas

Insertar CODE, HTML o PHP:
$args['opt_name'] = 'movistrap';

Esto es lo que inserte en el head despues de <body>

Insertar CODE, HTML o PHP:
<?php $options = get_option('movistrap'); ?>

este es el codigo personalizado que yo cree y que deseo que muestre las url que insertan en los campos

Insertar CODE, HTML o PHP:
$sections[] = array(
				'icon' => NHP_OPTIONS_URL.'img/glyphicons/glyphicons_093_crop.png',
				'title' => __('Redes Sociales', 'nhp-opts'),
				'desc' => __('<p class="description">Agrega las url que utilizaran los botonos de redes sociales en el sidebar</p>', 'nhp-opts'),
				'fields' => array(
					array(
						'id' => '1',
						'type' => 'text',
						'title' => __('Url de Facebook', 'nhp-opts'), 
						'sub_desc' => __('Ejemplo: https://www.facebook.com/Kerneleros', 'nhp-opts'),
						'desc' => __('Colca aqui la url de tu fanpage o perfil de facebook .', 'nhp-opts')
						),
					array(
						'id' => 'gourl',
						'type' => 'text',
						'title' => __('Google + Url', 'nhp-opts'), 
						'sub_desc' => __('Ejemplo: https://www.facebook.com/Kerneleros', 'nhp-opts'),
						'desc' => __('Colca aqui la url de tu pagina de Google+ del sitio o personal.', 'nhp-opts')
						),
					array(
						'id' => 'tweturl',
						'type' => 'text',
						'title' => __('Twitter Site Url', 'nhp-opts'), 
						'sub_desc' => __('ejemplo: http://twitter.com/kerneleros', 'nhp-opts'),
						'desc' => __('Colca aqui la url de tu cuenta de twitter o la del sitio.', 'nhp-opts')
						),
					array(
						'id' => 'yuturl',
						'type' => 'text',
						'title' => __('Youtube Url', 'nhp-opts'), 
						'sub_desc' => __('Ejemplo: http://www.youtube.com/user/MsDarkcr', 'nhp-opts'),
						'desc' => __('Cola la url de tu canal de youtube.', 'nhp-opts')
						),
					array(
						'id' => 'dailurl',
						'type' => 'text',
					'title' => __('dailymotion Url', 'nhp-opts'), 
						'sub_desc' => __('Ejemplo: http://www.dailymotion.com/darkcrizt', 'nhp-opts'),
						'desc' => __('Coloca la Url de tu canal de dailymotion.', 'nhp-opts')
						),
                        array(
						'id' => 'askurl',
						'type' => 'text',
						'title' => __('Ask.fm url', 'nhp-opts'), 
						'sub_desc' => __('Ejemplo: http://ask.fm/darkcrizt', 'nhp-opts'),
						'desc' => __('Coloca la url de tu perfil de Ask.fm.', 'nhp-opts')
						),	
                       array(
						'id' => 'fdburl',
						'type' => 'text',
						'title' => __('Feedburner url', 'nhp-opts'), 
						'sub_desc' => __('Ejemplo: http://feeds.feedburner.com/kerneleros', 'nhp-opts'),
						'desc' => __('Coloca la url de tu feedburner.', 'nhp-opts')
						),	
                        array(
						'id' => 'pinurl',
						'type' => 'text',
					'title' => __('Pinterest url', 'nhp-opts'), 
						'sub_desc' => __('ejemplo:http://pinterest.com/darkcrizt/', 'nhp-opts'),
						'desc' => __('Coloca la url de tu Pinterest.', 'nhp-opts')
						),	
                       array(
						'id' => 'vimurl',
						'type' => 'text',
					'title' => __('Vimeo Url', 'nhp-opts'), 
						'sub_desc' => __('Ejemplo: https://vimeo.com/darkcrizt', 'nhp-opts'),
						'desc' => __('Coloca la url de tu canal de Vimeo.', 'nhp-opts')
						)							
					)
				);

Y de seo que se muestre en el sig codigo html que tengo en mi sidebar

Insertar CODE, HTML o PHP:
	<!--Boton Facebook-->  		
<div class="botones-social">        
<a class="f-bg" href="<?php echo $options['1'] ;?>">     
<i class="icon-social f-lg"></i> Kerneleros en Facebook                
</a>    </div>    
<!--Boton twitter-->    
<div class="botones-social">        
<a class="t-bg" href="<?php echo $options['tweturl']; ?>">    
<i class="icon-social t-lg"></i> Kerneleros en Twitter</a>    </div>    
<!--Boton Google plus--> 
<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><span itemprop="name"> <div class="botones-social">        
<a class="g-bg" href="<?php echo $options['gourl'] ;?>">      
<i class="icon-social g-lg"></i> Kerneleros en Google +</a></div>  </span> </span> 
 <!--Boton Youtube-->    
 <div class="botones-social">        
 <a class="y-bg" href="<?php echo $options['yuturl'] ;?>">     
 <i class="icon-social y-lg"></i> Kerneleros en Youtube            
 </a>    </div><!--Boton Dailymotion-->    
 <div class="botones-social">        
 <a class="f-bg" href="<?php echo $options['dailurl'] ;?>">     
 <i class="icon-social dai-lg"></i> Dailimotion de Kerneleros           
 </a>    </div>    <!--Boton RSS-->    
 <div class="botones-social">        
 <a class="pt-bg" href="<?php echo $options['fdburl'] ;?>">      
 <i class="icon-social fe-lg"></i> FeedBunner de Kerneleros   
 </a>    </div>    <!--Boton Pinterest-->    
 <div class="botones-social">        
 <a class="g-bg" href="<?php echo $options['pinurl'] ;?>">       
 <i class="icon-social p-lg"></i> Pinterest de Kerneleros            
 </a>    </div>    <!--Boton Ask.FM-->   
 <div class="botones-social">        
 <a class="pt-bg" href="<?php echo $options['askurl'] ;?>">    
 <i class="icon-social ask-lg"></i> Ask.Fm de kerneleros           
 </a>    </div><!--Boton Vimeo-->    
 <div class="botones-social"> <a class="t-bg" href="<?php echo $options['vimurl'] ;?>">       
 <i class="icon-social vi-lg"></i> Kerneleros en Vimeo           
 </a>    </div>
Pero no muestra las urls :/

---------- Post agregado el 01-jul-2013 hora: 01:18 ----------

Me auto respondo hay que colocar la etiqueta en cada parte del theme donde utilizemos las opciones del framework
<?php $options = get_option('movistrap'); ?>
POr ejemplo en header y sidebar hay que delcararlo en cada archivo
 
de lujo el tutorial
 
te lo has trabjado. Gracias 🙂
 
Muchas gracias, me es de mucha ayuda.
 
se ve bueno, lo revizare con mas calma, soy bueno diseñando...
lo que me faltaria seria implementarlo a wordpress y a vender mis themes y usarlos para mis clientes :topsy_turvy:

mil graciass
 
Excelente aporte.
 
Atrás
Arriba