Blog

Wyświetlanie ostatnich komentarzy – get_comments()

Czasami zwykły widget wyświetlający ostatnie komentarze na blogu nie zawsze nam wystarcza, co prawda przy odpowiednich umiejętnościach możemy stworzyć dodatkowy sidebar, umieścić taki widget z komentarzami w dowolnym miejscu na blogu, dodatkowo możemy dopisać do niego style CSS, ale sam widget dostarcza nam niewiele opcji. Czasami mamy potrzebę zaingerować nie tylko w wygląd, lecz także w informacje jakie mają się wyświetlać. Są różne wtyczki które dają nam różne opcje zarządzania tym co i jak ma się pokazywać, ale nie ma możliwości aby aby każdemu to wystarczyło, oprócz tego każda wtyczka dodatkowo obciąża WordPressa, dlatego ja osobiście wolę samemu zakodować tylko to co jest mi potrzebne, w kilkunastu lub kilkudziesięciu linijkach kodu, zamiast ładować setki linijek kodu, kilka funkcji, które i tak w większości nie będą wykorzystane.

 

Funkcja get_comments()

WordPress jak zwykle udostępnia nam już jakąś funkcję która znacznie ułatwia nam wykonanie jakiegoś zadania, w tym przypadku mowa o funkcji get_comments().

 

Domyślne wartości

<?php $defaults = array(
‚author_email’ => ,
‚ID’ => ,
‚karma’ => ,
‚number’ => ,
‚offset’ => ,
‚orderby’ => ,
‚order’ => ‚DESC’,
‚parent’ => ,
‚post_id’ => ,
‚status’ => ,
‚type’ => ,
‚user_id’ => ); ?>

Jak widać, domyślnie funkcja ustawia jedynie kolejność sortowania malejącą, czyli od najnowszych komentarzy, do najstarszych.

 

Parametry

  • $status – status komentarzy, dostępne mamy cztery opcje:
    • 'hold' – oczekujące na akceptację
    • 'approve' – zatwierdzone
    • 'spam' – oznaczone jako spam
    • 'trash' – znajdujące się w koszu
  • $orderby – tutaj możemy zdecydować po jakim polu mają być sortowane komentarze, domyślnie są sortowane po dacie, inne opcje to np:
    • 'comment_ID' – ID komentarza
    • 'comment_post_ID' – ID autora
    • 'comment_author' – nick autora
    • 'comment_author_email' – e-mail autora
    • 'comment_content' – treść komentarza
    • … i jeszcze inne równie mało przydatne opcje
  • $order – kolejność sortowania:
    • 'ASC' – rosnąco, od najstarszego do najnowszego
    • 'DESC' – malejąco, od najnowszego do najstarszego
  • $number – ilość komentarzy jakie mają się wyświetlić, domyślnie nie ma ograniczeń, więc jeżeli nie podamy wartości dla tego parametru, wyświetlą się wszystkie.
  • $offset – ilość komentarzy jakie mają być z początku pominięte, możemy np. wyświetlać wszystkie komentarze poza pierwszymi pięcioma – wtedy wpisujemy 5, przydatne kiedy chcieli byśmy napisać dla pierwszych 5 osobną pętlę z innymi danymi czy wyglądem, niż dla pozostałych
  • $post_id – wyświetla komentarze tylko z tego wpisu, którego ID podamy

 

Zwraca

