Parcourir la source

Prospective fix for #157

George S. Baugh il y a 5 ans
Parent
commit
9b41e44ecc
3 fichiers modifiés avec 93 ajouts et 22 suppressions
  1. 32 16
      lib/Trog/Routes/HTML.pm
  2. 8 5
      www/server.psgi
  3. 53 1
      www/templates/header.tx

+ 32 - 16
lib/Trog/Routes/HTML.pm

@@ -248,25 +248,38 @@ sub index ($query,$render_cb, $content = '', $i_styles = []) {
 
     my $search_info = Trog::Data->new($conf);
 
+    #Header SEO stuff
+    my $default_tags = $Theme::tags;
+    $default_tags .= ','.$query->{primary_post}->{tags} if $default_tags && $query->{primary_post}->{tags};
+
+    #TODO truncate this and filter out to innerHTML
+    my $meta_desc  = $query->{primary_post}->{data} // $Theme::description // "tCMS Site";
+
     my $tmpl = $query->{embed} ? 'embed.tx' : 'index.tx';
     return $render_cb->( $tmpl, {
-        code        => $query->{code},
-        user        => $query->{user},
-        search_lang => $search_info->lang(),
-        search_help => $search_info->help(),
-        route       => $query->{route},
-        theme_dir   => $td,
-        content     => $content,
-        title       => $query->{title} // $Theme::default_title // 'tCMS',
-        htmltitle   => _pick_processor("templates/$htmltitle" ,$processor,$t_processor)->render($htmltitle,$query),
-        midtitle    => _pick_processor("templates/$midtitle"  ,$processor,$t_processor)->render($midtitle,$query),
-        rightbar    => _pick_processor("templates/$rightbar"  ,$processor,$t_processor)->render($rightbar,$query),
-        leftbar     => _pick_processor("templates/$leftbar"   ,$processor,$t_processor)->render($leftbar,$query),
-        footbar     => _pick_processor("templates/$footbar"   ,$processor,$t_processor)->render($footbar,$query),
+        code           => $query->{code},
+        user           => $query->{user},
+        search_lang    => $search_info->lang(),
+        search_help    => $search_info->help(),
+        route          => $query->{route},
+        theme_dir      => $td,
+        content        => $content,
+        title          => $query->{title} // $Theme::default_title // 'tCMS',
+        htmltitle      => _pick_processor("templates/$htmltitle" ,$processor,$t_processor)->render($htmltitle,$query),
+        midtitle       => _pick_processor("templates/$midtitle"  ,$processor,$t_processor)->render($midtitle,$query),
+        rightbar       => _pick_processor("templates/$rightbar"  ,$processor,$t_processor)->render($rightbar,$query),
+        leftbar        => _pick_processor("templates/$leftbar"   ,$processor,$t_processor)->render($leftbar,$query),
+        footbar        => _pick_processor("templates/$footbar"   ,$processor,$t_processor)->render($footbar,$query),
         category_links => _pick_processor("templates/categories.tx", $processor,$t_processor)->render("categories.tx",$query),
-        stylesheets => \@styles,
-        show_madeby => $Theme::show_madeby ? 1 : 0,
-        embed       => $query->{embed} ? 1 : 0,
+        stylesheets    => \@styles,
+        show_madeby    => $Theme::show_madeby ? 1 : 0,
+        embed          => $query->{embed} ? 1 : 0,
+        og_type        => $query->{og_type},
+        twitter_type   => $query->{twitter_type},
+        primary_post   => $query->{primary_post},
+        default_tags   => $default_tags,
+        meta_desc      => $meta_desc,
+        fb_app_id      => $conf->param('general.fb_app_id'),
     });
 }
 
@@ -641,6 +654,7 @@ sub series ($query, $render_cb) {
     $query->{subhead} = $posts[0]->{data};
     $query->{title} = $posts[0]->{title};
     $query->{tag} = $posts[0]->{aclname};
+    $query->{primary_post} = $posts[0];
     return posts($query,$render_cb);
 }
 
@@ -680,6 +694,7 @@ sub users ($query, $render_cb) {
     $query->{id} = $user[0]->{id};
     $query->{title} = $user[0]->{title};
     $query->{user_obj} = $user[0];
+    $query->{primary_post} = $posts[0];
     return posts($query,$render_cb);
 }
 
@@ -710,6 +725,7 @@ sub posts ($query, $render_cb) {
         $query->{author} = $user->{user};
         @posts = _post_helper($query, [], $query->{acls});
         @posts = grep { $_->{id} ne $id } @posts;
+        $query->{primary_post} = $posts[0];
         unshift @posts, $user;
     }
 

