Studio Multimedialne ljasinski.pl

  • O mnie
  • Blog
  • Prelekcje
  • Portfolio
  • Kontakt
Jesteś tutaj: Strona główna / Komputery / WordPress / Własne typy postów w Wordpressie

Własne typy postów w WordPressie

9 marca 2012 by lucasyas 8 komentarzy

Dawno na blogu nic nie było, ale teraz nadrobimy to w dwójnasób. Będzie to krótka (acz treściwa) seria artykułów o najbardziej rewolucyjnej funkcji wordpressa wprowadzonej od wersji 3.0. Wiem, że nie jest to nowość, ale inspiracja przyszła nagle i nieoczekiwanie. Przebudowywałem mechanizm mojej strony brydżowej, przeniosłem ją ze starej Joomli na WordPressa. Potrzebowałem do tego jakiś system do katalogowania wyników imprez, które sędziowałem.

Optymalnym rozwiązaniem były właśnie własne typy postów. Jednak na moje, zdawałoby się dość typowe potrzeby (na dobrą sprawę jest to baza otagowanych linków z nazwami i datami), nie znalazłem żadnego gotowego i spójnego rozwiązania. Aby oszczędzić wszystkim poszukującym czasu i nerwów, będzie ono tutaj umieszczane w odcinkach:

  1. Własne typy postów (właśnie to czytasz)
  2. Przedefiniowanie typu postu – nie będzie to już coś w rodzaju wpisu, a rekord bazy danych
  3. Własne taksonomie – tagi i kategorie dla własnych typów postów
  4. Jak to praktycznie wykorzystać we własnym szablonie

Co to są własne typy postów

Jak zapewne wiesz, w WordPressie mamy dwa podstawowe typy danych – posty i strony. Podstawowa różnica – strony są hierarchiczne  – strona może mieć podstrony (co znajdzie swoje odzwierciedlenie np. w automatycznym menu), a posty mają taksonomie – domyślnie kategorie i tagi (kategorie są hierarchczne , tagi nie).

Własne typy postów umożliwiają wprowadzenie trzeciego (i następnych – nie ma tu ograniczeń) modelu danych na stronę. Ma to sens zasadniczo wtedy, gdy chcemy umieszczać na stronie coś nietypowego np. wskazana powyżej baza wyników. Na Wordcampie w Poznaniu padł (dość szeroko omówiony) przykład stworzonego systemu CRM na bazie WordPressa i własnych typów postów.

Kiedy nie będzie to potrzebne

Nie ma sensu używać własnych typów postów, jeżeli chcemy tylko zmienić sposób w jaki są one wyświetlane. Do tego może posłużyć format postu, a często nawet osobny szablon dla konkretnej kategorii czy tagu. Owszem, będzie to działać, ale to tak jak zwalczać muchy profesjonalną klapką z ultragiętką rączką i profilowaną rękojeścią wykładaną korkiem (za jedyne X XXX w telemarkecie). Będzie to działać, ale zwinięta gazeta sprawdzi się równie dobrze.

Gdzie zadeklarować własny typ postu

Szkoły są dwie. Pierwsza z nich proponuje plik [cci]functions.php[/cci] w katalogu szablonu. Ma to pewien minus – jeśli zmienimy szablon, musimy ręcznie przenosić odpowiednie wpisy. Prawda jednak jest taka, że najczęściej nowy szablon będzie wymagał kilku plików do specyficznego wyświetlania własnych typów postów, więc nie będzie to duża różnica.

W drugim, technicznie bardziej poprawnym przypadku, umieszczamy nasz kod we własnym pluginie.

Jak wygląda deklaracja

[php]
add_action( 'init’, 'moj_cpt’ );

function moj_cpt() {
$labels = array(
'name’ => __( 'Książki’, 'post type general name’ ),
'singular_name’ => __( 'Książka’, 'post type singular name’ ),
'add_new’ => __( 'Dodaj nową’ ),
'add_new_item’ => __( 'Dodaj nową książkę’ ),
'edit_item’ => __( 'Edytuj książkę’ ),
'new_item’ => __( 'Nowa książka’ ),
'view_item’ => __( 'Zobacz książkę’ ),
'search_items’ => __( Szukaj książki’ ),
'not_found’ => __( 'Nie znaleziono książki’ ),
'not_found_in_trash’ => __( 'Brak książek w koszu’ ),
'parent_item_colon’ => ”
);

