WordPress posiada sporo gotowych opcji dla blogerów. Jedna z nich to możliwość wyróżniania wpisu jako „polecany” na stronie głównej. Dzięki temu rozwiązaniu możesz „przykleić” wybrany artykuł na górze strony, tak aby mógł dotrzeć do jak największej liczby użytkowników. Jest to całkiem dobra opcja, jeśli chodzi o wyróżnienie wpisu na stronie głównej. Niestety opcja „Featured post” działa tylko i wyłącznie dla strony domowej, wyjątkiem są niektóre motywy. Jeśli chcesz, aby Twój wpis był „przyklejony” na stronach kategorii oraz tagów, musisz rozszerzyć możliwości swojej templatki. W tym wpisie pokażę jeden ze sposobów dodania takiej. Zapraszam więc do lektury wpisu. 😉

Jak przykleić wpis do góry bloga?

Aby wyróżniać wpis na stronie, należy otworzyć go w edytorze WordPress i przejść do sekcji Status i dostępność (rys. 1). Następnie, wystarczy włączyć opcję Przyklej do góry bloga.

Krok 1 - Przyklej do góry bloga
Rysunek 1. Opcja dla „przyklejania” wpisu na blogu

Po zapisaniu zmian wpis zostanie wyróżniony na stronie domowej, w zależności od motywu, zostanie oznaczony np. specjalnym znacznikiem „Przyklejony” i/lub elementem graficznym. Na stronie testowej, gdzie zainstalowany był motyw Storefront, wyświetla się obraz pinezki (rys. 2).

Krok 2 - Przyklejony wpis
Rysunek 2. Znacznik „Przyklejony” dla wyróżnionego wpisu

Dzięki włączeniu tej opcji, wpis będzie wyświetlany na górze bloga (jako pierwszy) dopóki go nie odepniemy. Niestety to rozwiązanie ma swoje ograniczenia i przykładowo nie ma możliwości aby wpis pojawiał się także na kolejnych stronach bloga, czy stronach kategorii/tagów. Ciężko stwierdzić dlaczego WordPressowcy nie pomyśleli o tym? Nic straconego ponieważ możemy samodzielnie rozszerzyć opcję przypinania wpisów o dodatkowe możliwości. Aby to zrobić możemy skorzystać z gotowej wtyczki lub dodać odpowiedni kod. W tym wpisie przejrzymy oba sposoby.

Użycie gotowej wtyczki

W repozytorium WordPress można znaleźć sporo gotowych rozwiązań, w tym i do zarządzania przyklejonymi wpisami. Wyszukując zapytanie „Featured post” oraz „Sticky post” znaleźć można różne wtyczki, które powinny problem szybko rozwiązać (rys. 3).

Krok 3 - Wtyczki Featured post
Rysunek 3. Poszukiwanie wtyczki dla przyklejania wpisów na różnych stronach

Po przetestowałem kilku z nich mogę polecić Sticky Posts – Switch. Ta wtyczka działa poprawnie i spełniła wszystkie potrzeby postawione wcześniej. Oprócz tego ma dobre oceny użytkowników i jest regularnie aktualizowana.

Zainstalować wtyczkę można bezpośrednio z repozytorium WordPress: sekcja Wtyczki – Dodaj nową. Po jej aktywacji pojawi się dodatkowa opcja w sekcji Ustawienia – Sticky Posts – Switch (rys.4).

Ustawienia Sticky Posts – Switch
Rysunek 4. Poszukiwanie wtyczki dla przypinania wpisów na różnych stronach

Jak widać na powyższym rysunku możesz wybrać typy wpisów i strony, gdzie mają pokazywać się przyklejone wpisy. Dla przykładu włączyłem wszystkie kategorie stron, aby przypięte artykuły pojawiały się wszędzie. Po zapisywaniu zmian, można przejść do dowolnej kategorii a na górze będą już wyświetlane „przyklejane” wpisy (rys. 5):

Wpisy w kategoriach
Rysunek 5. „Przyklejane” wpisy w kategorii

Przechodzimy teraz do kolejnego rozwiązania – edycji kodu.

Rozszerzenie funkcjonalności motywu używanego domyślnie

Jeśli dbasz o bezpieczeństwo strony i starasz się minimalizować liczbę zainstalowanych wtyczek (przez wtyczki odbywa się 98% włamań na strony WordPress), to poniższe rozwiązanie będzie dla Ciebie przydatne.

Edycja motywu
Rysunek 6. Edytowanie pliku functions.php