Funkcja zwraca nam tablicę, z następującymi obiektami:

  • comment_ID – ID komentarza
  • comment_post_ID – ID wpisu do którego komentarz został przypisany
  • comment_author – nick autora komentarza
  • comment_author_email – e-mail autora
  • comment_author_url – strona www autora (o ile podał takową)
  • comment_author_IP – adres IP autora
  • comment_date – data dodania komentarza
  • comment_date_gmt – jak wyżej, jeśli ktoś ma problemy z dobrą godziną na serwerze, ze źle ustawionymi strefami czasowymi, a zależy mu na dokładności, można próbować stosować zamiennie z comment_date
  • comment_content – treść komentarza
  • comment_karma – ocena jakości komentarza, jest to wykorzystywane przez Akismet’a, lub różnego rodzaju wtyczki umożliwiające głosowanie na komentarze – dzięki czemu możemy np. wyświetlić najlepiej oceniane komentarze (aczkolwiek gotowe wtyczki na pewno mają już także gotowe widgety albo funkcje do tego, lecz jak ktoś by chciał pisać własną wtyczkę, to w tym polu jak najbardziej można trzymać rankingi czy oceny komentarzy)
  • comment_approved – poziom akceptacji komentarza 0 – oczekuje na akceptację, 1 – zatwierdzony, lub spam
  • comment_agent – informacje o autorze (czyli np. przeglądarka internetowa, system operacyjny, rozdzielczość ekranu itp.)
  • comment_type – typ komentarza, pingback, trackback, lub puste dla zwykłych komentarzy
  • comment_parent – ID rodzica komentarza (zwraca 0 jeżeli komentarz jest rodzicem)
  • user_id – ID autora komentarza, jeśli jest zarejestrowanym użytkownikiem, a nie gościem

 

Przykładowy kod

Skoro wiemy już jak możemy używać funkcji, czas zaprezentować przykładowy kod.
 

	<?php $args = array( 'number' => '5', 'status' => 'approve' );
	$comments = get_comments($args);
	foreach($comments as $comment) { ?>
		<div class="quote">
			<div class="quote_left">
				<?php echo get_avatar($comment->comment_author_email, 60); ?>
			</div>
			<div class="quote_right">
				<p>dodał <?php echo $comment->comment_author; ?> do 
				<a href="<?php echo get_comment_link(); ?>">
					<?php $post_title = get_the_title($comment->comment_post_ID); 
						if(strlen($post_title)>28){
							$post_title = substr($post_title, 0, 25);
							$post_title = $post_title . '...';
						} 
					echo $post_title; ?>
				</a></p>
				<div class="quote_content"><?php comment_excerpt($comment->comment_ID); ?></div>
			</div>
			<div class="clear_both"></div>
		</div>
	<?php } ?>

 

#home-quote .quote { border-top: 1px solid #E5E5E5; margin-top: 7px; padding-top: 7px; }
#home-quote .quote_left { width: 70px; text-align: center; margin-right: 10px; padding-top: 15px; float: left;  }
#home-quote .quote_right { width: 370px; float: left; }
#home-quote .quote_right p { border-bottom: 1px solid #EEE; color: #606060; display: block; margin-bottom: 2px; padding-bottom: 2px; }
#home-quote .quote_right .quote_content { text-align: justify; }
#home-quote .clear_both { clear: both; }

 
Jak pewnie niektórzy zauważyli, jest o kod odpowiedzialny za wyświetlane ostatnich komentarze na naszej stronie głównej. Dla pozostałych, wytłumaczenie kodu.
 

	<?php $args = array( 'number' => '5', 'status' => 'approve' );
	$comments = get_comments($args);
	foreach($comments as $comment) { ?>

	<?php } ?>

 
W pierwszej linijce w zmiennej $args tworzymy tablicę z parametrami dla funkcji get_comments(). Efekt jaki osiągniemy takimi parametrami, to wyświetlenie pięciu najnowszych zatwierdzonych komentarzy. W drugiej linijce w zmiennej $comments będziemy mieli zapisaną tablicę jaką zwróci nam funkcja get_comments(), korzystająca z zadanych parametrów. Trzecia i piąta linijka to to po prostu pętla, która za każdym przejściem wyświetla kolejny element z tablicy $comments, czyli za każdym przejściem wyświetla nowy komentarz.