// Create an array for the $args
$args = array(
'labels’ => $labels,
'public’ => true,
'publicly_queryable’ => true,
'show_ui’ => true,
'query_var’ => true,
'rewrite’ => true,
'capability_type’ => 'post’,
'has_archive’ => false,
'hierarchical’ => false,
'show_in_menu’ => true,
'menu_position’ =>5,
'supports’ => array( 'title’, 'editor’, 'author’, 'thumbnail’, 'excerpt’, 'comments’ )
);

register_post_type( 'ksiazka’, $args );
}
[/php]

W przypadku gdy powyższe piszemy w pliku [cci]functions.php[/cci], nie musimy się bawić w funkcje i akcje, wszystko działa wpisane bez tego. Omówienia może wymagać opcja [cci]rewrite[/cci], jako ta najczęściej zmieniana, reszta jest dość oczywista.

Co więc jest z tym rewrite?

Wartość [cci]false[/cci] oznacza, że nie stosujemy żadnych permalinków w przypadku tych wpisów. Jeżeli chcemy stosować permalinki, to parametrem będzie tablica z definicją permalinków. Najczęściej:

[php]
'rewrite’ => array(’slug’ => 'ksiazki’)
[/php]

Do tej tablicy można także dodać [cci]’feeds’ => true[/cci] aby włączyć RSS dla tego typu postów oraz [cci]’with_front’ => 'false'[/cci] aby usunąć z permalinka przedrostek do adresu wpisów (np. „/blog/”)

A pozostałe pozycje

One są dobrze objaśnione w dokumentacji. Wspomnę tu jeszcze tylko, że[cci]’has_archive'[/cci] z premedytacją ustawiłem na [cci]false[/cci]. Dlaczego? O tym w odcinku czwartym – już wkrótce.

Masz pytania, uważasz, że którąś część opisałem zbyt skrótowo lub, nie daj Boże, błędnie? Daj znać w komentarzach.

 

Podobne

W kategorii:WordPress Tagi:Custom post types