Znalazłem gotowe kawałki kodu, które zostały dopracowane i zoptymalizowane. Więc aby przyklejać wpisy do strony kategorii i tagów musisz wykonać jedynie następujące kroki:

  1. Przejdź do edytora motywu (sekcja Wygląd – Edytor motywu) i wybierz plik functions.php motywu używanego domyślnie (rys. 6).
  2. Dodaj poniższy kod:
function get_term_sticky_posts()
{
    if ( !is_category() )
        return false;

    $stickies = get_option( 'sticky_posts' );
 
    if ( !$stickies )
        return false;
 
    $current_object = get_queried_object_id();
 
    $args = [
        'nopaging' => true,
        'post__in' => $stickies,
        'cat' => $current_object,
        'ignore_sticky_posts' => 1,
        'fields' => 'ids'
    ];
    $q = get_posts( $args );
 
    return $q;
}
 
add_action( 'pre_get_posts', function ( $q )
{
    if (    !is_admin() 
         && $q->is_main_query() 
         && $q->is_category() 
    ) {

        if ( function_exists( 'get_term_sticky_posts' ) ) {

            $stickies = get_term_sticky_posts();
 
            if ( $stickies ) {

                $q->set( 'post__not_in', $stickies );

                if ( !$q->is_paged() ) {
                    add_filter( 'the_posts', function ( $posts ) use ( $stickies )
                    {   
                        $term_stickies = get_posts( ['post__in' => $stickies, 'nopaging' => true] );
 
                        $posts = array_merge( $term_stickies, $posts );
 
                        return $posts;
                    }, 10, 1 );
                }
            }
        }
    }
});

W tym kodzie znajdziemy dwa główne bloki:

  • funkcja get_term_sticky_posts, odczytuje wszystkie załączone posty z bieżącej aktywnej kategorii. Także w kodzie jest funkcja get_queried_object, która zwraca pełną informację o bieżącym obiekcie, np. kategorii, wpisie, autorze, tagu.
  • Następnie przed wykonaniem WP_Query i wysłania zapytania do bazy danych, dodajemy wydarzenie pre_get_posts aby pobrać informację o przyklejonych wpisach.

Drugi kod „przykleja” wpisy także na stronach tagów (zastępujemy pierwszy) :

function get_term_sticky_posts()
{
    if (( !is_category() ) && ( !is_tag() ))
        return false;
 
    $stickies = get_option( 'sticky_posts' );
 
    if ( !$stickies )
        return false;
 
    $current_object = get_queried_object_id();
 
    if ( is_category() ) {
    $args = [
        'nopaging' => true,
        'post__in' => $stickies,
        'cat' => $current_object,
        'ignore_sticky_posts' => 1,
        'fields' => 'ids'
    ];

    } elseif ( is_tag() ) {
    $args = [
        'nopaging' => true,
        'post__in' => $stickies,
        'tag_id' => $current_object,
        'ignore_sticky_posts' => 1,
        'fields' => 'ids'
    ];
    }
 
    $q = get_posts( $args );
 
    return $q;
}
 
add_action( 'pre_get_posts', function ( $q )
{
 
    if (    !is_admin()
        && $q->is_main_query() 
        && ( ($q->is_category()) || ($q->is_tag()) ) 
        && ( (term_exists(get_query_var('category_name'))) || (term_exists(get_query_var('tag'))) )
    ) {
 
        if ( function_exists( 'get_term_sticky_posts' ) ) {
 
            $stickies = get_term_sticky_posts();
 
            if ( $stickies ) {
 
                $q->set( 'post__not_in', $stickies );
  
                if ( !$q->is_paged() ) {
  
                    add_filter( 'the_posts', function ( $posts ) use ( $stickies )
                    {   
                        $term_stickies = get_posts( ['post__in' => $stickies, 'nopaging' => true] );
 
                        $posts = array_merge( $term_stickies, $posts );
 
                        return $posts;
                    }, 10, 1 );
                }
            }
        }
    }
});

Po zapisywaniu wszystkich zmian w pliku functions.php otrzymamy rezultat jak na rysunku 5.

Podsumowanie

Jeśli chcesz wyróżnić swoje wpisy za pomocą standardowej opcji „Featured post” czyli „Przyklejony wpis”, na pewno spotkasz się z problemem wyświetlenia artykułów na różnych stronach bloga. Za pomocą dodatkowych wtyczek lub własnych rozszerzeń funkcjonalności motywu możesz go rozwiązać. Każdy z tych sposobów ma swoje wady i zalety, dlatego możesz wybrać ten, który Ci odpowiada najbardziej.

P.S. Jeśli korzystasz z innego rozwiązania, proszę podziel się własnymi doświadczeniami w komentarzu.


Wpis otagowano:

Pomogłem? Dodaj coś od siebie! Skomentuj ten wpis:

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