Struktury samych div’ów nie będę tłumaczył, tak samo kodu CSS, to i tak każdy pisze sam w swoim zakresie, oraz nie chcę z każdego wpisu robić kursu podstaw htmla, dlatego część kodu opuszczam.
 

	<div class="quote_left">
		<?php echo get_avatar($comment->comment_author_email, 60); ?>
	</div>
	<div class="quote_right">
		<p>dodał <?php echo $comment->comment_author; ?> do 
		<a href="<?php echo get_comment_link(); ?>">
			<?php $post_title = get_the_title($comment->comment_post_ID); 
				if(strlen($post_title)>28){
					$post_title = substr($post_title, 0, 25);
					$post_title = $post_title . '...';
				} 
			echo $post_title; ?>
		</a></p>
		<div class="quote_content"<?php comment_excerpt($comment->comment_ID); ?></div>
	</div>

 
Pierwszy div o klasie quote_left wykorzystuje funkcję get_avatar(), która jest wbudowana w WordPressa, i w bardzo wygodny sposób pozwala nam pobrać gravatar użytkownika, wystarczy jako pierwszy parametr podać e-mail użytkownika (funkcja już sama w sobie generuje hasha tego maila, na podstawie którego gravatar zwraca nam odpowiedni obrazek), a jako drugi rozmiar gravatara w pikselach, można tam równie dobrze wpisać 40, 80, 100 – w zależności od tego jakiego dużego gravatara ktoś chciał by wyświetlać. Jak widzimy, wyciągnięcie w pętli e-maila autora komentarza jest banalnie proste, i wystarczy do tego kod $comment->comment_author_email, na koniec trzeba jeszcze dodać echo, gdyż ta funkcja tylko zwraca nam już wygenerowany kod do wyświetlenia całego obrazka z linkiem i rozmiarami, nie wyświetla go domyślnie, jak w WordPressie często sugeruje przedrostek get_ przed nazwą funkcji.

W kolejnym div’ie o klasie quote_right, w akapicie p, wyświetlamy nick autora komentarza, który jest trzymany w $comment->comment_author. Następnie, w linii 6 tworzymy linka do komentarza, aby użytkownik mógł w niego kliknąć, i automatycznie zostać przeniesionym do komentowanego wpisu, i do konkretnego komentarza. Funkcja get_comment_link() zwraca nam link w postaci – https://wordpress-polska.pl/wordpress-polska-pl/witaj-swiecie/#comment-6, oraz jeżeli funkcja ta jest używana w pętli wyświetlającej komentarze, nie musimy w parametrach dodawać jej ID aktualnie przetwarzanego w pętli komentarza.

Następnie w linii 7, do zmiennej $post_title, zapisujemy tytuł wpisu do którego odnosi się komentarz, korzystamy w tym wypadku z funkcji get_the_title(), i w środku jako jej parametr podajemy ID wpisu, którego tytuł ma pobrać, a to ID wyciągamy z tablicy dzięki $comment->comment_post_ID. Kolejnym krokiem jest prosta funkcja warunkowa if, która sprawdza czy tytuł wpisu nie ma czasem więcej niż 28 znaków, i jeśli ma, to obcina go do pierwszych 25 znaków, oraz na końcu dodaje ..., po czym echo go wyświetla – taki zabieg jest często spotykany, stosuje się go aby uniknąć wyświetlania strasznie długich tytułów, co może powodować rozjeżdżanie się strony, albo po prostu psuć wygląd całego układu.

Ostatnią rzeczą jaką wyświetlamy jest treść komentarza, jednak w tym przypadku nie wyświetlamy jej w całości, a tylko pierwsze 20 wyrazów (liczone są spacje między wyrazami), służy nam do tego funkcja comment_excerpt(), której parametrem jest ID komentarza. Jeżeli natomiast chcemy wyświetlić całą treść komentarza, wtedy użyli byśmy kodu <?php echo $comment->comment_content ?>.

 

Podsumowanie

Możliwości z wyświetlaniem komentarzy, w ten sposób są w zasadzie nieskończone, wszystko zależy od Waszej wyobraźni i potrzeb. Jeżeli coś jest jeszcze nie jasne, albo macie problem z osiągnięciem jakiejś jeszcze innej funkcjonalności – skorzystajcie z formularza komentarzy poniżej :)