Komentarze

  1. SpeX napisał

    15 lipca 2013 o 01:57

    Co z pozostałymi częściami?

    Odpowiedz
    • Łukasz Jasiński napisał

      13 sierpnia 2013 o 21:39

      Będą

      Odpowiedz
  2. Dariusz napisał

    31 stycznia 2014 o 15:29

    http://example.pl/artykuly/ (wyświetla listę artykułów)
    http://example.pl/artykuly/test (wyświetla artykuł na single page)

    breadcrumb pokazuje
    example.pl » Artykuły » Biznes » test

    Biznes jest kategorią należącą do artykułów (Rodzic Artykuły)

    kiedy kliknę w kategorie Biznes niestety WordPress wywala mi błąd 404
    co jest nie tak?

    Odpowiedz
    • Łukasz Jasiński napisał

      2 lutego 2014 o 11:47

      A czy pozostałe kategorie działają? Problemem może być obsługa mod_rewrite przez serwer. Czasami także błąd powstaje po stronie WordPressa, wówczas odwiedzenie w kokpicie ustawienia->bezpośrednie odnośniki i kliknięcie ok rozwiązuje problem.

      Odpowiedz
      • Dariusz napisał

        2 lutego 2014 o 15:08

        rozwiązałem problem deklarując raz jeszcze w functions.php custom post type i użyć musiałem flush_rewrite_rules();

        add_action(’init’, 'artykuly_register_post_type’);
        function artykuly_register_post_type() {
        register_post_type(’artykuly’, array(
        'labels’ => array(
        'name’ => 'Artykuły’,
        'singular_name’ => 'Artykuły’,
        'add_new’ => 'Dodaj artykuł’,
        'edit_item’ => 'Edit artykuł’,
        'new_item’ => 'Nowe artykuły’,
        'view_item’ => 'View artykuł’,
        'search_items’ => 'Szukaj artykułu’,
        'not_found’ => 'Nie znaleziono artykułu’,
        'not_found_in_trash’ => 'No info found in Trash’
        ),
        'public’ => true,
        'supports’ => array(
        'title’,
        'editor’,
        'thumbnail’,
        'excerpt’
        ),
        'taxonomies’ => array(’category’, 'post_tag’) // this is IMPORTANT
        ));
        flush_rewrite_rules();
        }

        Kolejny problem to, że sporo funkcji NIE chodzi w custom post type. Przykładowo
        żeby wyświetlić kategorie jej id w normalnych typach wpisów wykonuje zapytanie:

        $current_cat=get_the_category();
        $current_category = $current_cat[0]->cat_ID;
        zwraca np „720”

        Natomiast ta wartość w custom post type daje zawsze wartość ostatniej kategorii z normal post type zwracajac 720
        a w panelu edytując kategorie widzę wyraźnie ze ma ID 766

        Musiałem użyć tricka innego zdeklarowałem coś takiego co przypadkiem znalazłem

        $categoryID = $cat; (to już dawało prawidłowe ID 766)

        potem przebiłem się czyś takim zupełnie bez sensu pusta pętla

        $loop = new WP_Query( array( 'post_type’ => 'artykuly’, 'cat’=>$categoryID,’posts_per_page’ => $per_page, 'paged’ => $cur_page ) );
        while ( $loop->have_posts() ) : $loop->the_post(); ?>

        i poniżej już działa to prawidłowo
        $current_cat_ad=get_the_category();
        $current_category_ad = $current_cat_ad[0]->cat_ID;

        nie rozumiem dlaczego funkcje które podaje codex (odnośnie custom_post_type) nie zawsze chodzą. Myślę, że wina tu stoi po stronie złej deklaracji w functions.php albo jest jeszcze coś innego na rzeczy, że muszę stosować dziwaczne obejścia. Jeżeli znasz ten problem dlaczego tak jest to czekam na informacje. Forum Polskiego WordPressa na 90% moich postów nie jest w stanie pomóc 🙂

        Odpowiedz
        • Łukasz Jasiński napisał

          2 lutego 2014 o 15:13

          Flush_rewrite_rules bardzo źle wpływa na wydajność strony. Jednokrotne wywołanie tej funkcji powinno wystarczyć (jest ona również wywoływana po odwiedzeniu ustawienia->bezpośrednie odnośniki). Polecam zakomentowanie tej funkcji w kodzie nie powinno nic zepsuć, a przyspieszy działanie strony.

          Odpowiedz
          • Dariusz napisał

            2 lutego 2014 o 17:58

            ok teraz już rozumiem działanie flusha, dzięki. Drugie moje pytanie pewnie się zlało z kodem. Poniżej wspomniałem co powtórzę raz jeszcze:

            Kolejny problem to, że sporo funkcji NIE chodzi w custom post type. Przykładowo
            żeby wyświetlić kategorie jej id w normalnych typach wpisów wykonuje zapytanie:

            $current_cat=get_the_category();
            $current_category = $current_cat[0]->cat_ID;
            zwraca np „720″

            Natomiast ta wartość w custom post type daje zawsze wartość ostatniej kategorii z normal post type zwracajac 720
            a w panelu edytując kategorie widzę wyraźnie ze ma ID 766

            Musiałem użyć tricka innego zdeklarowałem coś takiego co przypadkiem znalazłem

            $categoryID = $cat; (to już dawało prawidłowe ID 766)

            potem przebiłem się czyś takim zupełnie bez sensu pusta pętla

            $loop = new WP_Query( array( ‚post_type’ => ‚artykuly’, ‚cat’=>$categoryID,’posts_per_page’ => $per_page, ‚paged’ => $cur_page ) );
            while ( $loop->have_posts() ) : $loop->the_post(); ?>

            i poniżej już działa to prawidłowo
            $current_cat_ad=get_the_category();
            $current_category_ad = $current_cat_ad[0]->cat_ID;

            nie rozumiem dlaczego funkcje które podaje codex (odnośnie custom_post_type) nie zawsze chodzą. Myślę, że wina tu stoi po stronie złej deklaracji w functions.php albo jest jeszcze coś innego na rzeczy, że muszę stosować dziwaczne obejścia. Jeżeli znasz ten problem dlaczego tak jest to czekam na informacje. Forum Polskiego WordPressa na 90% moich postów nie jest w stanie pomóc 🙂

  3. Dev napisał

    9 stycznia 2016 o 22:06

    Jak znaleźć kolejne części?

    Odpowiedz

