Generowanie osobnych meta tagów dla każdej strony

Tutaj chciałem przedstawić kilka możliwości generowania meta tagów (tytuł, słowa kluczowe i opis) za pomocą PHP dla stron Internetowych. Można to zrobić na wiele sposobów jednak im zrobimy to lepiej tym łatwiej i szybciej w późniejszym czasie się w tym połapiemy i będziemy mogli modyfikować. Jeśli tworzymy prostą stronę z dosłownie kilkoma pod stronami to często nie korzystamy w ogóle z PHP czy innej technologi tworzenia dynamicznych stron tylko każda część serwisu jest powtórzonym plikiem z całą strukturę (nagłówkiem, menu, unikalną zawartością, stopką itd.). Jest to rozwiązanie kiepskie jednak w takich przypadkach (kilku częściowe strony) może się sprawdzić. W pozostałych przypadkach każda część serwisu będzie osobnym plikiem ładowanym i wyświetlanym w określonym miejscu lub będzie on wykorzystany do operacji na danych, a jeszcze inny plik (widok) te dane wyświetli – możliwości napisania ogólnej architektury jest wiele. Przejdźmy więc do interesującego nas tematu.

Najprostsze rozwiązanie

Można by było po prostu do naszego pliku głównego, który ma tam jakiś swój mechanizm ładowania pod stron wkleić między interesujące nas tagi prosty kod, np. między tag TITLE :

if (isset($_GET[strona]))
{
  switch ($_GET[strona])
  {
    case "kontakt":
      echo "Formularz kontaktowy";
    break;
    case "grafiki":
      echo "Zbiór wykonanych grafik";
    break;
    default:
      echo "Taka strona nie istnieje";
    break;
  }
}
else
{
  echo "Strona główna bla bla bla";
}

Taki sam kod wkleilibyśmy również między tagi KEYWORDS i DESCRIPTION jednak zauważ dwie największe wady :

  • robi się straszny śmietnik w naszym pliku głównym
  • praktycznie ten sam kod jest powtarzany 3 krotnie co jest niezłym marnotrawstwem

Programowanie strukturalne – funkcje

Ok stwierdziliśmy, że pierwszy sposób jest nie do przyjęcia więc postanowiliśmy, że napiszmy osobne funkcje do generowania treści meta tagów, np. dla znacznika TITLE :

function generujTytul()
{
  if (isset($_GET[strona]))
  {
    switch ($_GET[strona])
    {
      case "kontakt":
        return "Formularz kontaktowy";
      break;
      case "grafiki":
        return "Zbiór wykonanych grafik";
      break;
      default:
        header("Location: index.php");
      break;
    }
  }
  else
  {
    return "Strona główna bla bla bla";
  }
}

Dla pozostałych znaczników tworzymy podobne funkcje, zapisujemy sobie wszystkie 3 w osobnym pliku, ładujemy instrukcją require_once i wyświetlamy w odpowiednim miejscu (zamiast return można dać instrukcje echo, ja akurat zrobiłem tak mając na uwadze chęć przypisania wartości zwracane do zmiennych). No ale generalnie co nam to dało ?

  • w pliku głównym nie ma już takiego „syfu”
  • niestety nadal praktycznie ten sam kod jest powtarzany 3 krotnie

W takim razie zmodyfikujemy trochę nasze podejście i zrobimy zamiast trzech funkcji jedną :

function generujMetaTagi()
{
  if (isset($_GET[strona]))
  {
    switch ($_GET[strona])
    {
      case "kontakt":
        $t[0] = "Tytuł strony";
        $t[1] = "Opis strony";
        $t[2] = "Słowa kluczowe";
      break;
      default:
        header("Location: index.php");
      break;
    }
  }
  else
  {
    $t[0] = "Tytuł strony głównej";
    $t[1] = "Opis strony głównej";
    $t[2] = "Słowa kluczowe strony głównej";
  }
  return $t;
}

Pozwoliło nam to na nie powtarzanie kodu, dalej możemy użyć naszej funkcji w następujący sposób :

$meta = generujMetaTagi(); // wywołanie
// i np. w tagu TITLE
echo $meta[0];

Otrzymane rozwiązanie jest całkiem dobre, nie mniej mając na względzie dalsze modyfikacje i zmiany w naszym systemie, stronie WWW warto przejść na

Programowanie obiektowe

Możemy więc napisać sobie osobną klasę związaną z meta tagami, przykładowo :

