php laravel opengraph blade

php - plantilla de hoja, @yield() en @yield



laravel opengraph (2)

Esta es mi implementación actual de las etiquetas Open Graph usando Laravel 5:

app.blade.php

<title>@yield(''title'')</title> <meta property="og:title" content="@yield(''og-title'', ''DEFAULT PAGE TITLE'')"> <meta property="og:image" content="@yield(''og-image'', ''default.png'')"> <meta property="og:url" content="@yield(''og-url'', ''{{ Request::url() }}'')"> <meta property="og:site_name" content="SITE NAME">

page.blade.php

@extends(''app'') @section(''title'', $article->title . '' | SITE NAME'') @section(''og-title'', $article->title) @section(''og-image'', secure_url(''img/news/'' . $article->image .''.png''))

Funciona en su mayor parte, pero tengo un par de preguntas:

  1. ¿Hay alguna forma de usar @yield() en @yield ?

    Intenté <meta property="og:title" content="@yield(''og-title'', @yield(''title''))"> pero no funcionó.

  2. ¿Cómo puedo obtener la url segura actual de la página?

    {{ Request::url() }} devuelve http://example.com/page , pero quiero https://example.com/page

Como meta, por favor avíseme si tiene alguna sugerencia para mejorar mi método actual de OG.


Hay una manera fácil de lograr lo que quieres. Lo que puede hacer es mover las metaetiquetas html de OG a vista parcial, a la que puede pasar parámetros en cada página como lo desee. Por ejemplo, en su diseño maestro solo cree una sección para las etiquetas og:

app.blade.php

<title>@yield(''title'')</title> @section(''ogtags'') @show

Ahora crea tu vista parcial llamémosla:

og_tags.blade.php

<meta property="og:title" content="{{ $title or ''DEFAULT PAGE TITLE'' }}"> <meta property="og:image" content="{{ $image or ''default.png'' }}"> <meta property="og:url" content="{{ isset($url) ? $url : str_replace(''http://'', ''https://'', Request::url()) }}">

Así que ahora en tus vistas puedes agregar fácilmente og-tags como este:

home.blade.php

@extends(''app'') @section(''ogtags'') @include(''og_tags'', [''title'' => ''my title'', ''image'' => ''my-image.png'']) @stop @section(''content'') your content here @stop

Para la pregunta de url segura, Request::url() devuelve la url actual de la página, si es a través de HTTPS comenzará con https:// contrario, comenzará con http:// . Así que esta es la razón por la que simplemente lo reemplazo para que siempre sea https

str_replace(''http://'', ''https://'', Request::url())

Si desea tener siempre og_tags (en caso de que su vista no defina esta sección y desea mostrar las predeterminadas), puede modificar su app.blade.php de la siguiente manera:

<title>@yield(''title'')</title> @section(''ogtags'') @include(''og_tags'') @show

Esta es la parte genial de Blade que puede dividir todo en partes más pequeñas, luego incluirlas con parámetros dinámicos o simplemente crear compositores de vistas para manejar los datos.


Siempre utilizo un meta.blade.php y mantengo mi meta separado del diseño principal y no solo meta sino también, styles y scripts cuando es posible e @include(...) luego usando @include(...) , de todos modos, pero cómo hacerlo dinámico ? En este caso, utilizo un enfoque similar al tuyo pero un poco diferente, lo que me permite una flexibilidad total para hacerlo realmente dinámico. Así es como lo hago, probablemente responda lo que está buscando aquí. Entonces, creemos un archivo ''meta.blade.php'' y el mío se da a continuación:

<!-- Title--> <title>@yield(''title'', smart(''site.title''))</title> <!-- Meta--> <meta name="keywords" content="@yield(''keywords'', getSiteMeta(''keywords''))" /> <meta name="description" content="@yield(''description'', getSiteMeta(''description''))" /> <meta name="author" content="@yield(''author'', getSiteMeta(''author''))" /> <!-- CSRF for AJAX--> <meta name="csrf-token" content="{{ csrf_token() }}" />

Observe @yield(''keywords'', getSiteMeta(''keywords'')) aquí; el getSiteMeta es una función auxiliar que se declara en mi archivo app/Helpers/Common.php y la función se ve así:

/** * Prapare meta Tags by $name * * @param String $metaname Meta Name * @return Meta Content */ function getSiteMeta($name) { return smart("site.meta.$name"); }

También otra función está involucrada aquí, que es:

/** * Short cut to config call for smart.php file items * @param String $str Config Key * @return String Config Value */ function smart($str) { return config("smart.$str"); }

En realidad, tengo un archivo de configuración propio en config/smart.php y smart es el nombre de mi sitio, así que he conservado todas las configuraciones relacionadas con mi sitio en config/smart.php que se ve así:

// config/smart.php return [ ''site'' => [ ''name'' => ''Smart'', ''title'' => ''Smart Title'', ''tagline'' => ''Smart Tag Line'', ''meta'' => [ ''keywords'' => ''Smart Keywords'', ''language'' => ''english'', ''description'' => ''...'', ''author'' => ''Sheikh Heera'' ], ], ''role'' => [ ''default'' => ''genaral'', # By default, a user gets this role when registers. ''reserved'' => ''superuser'' # Application''s Admin must have this role assigned. ], // More... ];

Probablemente tenga la idea, puedo llamar a smart(''key_name'') para obtener las configuraciones de mi sitio, así que no necesito usar config(''smart.key'') y de manera predeterminada todos los meta values ​​están almacenados en mi config/smart.php archivo config/smart.php así que si no uso una sección como esta:

@section(''keywords'') Some, Keywords, Here @stop

Entonces siempre tengo mi configuración predeterminada y usando una función auxiliar getSiteMeta Tengo suficiente flexibilidad para cambiar la lógica de mi función, por ejemplo, puedo cambiar la fuente predeterminada de mis etiquetas meta y puedo construirla sobre la marcha.

En cuanto a https , depende de su sitio, si ha utilizado url seguro ( ssl/https ) y Request::url() simplemente devuelve cuál es su url actual, por lo que si es https , devolverá que de lo contrario obtendrá http .