Jeśli spodobał się Wam ten wpis albo okazał się przydatny, pomóżcie nam go wypromować aby trafił do jak największej ilości osób - wystarczy że podzielicie się nim z innymi.

8 Komentarzy

  1. Czy ktos sie orientuje czy jest jakis sposob na usuniecie 1900 nie zaakceptowanych kometarzy bez robienia tego po 20. Bo zajmie to conajmniej kilka godzin i kto wie czy nie bedzie tego trzeba kiedys powtarzac.

    • Chcesz usunąć wszystkie komentarze o nie zaakceptowanym statusie, czy te 1900 to tylko część z nich? Jeśli część, to podaj dokładniejsze kryteria niż 1900.

    • Wszystkie nie zaakceptowane komentarze to spam.
      kazdy wpis wyglada mniej wiecej tak:
      link do strony a pozniej kilka slow o pigulkach jakie tam sprzedaja,
      IP kazdego komentarza jest inne.

      Jesli bede w stanie wywalic wszytkie oczekujace komentarze to tez sie nic nie stanie. Teraz mam zainstalowany plugin z captcha tak wiec nowe spamy sie nie pojawiaja.

    • Wtedy najłatwiej przez phpmyadmina, w zakładce SQL, wklej i wykonaj taki kod:
      DELETE FROM wp_comments WHERE comment_approved = ‚spam’;

      To usunie wszystkie komentarze oznaczone jako spam.

      Jeśli chcesz usunąć także te niezaakceptowane, wtedy dodatkowo wklej i wykonaj taki kod:
      DELETE FROM wp_comments WHERE comment_approved = 0;

  2. Mam pytanie odnośnie tegoi kodu. Spełnia on wszystko to co potrzbuję na swojej stronie. Jednak jak wrzucę go do functions.php to komentarze wyswietlane na górze poza stroną internetową. Czy jest możliowśc aby ten kod był wyświetlany w miejscu gdzie użyłem pluginu ” ostatnie komentarze” ?

    • Zaprezentowany kod służy do umieszczenia nie w pliku functions.php, a w dowolnym miejscu w plikach szablonu, czyli np. index.php, sidebar.php etc. i tam gdzie go umieścisz, będzie wykonywany oraz wyświetlany.
      Natomiast jeżeli koniecznie chciał byś go w functions.php, to wrzuć go w funkcję np. my_custom_get_comments(){}, i później wywołaj w dowolnym miejscu jako … teoretycznie nawet bez poprawek powinno działać.

  3. my_custom_get_comments(){

    $args = array( 'number' => '5', 'status' => 'approve' );
    $comments = get_comments($args);
    foreach($comments as $comment) { ?>

    comment_author_email, 60); ?>

    dodał comment_author; ?> do
    <a href="">
    comment_post_ID);
    if(strlen($post_title)>28){
    $post_title = substr($post_title, 0, 25);
    $post_title = $post_title . '...';
    }
    echo $post_title; ?>

    comment_ID); ?>

    <?php }
    }

    zrobiłem coś takiego, ale w tej chwili strona nie odpala się w ogóle, czyli pewnie nie tak coś napisałem. Jakieś propozycje?

  4. Proponuję zacząć od tego:
    http://www.php.net/manual/en/functions.user-defined.php

    I po sam support zgłosić się na oficjalne forum WordPressa, w komentarze tutaj mogę pomóc w jakiś krótkich sprawach, i teoretycznie, w edycji kodu pod Twoje potrzeby pomogą na forum :) Tutaj link w razie czego:
    http://pl.forums.wordpress.org/

Dodaj odpowiedź do Daniel Anuluj odpowiedź

Twój adres e-mail nie zostanie opublikowany.


Parse error: syntax error, unexpected '}' in /home/platne/amistad18/public_html/wordpress-polska.pl/wp-content/themes/Division/footer.php on line 33