Leave a ReplyCancel reply

WP Core Contributions

View all 0 tickets on Trac.

Mastodon

Ostatnie wpisy

  • Do czego w roku 2025 może przydać się VPN
  • Kontenery z dostępem do Tailnetu
  • Remanent w LANie
  • Kolorowa kontrola wersji
  • Motyw wnuk – prezentacja na WordUp! Kalisz online.

Najnowsze komentarze

  • Jacek - Zakładanie darmowej domeny *.tk
  • Arek - Jak dodać swap do ubuntu
  • refy - Zakładanie darmowej domeny *.tk
  • bezrobotny niepełnosprawny magister - Darmowe domeny – one naprawdę istnieją
  • lucasyas - Jak Lenovo sobie leci…

Archiwa

  • marzec 2025
  • styczeń 2025
  • styczeń 2023
  • styczeń 2021
  • maj 2020
  • luty 2020
  • wrzesień 2018
  • lipiec 2018
  • wrzesień 2016
  • sierpień 2016
  • czerwiec 2016
  • styczeń 2016
  • wrzesień 2015
  • lipiec 2015
  • kwiecień 2015
  • marzec 2015
  • listopad 2014
  • wrzesień 2014
  • lipiec 2014
  • czerwiec 2014
  • maj 2014
  • luty 2014
  • grudzień 2013
  • październik 2013
  • wrzesień 2013
  • sierpień 2013
  • czerwiec 2013
  • maj 2013
  • marzec 2013
  • luty 2013
  • styczeń 2013
  • grudzień 2012
  • listopad 2012
  • październik 2012
  • wrzesień 2012
  • sierpień 2012
  • lipiec 2012
  • czerwiec 2012
  • maj 2012
  • kwiecień 2012
  • marzec 2012
  • luty 2012
  • styczeń 2012
  • grudzień 2011
  • listopad 2011
  • październik 2011
  • wrzesień 2011
  • sierpień 2011
  • czerwiec 2011
  • maj 2011
  • marzec 2011
  • luty 2011
  • styczeń 2011
  • grudzień 2010
  • listopad 2010
  • październik 2010
  • wrzesień 2010
  • sierpień 2010
  • lipiec 2010
  • czerwiec 2010
  • maj 2010
  • kwiecień 2010
  • marzec 2010

Kategorie

  • Android
  • Bez kategorii
  • Dla webmasterów
  • Facebook – prywatność i bezpieczeństwo
  • FAQ
  • Homelab
  • Homelab
  • Komputery
  • LJPL Armored robots.txt
  • Marketing
  • Polityka
  • SEO
  • Thanks God it’s Friday
  • TraktTV Wordpress Widget
  • TraktTV Wordpress Widget @en
  • Twitter Diary
  • ubuntu
  • WordPress
  • Wystąpienia i prezentacje

Meta

  • Zaloguj się
  • Kanał wpisów
  • Kanał komentarzy
  • WordPress.org

Tagi

*.tk .htaccess android Apache apple bezpieczeństwo blog chrome darmowe domeny e-mail facebook firefox git gmail google google analytics Google apps google docs Google drive google logo hasła instagram kernel microsoft mysql PHP piractwo plugin prywatność przekierowanie rich snippet seo serp spam ssh swap twitter ubuntu VMware webmaster windows wordcamp wordpress youtube

Najnowsze komentarze

  • Jacek - Zakładanie darmowej domeny *.tk
  • Arek - Jak dodać swap do ubuntu
  • refy - Zakładanie darmowej domeny *.tk
  • bezrobotny niepełnosprawny magister - Darmowe domeny – one naprawdę istnieją
  • lucasyas - Jak Lenovo sobie leci…

Obserwuj mnie na Twitterze

My Tweets

Copyright © 2025 · ljasinskipl-genesis on Genesis Framework · WordPress · Zaloguj się

Ta strona korzysta z ciasteczek w celach statystycznych oraz dla wyświetlania reklam. Jeżeli nie wyrażasz na to zgody, możesz to zmienić korzystając z ustawień swojej przeglądarki internetowej. Akceptuję
Privacy & Cookies Policy

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary
Always Enabled
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Non-necessary
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.
SAVE & ACCEPT