Adding the attribute reparto a domicilio to better SEO.
This commit is contained in:
parent
6526664dc4
commit
45a3f84987
@ -9,4 +9,21 @@
|
|||||||
<priority>0</priority>
|
<priority>0</priority>
|
||||||
<menu_text>Donde comer</menu_text>
|
<menu_text>Donde comer</menu_text>
|
||||||
<slug>donde-comer</slug>
|
<slug>donde-comer</slug>
|
||||||
|
<attributes>
|
||||||
|
<attribute>
|
||||||
|
<title>Pedir comida a domicilio en Burguillos.</title>
|
||||||
|
<identifier>reparto-a-domicilio-comida</identifier>
|
||||||
|
<priority>0</priority>
|
||||||
|
<menu_text>Listado de sitios de comida con reparto a domicilio.</menu_text>
|
||||||
|
<description>
|
||||||
|
<h2>Cartas y Menús de Pizzerías, Hamburgueserías, Kebab, Restaurantes, Bares, etc.</h2>
|
||||||
|
|
||||||
|
<p>Te filtramos todos los sitios según si puedes pedir a domicilio en Burguillos, todos
|
||||||
|
los negocios listados incluyen carta, menú y teléfono de contacto. (O el medio
|
||||||
|
de contacto pertinente para el negocio en caso de no ser el teléfono.)</p>
|
||||||
|
|
||||||
|
<p>¿Conoces algún negocio que debería estar listado aquí? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a> y lo añadiremos a este registro.</p>
|
||||||
|
</description>
|
||||||
|
</attribute>
|
||||||
|
</attributes>
|
||||||
</category>
|
</category>
|
||||||
|
@ -7,6 +7,9 @@
|
|||||||
<category>donde-comer</category>
|
<category>donde-comer</category>
|
||||||
<img src="/img/bocaton-preview.png"/>
|
<img src="/img/bocaton-preview.png"/>
|
||||||
<slug>el-bocaton</slug>
|
<slug>el-bocaton</slug>
|
||||||
|
<attributes>
|
||||||
|
<attribute>reparto-a-domicilio-comida</attribute>
|
||||||
|
</attributes>
|
||||||
<content>
|
<content>
|
||||||
<h2>Café - Bar - Pastelería - Pizzeria - Hamburguesería</h2>
|
<h2>Café - Bar - Pastelería - Pizzeria - Hamburguesería</h2>
|
||||||
<img alt="Exterior del Bar Bocatón." src="/img/bocaton-4.jpg"/>
|
<img alt="Exterior del Bar Bocatón." src="/img/bocaton-4.jpg"/>
|
||||||
|
@ -6,6 +6,9 @@
|
|||||||
<last_modification_date>2023-05-03T02:34+02:00</last_modification_date>
|
<last_modification_date>2023-05-03T02:34+02:00</last_modification_date>
|
||||||
<category>donde-comer</category>
|
<category>donde-comer</category>
|
||||||
<slug>bar-cristobal</slug>
|
<slug>bar-cristobal</slug>
|
||||||
|
<attributes>
|
||||||
|
<attribute>reparto-a-domicilio-comida</attribute>
|
||||||
|
</attributes>
|
||||||
<img src="/img/cristobal-preview.png"/>
|
<img src="/img/cristobal-preview.png"/>
|
||||||
<content>
|
<content>
|
||||||
<img alt="Entrada al Mesón - Bar Cristobal." src="/img/cristobal.jpg"/>
|
<img alt="Entrada al Mesón - Bar Cristobal." src="/img/cristobal.jpg"/>
|
||||||
|
@ -7,8 +7,11 @@
|
|||||||
<img src="/img/pizzeria-los-naranjos-preview.png"/>
|
<img src="/img/pizzeria-los-naranjos-preview.png"/>
|
||||||
<category>donde-comer</category>
|
<category>donde-comer</category>
|
||||||
<slug>pizzeria-los-naranjos</slug>
|
<slug>pizzeria-los-naranjos</slug>
|
||||||
|
<attributes>
|
||||||
|
<attribute>reparto-a-domicilio-comida</attribute>
|
||||||
|
</attributes>
|
||||||
<content>
|
<content>
|
||||||
<h2>Pizzería, Hamburguesería, Kebab, Cartes, Pescado, Aliños.</h2>
|
<h2>Pizzería, Hamburguesería, Kebab, Pescado, Aliños.</h2>
|
||||||
<img style="border: 1px black solid;" src="/img/pizzeria-los-naranjos.jpg" alt="The front door of the pizzeria"/>
|
<img style="border: 1px black solid;" src="/img/pizzeria-los-naranjos.jpg" alt="The front door of the pizzeria"/>
|
||||||
<p>Hoy añadimos a este directorio un clásico en las cenas de los fines
|
<p>Hoy añadimos a este directorio un clásico en las cenas de los fines
|
||||||
de semana de los habitantes de Burguillos, la Pizzería los Naranjos.</p>
|
de semana de los habitantes de Burguillos, la Pizzería los Naranjos.</p>
|
||||||
|
@ -20,8 +20,8 @@ sub startup ($self) {
|
|||||||
my $config = $self->plugin('JSONConfig');
|
my $config = $self->plugin('JSONConfig');
|
||||||
$self->config(
|
$self->config(
|
||||||
hypnotoad => { proxy => 1, listen => ['http://localhost:3000'] } );
|
hypnotoad => { proxy => 1, listen => ['http://localhost:3000'] } );
|
||||||
$self->config(css_version => int(rand(10000)));
|
$self->config( css_version => int( rand(10000) ) );
|
||||||
$self->secrets($self->config->{secrets});
|
$self->secrets( $self->config->{secrets} );
|
||||||
|
|
||||||
# Router
|
# Router
|
||||||
my $r = $self->routes;
|
my $r = $self->routes;
|
||||||
@ -34,9 +34,12 @@ sub startup ($self) {
|
|||||||
# $r->get('/:post')->to('Page#post');
|
# $r->get('/:post')->to('Page#post');
|
||||||
$r->get('/stats')->to('Metrics#stats');
|
$r->get('/stats')->to('Metrics#stats');
|
||||||
$r->get('/<:category>.rss')->to('Page#category_rss');
|
$r->get('/<:category>.rss')->to('Page#category_rss');
|
||||||
|
$r->get('/:category_slug/atributo/:attribute_slug')->to('Attribute#get');
|
||||||
$r->get('/:category')->to('Page#category');
|
$r->get('/:category')->to('Page#category');
|
||||||
$r->get('/posts/<:slug>-preview.png')->to('Page#get_post_preview');
|
$r->get('/posts/<:slug>-preview.png')->to('Page#get_post_preview');
|
||||||
$r->get('/posts/:slug')->to('Page#post');
|
$r->get('/posts/:slug')->to('Page#post');
|
||||||
|
$r->get('/filtros')->to('Filter#list');
|
||||||
|
$r->get('/filtros/:slug')->to('Filter#get');
|
||||||
$r->get('/stats/login')->to('Metrics#login');
|
$r->get('/stats/login')->to('Metrics#login');
|
||||||
$r->post('/stats/login')->to('Metrics#submit_login');
|
$r->post('/stats/login')->to('Metrics#submit_login');
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,7 @@ sub Retrieve($self) {
|
|||||||
or die "Missing menu_text at $category_file";
|
or die "Missing menu_text at $category_file";
|
||||||
defined (my $priority = $dom->at(':root > priority')->text)
|
defined (my $priority = $dom->at(':root > priority')->text)
|
||||||
or die "Missing priority at $category_file";
|
or die "Missing priority at $category_file";
|
||||||
|
my $attributes = $self->_GetAttributes($dom, $category_file);
|
||||||
my $parent_tag = $dom->at(':root > parent');
|
my $parent_tag = $dom->at(':root > parent');
|
||||||
my $parent;
|
my $parent;
|
||||||
if (defined $parent_tag) {
|
if (defined $parent_tag) {
|
||||||
@ -56,6 +57,7 @@ sub Retrieve($self) {
|
|||||||
(parent => $parent) :
|
(parent => $parent) :
|
||||||
()
|
()
|
||||||
),
|
),
|
||||||
|
attributes => $attributes,
|
||||||
};
|
};
|
||||||
$cached_categories->{$slug} = $category;
|
$cached_categories->{$slug} = $category;
|
||||||
}
|
}
|
||||||
@ -64,6 +66,34 @@ sub Retrieve($self) {
|
|||||||
return $cached_categories;
|
return $cached_categories;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub _GetAttributes($self, $dom, $category_file) {
|
||||||
|
my $attributes_tag = $dom->at(':root > attributes');
|
||||||
|
my %attributes;
|
||||||
|
if (defined $attributes_tag) {
|
||||||
|
my @attribute_tag_list = $attributes_tag->find('attributes > attribute')->each;
|
||||||
|
for my $attribute_tag (@attribute_tag_list) {
|
||||||
|
defined (my $menu_text = $attribute_tag->at('attribute > menu_text')->content)
|
||||||
|
or die "Missing attribute menu_text at $category_file";
|
||||||
|
defined (my $description = $attribute_tag->at('attribute > description')->content)
|
||||||
|
or die "Missing attribute description at $category_file";
|
||||||
|
defined (my $title = $attribute_tag->at('attribute > title')->text)
|
||||||
|
or die "Missing attribute title at $category_file";
|
||||||
|
defined (my $identifier = $attribute_tag->at('attribute > identifier')->text)
|
||||||
|
or die "Missing attribute identifier at $category_file";
|
||||||
|
defined (my $priority = $attribute_tag->at('attribute > priority')->text)
|
||||||
|
or die "Missing attribute priority at $category_file";
|
||||||
|
$attributes{$identifier} = {
|
||||||
|
title => $title,
|
||||||
|
identifier => $identifier,
|
||||||
|
priority => $priority,
|
||||||
|
menu_text => $menu_text,
|
||||||
|
description => $description,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return \%attributes;
|
||||||
|
}
|
||||||
|
|
||||||
sub _PopulateChildrenField($self, $categories) {
|
sub _PopulateChildrenField($self, $categories) {
|
||||||
for my $category_name (keys %$categories) {
|
for my $category_name (keys %$categories) {
|
||||||
my $category = $categories->{$category_name};
|
my $category = $categories->{$category_name};
|
||||||
|
37
lib/BurguillosInfo/Controller/Attribute.pm
Normal file
37
lib/BurguillosInfo/Controller/Attribute.pm
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package BurguillosInfo::Controller::Attribute;
|
||||||
|
use v5.34.1;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
use BurguillosInfo::Categories;
|
||||||
|
|
||||||
|
use Mojo::Base 'Mojolicious::Controller', -signatures;
|
||||||
|
|
||||||
|
sub get ($self) {
|
||||||
|
my $category_slug = $self->param('category_slug');
|
||||||
|
my $attribute_slug = $self->param('attribute_slug');
|
||||||
|
|
||||||
|
my $categories = BurguillosInfo::Categories->new->Retrieve;
|
||||||
|
my $category = $categories->{$category_slug};
|
||||||
|
if ( !defined $category ) {
|
||||||
|
return $self->reply->not_found;
|
||||||
|
}
|
||||||
|
my $attribute = $category->{attributes}{$attribute_slug};
|
||||||
|
if ( !defined $attribute ) {
|
||||||
|
return $self->reply->not_found;
|
||||||
|
}
|
||||||
|
my $posts = BurguillosInfo::Posts->RetrieveDirectPostsForCategory(
|
||||||
|
$category->{slug} );
|
||||||
|
$posts = [ grep { defined $_->{attributes}{$attribute_slug} } @$posts ];
|
||||||
|
$self->render(
|
||||||
|
template => 'page/attribute',
|
||||||
|
category => $category,
|
||||||
|
attribute => $attribute,
|
||||||
|
categories => $categories,
|
||||||
|
posts => $posts,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
1;
|
@ -57,6 +57,7 @@ sub _append_category_dom ( $self, $dom, $category_key, $categories ) {
|
|||||||
Mojo::DOM->new_tag( lastmod => $final_date_last_modification_category );
|
Mojo::DOM->new_tag( lastmod => $final_date_last_modification_category );
|
||||||
$url->child_nodes->first->append_content($last_modification_tag);
|
$url->child_nodes->first->append_content($last_modification_tag);
|
||||||
}
|
}
|
||||||
|
$self->_append_attributes_category_sitemap($dom, $category_key, $categories);
|
||||||
my $priority_tag = Mojo::DOM->new_tag( priority => 0.6 );
|
my $priority_tag = Mojo::DOM->new_tag( priority => 0.6 );
|
||||||
$url->child_nodes->first->append_content($location_tag);
|
$url->child_nodes->first->append_content($location_tag);
|
||||||
$url->child_nodes->first->append_content($priority_tag);
|
$url->child_nodes->first->append_content($priority_tag);
|
||||||
@ -64,6 +65,17 @@ sub _append_category_dom ( $self, $dom, $category_key, $categories ) {
|
|||||||
$dom->child_nodes->first->append_content($url);
|
$dom->child_nodes->first->append_content($url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub _append_attributes_category_sitemap($self, $dom, $category_key, $categories) {
|
||||||
|
my $base_url = $self->config('base_url');
|
||||||
|
my $category = $categories->{$category_key};
|
||||||
|
for my $attribute (keys $category->{attributes}->%*) {
|
||||||
|
my $url = Mojo::DOM->new_tag('url');
|
||||||
|
my $location_tag = Mojo::DOM->new_tag( loc => "$base_url/$category_key/atributo/$attribute" );
|
||||||
|
$url->child_nodes->first->append_content($location_tag);
|
||||||
|
$dom->child_nodes->first->append_content($url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sub _generate_url_for_post ( $self, $post ) {
|
sub _generate_url_for_post ( $self, $post ) {
|
||||||
my $url_tag = Mojo::DOM->new_tag('url');
|
my $url_tag = Mojo::DOM->new_tag('url');
|
||||||
my $date = $post->{date};
|
my $date = $post->{date};
|
||||||
|
@ -83,6 +83,7 @@ sub _GeneratePostFromFile ( $self, $post_file ) {
|
|||||||
or die "Missing content at $post_file.";
|
or die "Missing content at $post_file.";
|
||||||
my $image_element = $dom->at(':root > img');
|
my $image_element = $dom->at(':root > img');
|
||||||
my $image;
|
my $image;
|
||||||
|
my $attributes = $self->_GetAttributes($post_file, $dom);
|
||||||
|
|
||||||
if ( defined $image_element ) {
|
if ( defined $image_element ) {
|
||||||
$image = $image_element->attr->{src};
|
$image = $image_element->attr->{src};
|
||||||
@ -109,9 +110,24 @@ sub _GeneratePostFromFile ( $self, $post_file ) {
|
|||||||
: ()
|
: ()
|
||||||
),
|
),
|
||||||
( ( defined $image ) ? ( image => $image ) : () ),
|
( ( defined $image ) ? ( image => $image ) : () ),
|
||||||
|
attributes => $attributes,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub _GetAttributes($self, $post_file, $dom) {
|
||||||
|
my $attributes_tag = $dom->at(':root > attributes');
|
||||||
|
my %attributes;
|
||||||
|
if (defined $attributes_tag) {
|
||||||
|
my @attribute_list = $attributes_tag->find('attributes > attribute')->map('text')->each;
|
||||||
|
%attributes = map {
|
||||||
|
my $identifier = $_;
|
||||||
|
($identifier => 1);
|
||||||
|
} @attribute_list;
|
||||||
|
}
|
||||||
|
return \%attributes;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
sub _GeneratePostCache ($self) {
|
sub _GeneratePostCache ($self) {
|
||||||
$cached_posts_by_category = {};
|
$cached_posts_by_category = {};
|
||||||
$cached_posts_by_slug = {};
|
$cached_posts_by_slug = {};
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
<%= content %></body>
|
<%= content %></body>
|
||||||
<hr/>
|
<hr/>
|
||||||
<div class="footer description">
|
<div class="footer description">
|
||||||
<p>©2022 Sergio Iglesias</p>
|
<p>©2022-2023 Sergio Iglesias</p>
|
||||||
<p>Enterate de todas las novedades de Burguillos.info:</p>
|
<p>Enterate de todas las novedades de Burguillos.info:</p>
|
||||||
<a class="suscribe-category-rss" href="/all.rss">
|
<a class="suscribe-category-rss" href="/all.rss">
|
||||||
<img src="/img/rss.svg" alt="Icono de suscripción rss"/>
|
<img src="/img/rss.svg" alt="Icono de suscripción rss"/>
|
||||||
|
@ -12,38 +12,19 @@
|
|||||||
<h1><%= $current_category->{title} %></h1>
|
<h1><%= $current_category->{title} %></h1>
|
||||||
<%== $current_category->{description} %>
|
<%== $current_category->{description} %>
|
||||||
% my $children_categories = $current_category->{children};
|
% my $children_categories = $current_category->{children};
|
||||||
% if (@$children_categories) {
|
% my $attributes = $current_category->{attributes};
|
||||||
|
% if (@$children_categories || %$attributes) {
|
||||||
<h2>Quizás te interese.</h2>
|
<h2>Quizás te interese.</h2>
|
||||||
% for my $child_category (@$children_categories) {
|
% for my $child_category (@$children_categories) {
|
||||||
<p><a href="/<%=$child_category->{slug}%>"><%==$child_category->{title}%></a></p>
|
<p><a href="/<%=$child_category->{slug}%>"><%==$child_category->{title}%></a></p>
|
||||||
% }
|
% }
|
||||||
|
% for my $attribute_slug (keys %$attributes) {
|
||||||
|
% my $attribute = $attributes->{$attribute_slug};
|
||||||
|
<p><a href="<%="/$current_category->{slug}/atributo/$attribute->{identifier}"%>"><%==$attribute->{menu_text}%></a></p>
|
||||||
|
% }
|
||||||
% }
|
% }
|
||||||
<h2>Artículos</h2>
|
|
||||||
<div class="articles">
|
|
||||||
% my ($category_posts) = BurguillosInfo::Posts->new->RetrieveAllPostsForCategory($current_category->{slug});
|
% my ($category_posts) = BurguillosInfo::Posts->new->RetrieveAllPostsForCategory($current_category->{slug});
|
||||||
% unless (@$category_posts) {
|
%= include 'page/_list_posts', posts => $category_posts;
|
||||||
<p>Parece que aun no hay artículos.</p>
|
|
||||||
% }
|
|
||||||
% for my $post (@$category_posts) {
|
|
||||||
<a href="/posts/<%=$post->{slug}%>">
|
|
||||||
<article><%
|
|
||||||
my $date_article = DateTime::Format::ISO8601->parse_datetime($post->{date});
|
|
||||||
$date_article->set_time_zone('Europe/Madrid');
|
|
||||||
%><p class="date"><%= ''.$date_article %></p><%
|
|
||||||
if (defined $post->{image}) {
|
|
||||||
%><img alt="Portada de <%=$post->{title}%>" src="<%=$post->{image}%>"/><%
|
|
||||||
}
|
|
||||||
%><h4><%=$post->{title}%></h4><%
|
|
||||||
my $xml = Mojo::DOM->new($post->{content});
|
|
||||||
my $text = $xml->all_text;
|
|
||||||
if (length($text) > 120) {
|
|
||||||
$text = substr($text, 0, 100).'...';
|
|
||||||
}
|
|
||||||
%><p><%=$text%></p><p class="author">Escrito por <%=$post->{author}%></p></article>
|
|
||||||
</a>
|
|
||||||
% }
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<h2>Suscribete a esta categoría.</h2>
|
<h2>Suscribete a esta categoría.</h2>
|
||||||
|
|
||||||
<a class="suscribe-category-rss" href="/<%=$current_category->{slug}%>.rss">
|
<a class="suscribe-category-rss" href="/<%=$current_category->{slug}%>.rss">
|
||||||
|
Loading…
Reference in New Issue
Block a user