Con el fin de lanzar una red global económica de sitios administrados por voluntarios que proporcionaría a los compradores directorios categorizados en tiendas locales, necesitaba aprovechar el poder de WordPress con algunas personalizaciones y soluciones inusuales. Hay una serie de enfoques para proporcionar experiencias locales con WordPress. En este tutorial, te mostraré por qué y cómo decidimos hacer una solución personalizada..
En julio, lancé una guía global sobre alternativas basadas en Internet para comprar en Amazon llamada FleetheJungle.com y la respuesta fue excelente. Recibimos mucha cobertura mediática y tráfico posterior. No es una aplicación basada en bases de datos; en su lugar, aprovechamos el destacado tema de base de conocimientos de KnowHow:
Pero para hacer crecer el sitio, necesitábamos ofrecer versiones geolocalizadas para ciudades individuales. Ciertamente, el sitio global ayuda a los visitantes a cancelar sus membresías principales o encontrar alternativas a los libros Kindle, pero no había nada que alentara a las personas a apoyar a las pequeñas empresas en sus comunidades..
Para comenzar, crearíamos una guía para los compradores locales en la cercana Portland, una ciudad con una orgullosa herencia de pequeñas empresas independientes y extravagantes..
Crédito: Forest and Waves Portland Map por Edward Juan.Ciertamente, he escrito lo suficiente sobre el lanzamiento rápido de una gran cantidad de sitios web de WordPress que utilizan recetas preconfiguradas y pre-optimizadas, pero mantener los requisitos relacionados para una red puede consumir mucho tiempo, como la gestión de SEO, WordPress y actualizaciones de complementos, etc..
También consideré WordPress Multisite pero a pesar de que sé ella es crecimos mucho, teníamos una serie de complicados emparejamientos difíciles y probablemente nunca debimos estar juntos. Una vez que te involucras con "ella", es muy difícil romper..
Necesitaba una solución más simple.
En este tutorial, lo guiaré a través de las personalizaciones y los trucos que utilicé con WordPress y mi tema de base de conocimientos para lanzar nuestra guía de compras de Portland y facilitar el lanzamiento de cualquier otra ciudad, evitando los gastos generales de administrar docenas o cientos de sitios.
Estos son algunos de los requisitos básicos para lanzar más sitios:
1. Mantener un sitio mundial. Quería mantener el dominio primario global de fleethejungle.com intacto, sin artículos locales, sino una guía de nuestras ciudades disponibles.
2. Localizar por subdominio. Quería contenido localizado por subdominio. Por ejemplo, una visita a http://portland.fleethejungle.com promovería el contenido local en el sitio y reutilizaría algunas categorías específicas de sitios nacionales relacionadas con las compras en Internet, por ejemplo. transmisión de video (no hay una alternativa basada en Portland a HBO Now). CraigsList proporciona un buen modelo para esto.
3. Integración entre local y mundial.. Quería ofrecer a los visitantes locales una explicación de las diferencias entre su sitio local y el sitio global, al mismo tiempo que les animé a participar para ayudar a mejorar las listas en su ciudad..
4. Gestionado por voluntarios. Quería facilitar la adición regular de ciudades al sitio de una manera que solo requiera voluntarios con habilidades básicas de blogging para iniciar y mantener. Hay demasiados requisitos para lanzar nuevos sitios de WordPress para cada ciudad individual para hacer esto fácilmente con voluntarios.
5. Mantenimiento mínimo.. Finalmente, quería mantener el mantenimiento de la red del sitio tan simple como ejecutar un solo sitio.
Exploremos algunos de los enfoques técnicos que se utilizan a menudo para abordar este tipo de requisitos.
Para la gestión de contenido, hay tres enfoques básicos que pensé:
Como dije anteriormente, no soy un fan de Multisite y quería evitar la complejidad de lanzar y mantener una variedad de sitios de WordPress. Un sitio como Flee the Jungle tendría tanto contenido central que tendría que reutilizarse en todas las páginas de la ciudad (como la forma de cancelar su membresía Prime), y no quería tener que mantener este contenido en diferentes instalaciones de WordPress. -o escribir código para hacerlo.
Decidí filtrar el contenido en función del dominio o subdominio utilizado por el visitante en el navegador.
Si ha leído mi tutorial Cómo usar los mapas de vecindario de Zillow y la geolocalización HTML5, sabrá cómo usar la geolocalización basada en el navegador HTML5 para determinar dónde está un usuario. Sin embargo, quería que el usuario tuviera más control..
Quería que el usuario utilizara un subdominio como el que ha trabajado durante años con CraigsList para guiarlos a su ciudad..
Pero el dominio de WordPress sobre las URL absolutas dificulta esto. Cuando comencé a experimentar con el seguimiento del subdominio entrante de una ciudad y asignándolo a los enlaces de la página, me topé con el hábito de WordPress de crear enlaces absolutos en casi todas partes. Un colega con el que hablé al respecto se rió de inmediato cuando le pregunté al respecto: es un enemigo común de los desarrolladores de WordPress..
En este tutorial, compartiré las personalizaciones dentro de las consultas basadas en PHP de nuestro tema para construir nuestros sitios basados en la ciudad y cómo finalmente resolvimos el problema del URL absoluto.
Así es como decidí implementar sitios basados en la ciudad para Huir la jungla que los blogueros locales podrían mantener y crear fácilmente sin habilidades técnicas adicionales.
Los artículos escritos para ciudades se etiquetarían por nombre de ciudad, por ejemplo, "Portland". Los artículos para el sitio global se etiquetarán como "mundial". Quería la posibilidad de incluir artículos de todo el mundo sobre tiendas basadas en Internet para algunas categorías en las que existía un soporte local menos efectivo, como la transmisión de videos. Sin duda, otras categorías son apropiadas para enfocarse exclusivamente en tiendas locales, como comestibles, tiendas de autos y tiendas de juguetes..
Para los sitios geolocalizados, mantenemos las categorías mundiales en su lugar y solo mostramos artículos diferentes para las categorías apropiadas a nivel local. En el futuro, agregaremos artículos de todo el mundo a las opciones locales dentro de una categoría cuando sea apropiado.
Cuando los visitantes ven las páginas de categorías y realizan búsquedas, también filtramos y personalizamos los resultados en función de estas opciones de diseño..
Para hacer esto, definimos matrices dentro del tema por sus IDs:
Aquí están algunos ejemplos. Primero, aquí está mi selección de ID de categoría (no locales) en todo el mundo:
// Las ID de categoría que son mundiales, se mostrarán digitalmente sin cambios // por ejemplo Primeros pasos, Alternativas principales y sonrientes, Medios de transmisión, etc. $ nonlocal_category_ids = [1,22,29,30,46,57,60,195];
Puede recuperarlos desde la identificación de categoría en la lista de categorías del panel de control (al pasar el mouse sobre el nombre de la categoría como se muestra más adelante con etiquetas):
O, edite la categoría y tome la ID de la URL de edición (Empezando es 29):
Aquí están los identificadores de etiquetas para Seattle y Portland:
// ID de etiquetas para nombres de ciudades, por ejemplo, Seattle, Portland $ known_cities = array (49,211);
Seattle es 49. Puedes ver la identificación de la etiqueta al desplazarte sobre la ciudad y dejar que la barra de estado la muestre:
Para obtener el dominio o subdominio, utilicé la sugerencia de WordPress de Trevor Scott y la coloqué dentro de las funciones de mi tema.php.
Aquí está el editor de temas de WordPress Dashboard:
Y aquí está el código de Trevor:
/ ** * @autor Trevor Scott* @version 1.0 2010-12-07 * https: //wordpress.org/support/topic/how-do-i-get-sub-domain-name * Captura la parte del subdominio de la URL. Si no hay subdominio, el dominio raíz * se devuelve. Por defecto, esta función * devuelve * el valor como una * cadena. Al llamar a la función con echo = verdadero, se imprime la respuesta directamente a * la pantalla. * * @param bool $ echo * / function arrest_subdomain ($ echo = false) $ hostAddress = explode ('.', $ _SERVER ["HTTP_HOST"]); if (is_array ($ hostAddress)) if (eregi ("^ www $", $ hostAddress [0])) $ passBack = 1; else $ passBack = 0; if ($ echo == false) return ($ hostAddress [$ passBack]); else echo ($ hostAddress [$ passBack]); else return (false);
Cuando los visitantes lleguen a la página de inicio global, el dominio será fleethejungle.com en lugar de un subdominio. He creado otra función, configure_geolocal ()
, que se llama al principio del archivo header.php de la plantilla. Aquí está la primera parte de la función:
function configure_geolocal () global $ nonlocal_category_ids; global $ known_cities; global $ domain_locale; global $ logo_image_url; // ID de etiquetas para nombres de ciudades, por ejemplo, Seattle, Portland $ known_cities = array (49,211); // Las ID de categoría que son mundiales, se mostrarán digitalmente sin cambios // por ej. Primeros pasos, Alternativas principales y sonrientes, Medios de transmisión, etc. $ nonlocal_category_ids = [1,22,29,30,46,57,60,195]; $ domain_locale = arrestado_subdominio (); if ($ domain_locale == 'www' o $ domain_locale == 'fleethejungle') $ domain_locale = false;
Así es como se llama get_header ()
dentro del header.php del tema:
>
Cuando el dominio es global., $ domain_locale
será falso En estas circunstancias, excluiré los artículos etiquetados localmente por ciudades. Y lo haré en la página de inicio y en la página de categorías. Cuando el dominio se refiere a una ciudad local, $ domain_locale
representará el prefijo, por ej. Seattle o Portland.
En la página de inicio del tema, si el visitante está en el sitio mundial (dominio raíz), excluyo los artículos etiquetados con ciudades de la $ st_cat_post_args
formación. Sin embargo, si el visitante se encuentra en una página de la ciudad y se conoce el subdominio, solo mostramos artículos locales en la mayoría de las categorías, excepto los identificados para nonlocal_category_ids; esos son los más apropiados para contenido no local, como la transmisión de video:
global $ known_cities; global $ nonlocal_category_ids; global $ domain_locale; if ($ domain_locale === false) // root visite $ st_cat_post_args ['tag__not_in'] = $ known_cities; else // se visualiza la ciudad local pero incluye artículos de todo el mundo en esta categoría si (in_array ($ st_category-> term_id, $ nonlocal_category_ids) $ st_cat_post_args ['tag_slug__in'] = array ($ domain_locale, 'worldwide'); else // solo muestra los artículos locales $ st_cat_post_args ['tag_slug__in'] = array ($ domain_locale);
Aquí está el código dentro del contexto de más de la función:
// Listar publicaciones $ st_cat_post_num = of_get_option ('st_hp_cat_postnum'); $ st_posts_order = of_get_option ('st_hp_cat_posts_order'); global $ post; // Si mostrar publicaciones es 0, no haga nada si ($ st_cat_post_num! = 0) // ¿Listado por popular? if ($ st_posts_order == 'meta_value_num') $ st_cat_post_args = array ('numberposts' => $ st_cat_post_num, 'orderby' => $ st_posts_order, 'meta_key') => term_id); else $ st_cat_post_args = array ('numberposts' => $ st_cat_post_num, 'orderby' => $ st_posts_order, 'category__in' => $ st_category-> term_id); global $ known_cities; global $ nonlocal_category_ids; global $ domain_locale; if ($ domain_locale === false) // root visite $ st_cat_post_args ['tag__not_in'] = $ known_cities; else // se visualiza la ciudad local pero incluye artículos de todo el mundo en esta categoría si (in_array ($ st_category-> term_id, $ nonlocal_category_ids) $ st_cat_post_args ['tag_slug__in'] = array ($ domain_locale, 'worldwide'); else // solo muestra los artículos locales $ st_cat_post_args ['tag_slug__in'] = array ($ domain_locale); $ st_cat_posts = get_posts ($ st_cat_post_args); echo '
Con el tema KnowHow, los visitantes también pueden hacer clic en los títulos de las categorías, llevándolos a una lista de artículos dentro de la categoría..
Si están en el sitio global, quiero mostrar solo artículos globales. Elegí etiquetar todos los artículos globales como 'mundial' para facilitar esto.
Entonces, para el sitio global, muestro solo los artículos etiquetados como 'mundial' y para los sitios de ciudades locales, muestro solo los artículos etiquetados para esa ciudad. Si la categoría es un caso excepcional para ambos, incluimos artículos de la ciudad actual y de todo el mundo..
Aquí está el código dentro de la categoría del tema.php:
No estoy personalizando la consulta aquí porque el rendimiento actualmente no es un problema importante. Solo estoy saltando los resultados fuera de contexto y no los estoy mostrando.
En el futuro, podré personalizar esto aún más para los sitios de la ciudad al mostrar resultados mundiales en la parte inferior de la página de categorías en una sección distinta.
También es importante realizar este tipo de personalizaciones para la búsqueda. El tema KnowHow proporciona un resultado de búsqueda AJAX o una página generada de resultados. Necesitamos proporcionar un código para personalizar cada opción..
Live AJAX Search
Para la búsqueda en vivo, no hay get_header ()
Llama por lo que necesitamos configurar nuestra ubicación dinámicamente:
Luego integramos la misma lógica utilizada en las páginas de categoría en los resultados de búsqueda en vivo:
// compruebe si una de sus categorías está excluida de local $ category_excluded = false; foreach ((get_the_category ()) como $ category) if (in_array ($ category-> cat_ID, $ GLOBALS ['nonlocal_category_ids'))) $ category_excluded = true; descanso; if ($ GLOBALS ["domain_locale"]! == false && has_tag ($ GLOBALS ["domain_locale"]) || ($ category_excluded && has_tag ('worldwide'))) ?>
Página de resultados de búsqueda dinámica
Si no es AJAX, entonces get_header ()
Se llama para nosotros y es un poco más simple:
cat_ID, $ GLOBALS ['nonlocal_category_ids'])) $ category_excluded = true; descanso; if ($ GLOBALS ["domain_locale"]! == false && has_tag ($ GLOBALS ["domain_locale"]) || ($ category_excluded && has_tag ('worldwide'))) get_template_part ('content_post_format () ); else if ($ GLOBALS ["domain_locale"] === false && has_tag ("worldwide")) get_template_part ('content', get_post_format ()); ?>
Como mencioné anteriormente para Categorías, puedo decidir personalizar los resultados de búsqueda para mostrar una segunda sección de resultados para artículos globales en sitios de ciudades.
Para proporcionar a los visitantes locales una explicación de las diferencias entre su sitio local y el sitio global y alentarlos a participar para ayudar a mejorar los listados en su ciudad, utilicé un complemento sobre el que escribí en enero de 2015 para Envato Tuts +: Los beneficios de usar el Free Shortcoder Plugin. Es un complemento que le permite usar macros esencialmente para expandir el contenido HTML reutilizable en su lugar. Para cada artículo de la ciudad, lo usamos para personalizar lo que ven los visitantes locales cuando llegan desde Portland.
Una vez que se instaló el complemento, creé un shortcode para cada ciudad como [sc: pdx] que proporciona un simple anuncio en la parte superior de las páginas de artículos locales:
Luego, cada vez que agregamos un artículo local, incluimos el código corto [sc: pdx] en la cima:
Así es como se ve el artículo cuando llegan los visitantes:
Soy un usuario de Digital Ocean desde hace mucho tiempo, pero también me estoy convirtiendo en un fanático más entusiasta de WP Engine; El alojamiento bien gestionado proporciona ventajas en algunas circunstancias. Resultó que WP Engine ofrecía una solución al problema de la URL absoluta de WordPress que era mejor que las alternativas.
WP Engine ofrece un filtro de posprocesamiento en el que puede utilizar expresiones regulares para modificar el código. Después de considerar otros enfoques para modificar WordPress y usar sus propias API para esto, decidí que sería más sencillo simplemente reemplazar los enlaces absolutos a FleeTheJungle.com con direcciones relativas. Esto permitió a los usuarios que visitan un subdominio basado en la ciudad permanecer dentro del sitio geolocal:
Antes de configurar esto, las visitas al subdominio Flee the Jungle de Portland tenían enlaces salientes a fleethejungle.com global dispersos en las páginas. Después de configurarlo, los enlaces salientes permanecieron consistentes con el dominio o subdominio entrante.
Básicamente, utilicé el filtro de postprocesamiento para eliminar las URL absolutas y permitir que la URL del navegador y las direcciones relativas conduzcan a la navegación.
Para proporcionar un directorio de las ciudades donde Flee the Jungle está y estaría disponible, construí una página que enumera las ciudades donde los usuarios globales podrían saltar. También lo uso para atraer voluntarios para lanzar sitios para sus ciudades..
Aquí está el código final que usamos en WordPress para configure_geolocal ():
function configure_geolocal () global $ nonlocal_category_ids; global $ known_cities; global $ domain_locale; global $ logo_image_url; // ID de etiquetas para nombres de ciudades, por ejemplo, Seattle, Portland $ known_cities = array (49,211); // Las ID de categoría que son mundiales, se mostrarán digitalmente sin cambios // por ej. Primeros pasos, Alternativas principales y sonrientes, Medios de transmisión, etc. $ nonlocal_category_ids = [1,22,29,30,46,57,60,195]; $ domain_locale = arrestado_subdominio (); if ($ domain_locale == 'www' o $ domain_locale == 'fleethejungle') $ domain_locale = false; $ logo_image_url = '/wp-content/uploads/2015/10/ftj-logo-global.gif'; else if ($ domain_locale == 'pdx' o $ domain_locale == 'portland') $ domain_locale = 'portland'; $ logo_image_url = '/wp-content/uploads/2015/10/ftj-logo-portland.gif'; else if ($ domain_locale == 'sea' o $ domain_locale == 'seattle') $ domain_locale = 'seattle'; $ logo_image_url = '/wp-content/uploads/2015/10/ftj-logo-seattle.gif'; else // ciudad desconocida - redirige wp_redirect ('http://fleethejungle.com/cities'); salida;
Por supuesto, quería implementar la personalización básica del logotipo en función del subdominio. El tema KnowHow no soporta esto de forma nativa.
Si te fijas en la final. configure_geolocal ()
código, establezco una URL de biblioteca de medios para los logotipos de cada ciudad.
Luego, el código dentro de header.php personaliza la URL del logotipo del tema según el dominio aquí:
"href =""> ">
La asignación de dominios de WP Engine puede ser un poco confusa para los no iniciados. Debe agregar dominios para su sitio y asignarlos al sistema de direccionamiento interno de WP Engine. Si desea que los subdominios funcionen correctamente, debe configurar cada subdominio individualmente desde el panel de dominios de WP Engine.
Esto me tomó un poco de tiempo para averiguar. Aquí estoy agregando una página de llegada de marcador de posición para San Francisco, a la que se puede acceder mediante sanfrancisco.fleethejungle.com o sfbay.fleethejungle.com. WP Engine facilita la configuración de estos redireccionamientos:
Aquí hay una vista preliminar de los dominios configurados para Flee the Jungle global y local:
Desafortunadamente, las ciudades que no agrega explícitamente redirigen a un error 404 en WP Engine. Hay otras formas de solucionar esto, pero por el momento, solo estoy agregando ciudades más grandes a la configuración allí. Las personas generalmente serán dirigidas a la página de inicio global o una ciudad preexistente; desde allí, pueden ofrecerse como voluntarios para comenzar su propia ciudad..
La optimización interna del motor de búsqueda de Google es bien conocida por ser bastante secreta, pero gran parte del tráfico de referencias que recibe su sitio depende de ello..
Parte de nuestro contenido aparecerá en múltiples dominios, pero gran parte de él será distinto dependiendo de la ciudad que estemos navegando. A Google no le gusta ver el mismo contenido en varios sitios, pero también es bueno para indexar subdominios por separado.
Francamente, no tengo idea de cómo se recibirá y clasificará el modelo de red geolocal Flee the Jungle dentro de su gran megaplex de supercomputación. Esta es una prioridad más baja para mí en este momento. La base del tráfico de Huida de la jungla es el apoyo popular y el intercambio social..
Compare las diferencias de contenido entre Flee the Jungle en todo el mundo y el sitio de la ciudad local de Portland:
Ciertamente, hay varias formas en las que podría haber abordado el desafío de crear sitios geolocalizados. Sin embargo, Huir de la jungla sigue siendo un esfuerzo voluntario: necesitaba una solución que fuera simple y rápida a la vez que facilitara la adición de ciudades, aprovechando a los bloggers como voluntarios. El enfoque que he descrito ha logrado estos objetivos rápidamente.
El resultado de toda esta personalización es que tenemos una única instalación de WordPress que puede ejecutar cientos de variaciones geo-locales de nuestro sitio, con contenido local y mundial adecuadamente filtrado y organizado. Lo más importante es que los voluntarios pueden construir y lanzar ciudades solo con las habilidades básicas de un blogger de WordPress. Esto es mucho más simple y rápido que mi "amigo" de múltiples sitios de WordPress o ejecutando instalaciones separadas. El futuro es relativamente ilimitado..
Espero que haya disfrutado de este tutorial y que disfrute escuchando cómo pudo haber abordado este desafío. Si desea lanzar una guía de compras para su propia ciudad, contáctenos. Si está intrigado por crear un sitio como este, he escrito un tutorial detallado, paso a paso, para crear su propio sitio web de base de conocimientos en WordPress. Digamos que quieres lanzar tu propio sitio de fans de Harry Potter; es una guía fácil para comenzar..
Por favor, siéntase libre de publicar sus preguntas y comentarios a continuación. También puede contactarme en Twitter @reifman o enviarme un correo electrónico directamente. También puede navegar por la página de mi instructor Envato Tuts + para ver otros tutoriales que he escrito.