29 09 10 Komentarze dla wpisu na oddzielnej stronie w Wordpresie
Większość blogów wyświetla niemal wszystkie informacji na temat pojedyńczego wpisu w na jednej stronie. Ponieważ czasem zdarza się, że komentarze zajmują dużo więcej miejsca niż sam wpis, z bazy danych ściągane jest mnóstwo danych, które nie każdy użytkownik chce przeglądać. Aby temu zapobic, komentarze dla wpisu można umieścić na oddzielnej stronie. W tym wpisie przedstawię jak tego dokonać.
W tym wpisie zakładam,że nie każda osoba, która jest zainteresowana treścią wpisu, musi być zainteresowana również komentarzami. Mniejsz ilość odsyłanych danych w odpowiedzi na zapytanie oznacza również oszczędności na transferze. Obniżone zostaje zużycie pamięci i cykli procesora serwera. Na poprularnym blogu osczędności mogą być znaczne.
W teori oddzielenie komentarzy wpisu od jego zawartości wiąże się z utworzeniem nowej strony, wyświetleniem ich na niej oraz małej ingerencji w kod pliku single.php.
Aby utworzyć nową stronę w Wordpresie, należy zalogować się do panelu administracyjnego, wybrać zakładkę "Strony" i po wypełnieniu tytułu formularza, zapisać ją zapamiętując numer id.
Szablon strony komentarzy
Kolejnym krokiem jest stworznenie pliku gdzie zawartość strony będzie wyświetlana. W moim przypadku id strony ma wartość 77. W katalogu wp-content/themes/moj_aktywny_motyw/ dodałem więc plik o nazwie page-77.php.
Mając szablon, możemy wrzucić do niego kod, który umożliwia niezależne wyświetlenie kementarzy dla wpisów bloga.
Kod wygląda jak następuje:
<?php get_header() ?>
<?php if(!isset($_GET['pd']) or (intval($_GET['pd']) < 1) ): ?>
<h2>Nie określono wpisu, dla którego maja być wyświetlone komentarze</h2>
<?php else: ?>
<?php $pd = intval($_GET['pd']) ?>
<?php query_posts( array('post__in'=>array($pd))) ?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h2>Komentarze dla: <br />
<a href = "<?php the_permalink(the_ID()) ?>"><?php esc_html(the_title()) ?></a> (<?php echo esc_html($post -> comment_count) ?>)
</h2>
<?php $withcomments = true; ?>
<?php comments_template(); ?>
<?php endwhile; else: ?>
<h2>Nie znaleziono wpisu</h2>
<p>Co gorsza, komentarzy też nie znaleziono ;(</p>
<?php endif; ?>
<?php endif ?>
<?php get_sidebar() ?>
<?php get_footer() ?>
Aby wszystko mogło zadziałać, należy sprawdzić czy za pośrednicwem globalnej tablicy $_GET została przesłana informacja, o tym dla którego wpisu mają być wyświetlone komentarze. Na użytek tego wpisu stworzyłem argument o nazwie pd, który właśnie taka informację będzie przechowywał. Jeżeli pd zawiera poprawny numer identyfikacyjny wpisu wówczaj wykonujemy nowe zapytanie do bazy danych przy pomocy funkcji query_posts. Chodzi o ściągnięcie wpisu ( będzie nam potrzebny jego tytuł i numer identyfikacyjny.
Z pomocą pętli Wordpresa wyświetlamy tytuł wpisu oraz tworzymy odnośnik do pełnej jego zawartości tak, aby osoba, która znalazła się na stronie z komentarzami, mogła w jakiś sposób wrócić do miejsca skąd przybyła.
Pozostaje ustawić zmienną $withcomments do wartości true i wyświwietlić szablon komentarzy. Jeżeli zmienna $withcomments nie zostanie ustawiona, funkcja comments_template zamiast wyświetlić komentarze, po prostu zakończy swoje działanie niemal tak szybko jak je zaczęła.
Modyfikacja pliku single.php
Pozostaje zmodyfikować nieco plik single.php tak aby osoba odwiedzająca stronę pełnego wpisu mogła w jakiś sposób odnaleźć jego komentarze. Najprostszą metodą jest w tym przypadku dodanie odnośnika z pomocą kodu jak poniżej:
<?php if($post -> comment_count > 0): ?>
<a href = "/?page_id=77&pd=<?php the_ID() ?>">Zobacz komentarze dla tego wpisu</a>
<?php endif ?>
Kod przedstawiony powyżej można umieścić w dowolnym miejscu pliku single.php (pod warunkiem, że będzie to wewnątrz pętli Wordpresa), najlepiej jednak zrobić to tam gdzie znajduje się wywołanie funkcji comments_template.
Należy zwrócić uwagę na parametr page_id. Musi on być równy id strony na której wyświetlane są komentarze (w moim przypadku jest to 77).
Wywołanie funkcji funkcji comments_template, jeżeli obecne w pliku single.php, należy usunąć lub zakomentować.
<?php //comments_template( '', true ); ?>
Funkcja comments_template służy do włączenia szablonu komentarzy do pliku, w którym zostaje wywołana. Domyślnie przyjmuje ona dwa argumenty, pierwszym jest nazwa pliku szablonu komentarzy do włączenia ( domyślnie comments.php ), drugi to logoczna prawda (true) lub fałsz (false), które określają czy komentarze mają zostać posortowane według typu czy może wyświetlone wszystkie razem.
Jeżeli z pomoca funkcji comments_template chcemy włączyć inny plik o alternatywnym rozmieszczeniu komentarzy, możemy tego dokonać jak następuje:
<?php comments_template( '/alternatywny-szablo-komentarzy.php', true ); ?>
Podsmowanie
Przedstawiona metoda jest alternatywną do tej, jaką opisałem przy okazji wpisu o AJAXie w Wordpresie, gdzie komentarze były ładowane asynchronicznie.
Aby nie komplikować rzeczy zanadto, w tym wpisie wykorzystałem funkcję comments_template. Przy bardziej obleganych blogach opłaca się stworzyć własny szablon dla komentarzy. Funkcja comments_template uruchamia sporo kodu, o czym można się przekonać zaglądając do pliku /wp-includes/comment-template.php.
Autor wpisu jest blogerem, programistą PHP, administratorem Linux oraz twórcą blogów
RSS Subskrybuj wpisy bloga