class MetaTagi
{
  public $tytul;
  public $opis;
  public $slowa_kluczowe;
  public function __construct()
  {
    if (isset($_GET[strona]))
    {
      switch ($_GET[strona])
      {
        case "kontakt":
          $this->tytul = "Formularz kontaktowy";
          $this->opis = "Tutaj możesz odnaleźć możliwości kontaktu ze mną";
          $this->slowa_kluczowe = "kontakt, e-mail, gadu-gadu, skype, imie nazwisko";
        break;
        case "grafiki":
          $this->tytul = "Zbiór wykonanych grafik";
          $this->opis = "Tutaj możesz obejrzeć moje prace graficzne";
          $this->slowa_kluczowe = "grafika, portfolio, wykonane prace, imie nazwisko";
        break;
        default:
          header("Location: index.php");
        break;
      }
    }
    else
    {
          $this->tytul = "Strona głowna bla bla bla";
          $this->opis = "Moja strona domowa.....";
          $this->slowa_kluczowe = "słowa kluczowe....";
    }    
  }
}

następnie gdzieś na początku naszego pliku głównego tworzymy sobie obiekt naszej klasy czyli :

$tagi = new MetaTagi();

oraz w danym znaczniku wyświetlam np. dla TITLE :

echo $tagi->tytul;

Jak widać w konstruktorze są ustalane podczas ładowania strony wszelkie potrzebne dane jednak można to zrobić w osobnej funkcji itd. Tak samo zmienne, które są publiczne możemy ustawić jako prywatne i do wyświetlania zawartości wybranego tagu używać dodatkowych metod. Opcji jest wiele – do wyboru, do koloru.

Inne rozwiązanie obiektowe

Pokazując kiedyś komuś podobne rozwiązanie jak powyższe zapytał co np. kiedy ma napisany pewien wzorzec, architekturę na podobieństwo np MVC ? Tutaj generalnie uważam, że warto przyglądnąć się rozwiązaniem jakie stosowane są w różnych framework’ach jednak jeśli bardzo chcemy się uprzeć na własny pomysł to bardzo prostym rozwiązaniem jest np. stworzenie takiej klasy ze zmiennymi statycznymi (to tylko przykładowa koncepcja, można korzystać ze zwykłych zmiennych wewnątrz niej) :

class Meta
{
	public static $title;
	public static $keywords;
	public static $description;
}

W naszej stworzonej architekturze mamy osobne pliki – modele związane z warstwą danych więc przykładowo możemy w każdym takim pliku umieścić kod odpowiadający za ustalenie dla danej strony zawartości znaczników :

Meta::$title = "Tytuł";
Meta::$keywords = "Słowa Kluczowe";
Meta::$description = "Opis";

a nasz plik związany z widokiem miałby np. w znaczniku TITLE kod :

echo Meta::$title

Jest to tylko pewna koncepcja, przykład – z powodzeniem moglibyśmy wykorzystać w takim przypadku wcześniej napisaną klasę tylko zawartości zmiennych ustalać nie w jej konstruktorze lecz w danym pliku modelu.

W przedstawionych przykładach dane są wpisane „ręcznie”, na „sztywno” jednak nic oczywiście nie stoi na przeszkodzie aby były one pobierane z bazy danych, pliku txt czy xml itd.

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

5 przemyśleń nt. „Generowanie osobnych meta tagów dla każdej strony

  1. super !

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  2. Dzięki za poświecenie czasu – kod dla mnie zbawienny jako ze nie znam się tak dobrze na PHP

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  3. Bartku,
    jak zawsze Twoje teksty są bardzo przydatne ! Szkoda, że dawno nic nie pisałeś – koniecznie to zmień, bo inaczej przestaniemy się potajemnie spotykać po nocy :)

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  4. przyda się , dzięki

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  5. Mając każdą stronę w oddzielnym pliku nie ma co jej tagów trzymać w funkcji (która zazwyczaj jest w pliku w innym folderze…). Warto mieć i treść strony i jej tagi w tym samym pliku.
    Można wrzucać meta tagi (i nie tylko) w STAŁE/zmienne -> includować taką stronę do strony głównej -> tagi wrzucamy tam gdzie trzeba a zawartość strony trzeba jakoś przetrzymać by nie wyświetliła się dopiero w „BODY” dlatego jej treść wystarczy wpakować do funkcji i w odpowiednim miejscu ją wywołać :)

    VA:F [1.9.22_1171]
    Rating: 5.0/5 (2 votes cast)
    VA:F [1.9.22_1171]
    Rating: +1 (from 1 vote)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *


7 − dwa =

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>