• Witam! Mam pewien problem, otóż korzystam z tej funkcji do zwiększania liczby wyświetleń danego postu:

    function setPostViews($postID) {
    
        $count_key = 'post_views_count';
        $count = get_post_meta($postID, $count_key, true);
        if($count==''){
            $count = 0;
            delete_post_meta($postID, $count_key);
            add_post_meta($postID, $count_key, '0');
        }else{
            $count++;
            update_post_meta($postID, $count_key, $count);
        }
    }

    Problem polega na tym ze jak ktoś wejdzie w post i zacznie odświeżać strone to możę nabić miliony wyświetleń, jest jakiś prosty sposób aby sie z tym uporać?
    Myślałem o jakimś czasie 'odpoczynku’ nadawanym na adres IP odwiedzającego ale kompletnie nie wiem jak sie za to zabrać.

Viewing 7 replies - 1 through 7 (of 7 total)
  • Najlepiej oprzeć to na ciasteczkach i dać możliwość wyboru ich wygaśnięcia np. po 30 minutach lub godzinie (jakiś rozsądny przedział czasowy).

    Postaram Ci się coś wkleić za chwilkę.

    Mogłoby to wyglądać m.w. w ten sposób:

    define ( "WPSolucje_CookieName", "wpsol_post_counter");
    
    function wpsolucje_page_views(){
    	
    	$meta_key = 'counter';
    	
    	if ( !isset ( $_COOKIE [ WPSolucje_CookieName ] )){
    
    		$prev_value = (int) get_post_meta( get_the_ID(), $meta_key, true );	  
    		  
    				if (  empty( $prev_value ) ) {
    					
    					$prev_value = 0;
    					
    				}
    				
    		update_post_meta( get_the_ID(), $meta_key, ++$prev_value );
    	}
    }
    
    add_action( 'wp_footer', 'wpsolucje_page_views');
    
    function wpsolucje_set_cookie(){
    	
    	if ( !isset ( $_COOKIE [ WPSolucje_CookieName ] )){
    	
    		setcookie ( WPSolucje_CookieName,  time() + 10, time() + 10 );
    	}
    }
    
    add_action ( 'init', 'wpsolucje_set_cookie');
    

    A teraz krótkie omówienie.

    Pozbywamy się delete_post_meta i add_post_meta i zastępujemy je przez update_post_meta

    Najpierw warunek sprawdza czy nie ma ciasteczka (użytkownik pierwszy raz).
    Jeżeli nie ma, pobieramy wartość pola „counter”.

    W przypadku pierwszego uruchomienia może nie być wartości więc trzeba to sprawdzić warunkiem. Jeżeli jest, zmienna $pres_value otrzymuje wartość 0.

    Następnie funkcja uaktualnia pole „counter”.

    Teraz ciasteczko. DO tego jest druga funkcja.
    A w niej podobny warunek.
    Jeżeli nie ma ciasteczka, ciasteczko jest tworzone.

    Zmienną $expire kontrolujesz po jakim czasie ma wygasnąć ciasteczko.

    W tym przypadku ustawione jest na 10 sekund.

    • Ta odpowiedź została zmodyfikowana 7 years, 7 months temu przez Paweł.

    Widzę, że wrzuciło mi odpowiedź do spamu.

    Przykładowy prosty skrypt jako licznik odsłon mógłby m.w. wygladać tak:

    https://pastebin.com/Rpm8fckU

    Należy się tylko zastanowić na ile ustawić ciasteczko, tak aby czas jego życia był sensowny w odniesieniu do rzeczywistości.

    edit: W tym momencie ustawione jest na godzinę

    • Odpowiedź została zmodyfikowana 7 years, 7 months temu przez Paweł. Powód: edit
    Twórca wątku raptor2

    (@raptor2)

    Dziękuje za odpowiedź, na podstawie tego co pokazałeś przerobiłem funkcje i wyszło coś takiego:
    http://wklej.org/hash/11c5c0ce5b6/

    Jakbyś mógł ocenić i ewentualnie powiedzieć co zrobiłem źle byłbym wdzięczny.

    Twórca wątku raptor2

    (@raptor2)

    ps.
    Teoretycznie działa bo sprawdziłem.

    Ta część kodu jest zbędna:

        if($count==''){
            $count = 0;
            delete_post_meta($postID, $count_key);
            add_post_meta($postID, $count_key, '0');
    

    bo można ją zastąpić jedną funkcją: update_post_meta.

    Gdy pobierzesz już wartość pola:

    $count = get_post_meta($postID, $count_key, true);

    Najpierw sprawdzasz czy jest ono puste:

    if($count==''){

    żeby wykonać dalszą cześć kodu czyli nadać zmiennej $count wartość 0, usunąć to pole i znów dodać.

    Z punktu widzenia pierwszego uruchomienia to delete_post_meta nic nie usuwa, bo takiego pola niema (nie zostało jeszcze utworzone), więc funkcja w tym miejscu jest zbędna tak samo jak add_post_meta, która i tak by była użyta gdyby w bazie nie było tego pola.

    Dlatego podałem Ci taki przykład:

                $prev_value = (int) get_post_meta( get_the_ID(), $meta_key, true );  
                 
                        if (  empty( $prev_value ) ) {
                           
                            $prev_value = 0;                       
                        }                  
                update_post_meta( get_the_ID(), $meta_key, ++$prev_value );

    Najpierw pobierasz wartość pola i jeżeli jest puste (a jest, bo to pierwsze uruchomienie) nadajesz zmiennej wartość początkową 0.

    A później wykonuje się już funkcja aktualizacji pola. I tu pewnie się zastanawiasz: No dobra, a jak sie owe pole dodaje?
    Jak sie doda wartość do bazy?

    Dodaje się, przy pomocy add_post_meta. ale w innej kolejności. Kiedy użyjesz update_post_meta ale w bazie nie będzie tego pola, pole to zostanie utworzone przy pomocy add_post_meta.

    Niby działa tak samo a różnica w kodzie znaczna.

    Ale oczywiście jeżeli tobie to działa to dlaczego masz zmieniać?

    Zastanawiam się tylko, jak odpalasz te funkcje. Pewnie musisz dodać je do któregoś pliku w szablonie?
    header.php?
    Bo same z siebie nie będą działać, dlatego ja podpiąłem je pod zaczep akcji: template_redirect.

    Drugie spostrzeżenie.

    Zauważyłem, że dla ciastek użyłeś warunków: is_page is_post, ale dla setPostViews już nie.
    Lepiej by było a raczej należy to tam zrobić, bo inaczej może Ci nadpisywać wszystkie pola w bazie, gdyż strona główna nie posiada ID, chyba, że jest to front_page.
    Jeżeli już wstawiasz set_cookieStatus() w setPostViews co nawet jest lepszym pomysłem, dodaj warunek tylko do funkcji: setPostViews, bo przecież i tak trzeba najpierw sprawdzić ciastko a ja to zrobiłem dwa razy.

    Na koniec, trzymaj się zasad i unikaj używania przypadkowych nazw funkcji. Zawsze powinny być one tworzone z inicjałów autora i/lub wtyczki.

    Twórca wątku raptor2

    (@raptor2)

    Dziękuję bardzo za wyczerpującą odpowiedź.

    Poprawiłem kod według Twoich wytycznych, działa i wygląda lepiej.

    Funkcje wywołuje w pliku single.php dzieki czemu od razu pobiera mi id postu i dodaje mu wyświetlenie jak tylko ktos odwiedzi dany post + to chyba zwalnia mnie z obowiązku dodawania warunku „is_page is_post”.

Viewing 7 replies - 1 through 7 (of 7 total)
  • Temat ‘Wyświetlenia postów a IP użytkownika’ jest zamknięty na nowe odpowiedzi.