+ 8 - 5
www/server.psgi

@@ -132,11 +132,14 @@ my $app = sub {
     #Set various things we don't want overridden
     $query->{acls} = Trog::Auth::acls4user($active_user) // [] if $active_user;
 
-    $query->{user}    = $active_user;
-    $query->{domain}  = $env->{HTTP_HOST};
-    $query->{route}   = $env->{REQUEST_URI};
-    $query->{route}   =~ s/\?\Q$env->{QUERY_STRING}\E//;
-    $query->{scheme}  = $env->{'psgi.url_scheme'} // 'http';
+    $query->{user}         = $active_user;
+    $query->{domain}       = $env->{HTTP_HOST};
+    $query->{route}        = $env->{REQUEST_URI};
+    $query->{route}        =~ s/\?\Q$env->{QUERY_STRING}\E//;
+    $query->{scheme}       = $env->{'psgi.url_scheme'} // 'http';
+    $query->{og_type}      = 'website';
+    $query->{twitter_type} = 'summary';
+    $query->{primary_post} = {};
 
     my $output =  $routes{$path}{callback}->($query, \&_render);
     return $output;

+ 53 - 1
www/templates/header.tx

@@ -4,7 +4,59 @@
         <title><: $title :></title>
         <meta charset="utf-8" />
         <link rel="icon" type="image/vnd.microsoft.icon" href="<: $theme_dir :>/img/icon/favicon.ico" />
-        <meta name="description" content="A Simple CMS by teodesian.net"/>
+        <meta name="description" content="<: $meta_desc :>"/>
+        <meta name="tags" content="<: $default_tags :>" />
+
+        <!-- Open Graph / Facebook -->
+        <meta property="og:type" content="<: $og_type :>" />
+        <meta property="og:url" content="https://<: $domain :>/<: $route :>" />
+        <meta property="og:title" content="<: $title :>" />
+        : if ($primary_post.tags) {
+        <meta property="og:article:tags" content="<: $primary_post.tags :>" />
+        : }
+        : if ($primary_post.is_image) {
+        <meta property="og:image" content="https://<: $domain :>/<: $primary_post.href :>" />
+        <meta property="og:image:type" content="<: $primary_post.type :>" />
+        <meta property="og:image:width" content="1280" />
+        <meta property="og:image:height" content=720 />
+        : }
+        : elsif ($primary_post.is_video) {
+        <meta property="og:video" content="https://<: $domain :>/<: $primary_post.href :>" />
+        <meta property="og:video:type"  content="<: $primary_post.type :>" />
+        <meta property="og:video:width" content="1280" />
+        <meta property="og:video:height" content="720" />
+        <meta property="og:video:image"  content="https://<: $domain :>/<: $primary_post.preview :>" />
+        : }
+        : if ($primary_post.user) {
+        <meta property="og:article:author" content="<: $primary_post.user :>" />
+        : }
+        : if ($primary_post.created) {
+        <meta property="og:article:published_time" content="<: $primary_post.created :>" />
+        <meta property="og:article:modified_time" content="<: $primary_post.created :>" />
+        : }
+        : if ($fb_app_id) {
+        <meta property="fb:app_id" content="<: $fb_app_id :>" />
+        : }
+
+        <!-- Twitter -->
+        <meta property="twitter:card" content="<: $twitter_type :>" />
+        <meta property="twitter:url" content="https://<: $domain :>/<: $route :>" />
+        : if ($primary_post.is_image) {
+        <meta property="twitter:image" content="https://<: $domain :>/<: $primary_post.href :>" />
+        <meta property="twitter:image:type" content="<: $primary_post.type :>" />
+        <meta property="twitter:image:width" content="1280" />
+        <meta property="twitter:image:height" content=720 />
+        : }
+        : elsif ($primary_post.is_video) {
+        <meta property="twitter:player:stream" content="https://<: $domain :>/<: $primary_post.href :>" />
+        <meta property="twitter:player:stream:content_type"  content="<: $primary_post.type :>" />
+        <meta property="twitter:player:width" content="1280" />
+        <meta property="twitter:player:height" content="720" />
+        <meta property="twitter:player" content="https://<: $domain :>/<: $route :>?embed=1" />
+        : }
+        <meta property="twitter:title" content="<: $title :>" />
+        <meta property="twitter:description" content="<: $meta_desc :>" />
+
         <meta name="viewport" content="width=device-width">
         <link rel="stylesheet" type="text/css" href="/styles/structure.css" />
         <link rel="stylesheet" type="text/css" href="/styles/screen.css" media="screen" />