( Uwaga moderatorów: tytuł pierwotnie brzmiał „Jak dodać„ Edytory strony ”i / lub„ Atrybuty strony> Szablon ”do edytora POSTS”)
WP obecnie pozwala na przypisanie „szablonu” do stron (tj post_type=='page'
.) Chciałbym rozszerzyć tę funkcjonalność również na posty (tj post_type=='post'
.)
Jak mogę dodać meta box „Atrybuty strony” , a dokładniej przełącznik szablonów do edytora postów?
Zakładam, że to kod, który umieszczę w functions.php
moim temacie.
AKTUALIZACJA: Udało mi się dodać menu rozwijane szablonów na stałe do mojego edytora postów, po prostu dodając pole wyboru HTML do mojego istniejącego niestandardowego okna opcji meta. Oto kod, którego używam do tego ...
add_meta_box('categorydiv2', __('Post Options'), 'post_categories_meta_box_modified', 'post', 'side', 'high');
A oto funkcja, która wypisuje opcje i pole wyboru szablonu ...
//adds the custom categories box
function post_categories_meta_box_modified() {
global $post;
if( get_post_meta($post->ID, '_noindex', true) ) $noindexChecked = " checked='checked'";
if( get_post_meta($post->ID, '_nofollow', true) ) $nofollowChecked = " checked='checked'";
?>
<div id="categories-all" class="ui-tabs-panel">
<ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
<li id='noIndex' class="popular-category"><label class="selectit"><input value="noIndex" type="checkbox" name="chk_noIndex" id="chk_noIndex"<?php echo $noindexChecked ?> /> noindex</label></li>
<li id='noFollow' class="popular-category"><label class="selectit"><input value="noFollow" type="checkbox" name="chk_noFollow" id="chk_noFollow"<?php echo $nofollowChecked ?> /> nofollow</label></li>
</ul>
<p><strong>Template</strong></p>
<label class="screen-reader-text" for="page_template">Post Template</label><select name="page_template" id="page_template">
<option value='default'>Default Template</option>
<option value='template-wide.php' >No Sidebar</option>
<option value='template-salespage.php' >Salespage</option>
</select>
</div>
<?php
}
I na koniec kod do przechwytywania wybranych wartości przy zapisie ...
function save_post_categories_meta($post_id) {
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id;
$noIndex = $_POST['chk_noIndex'];
$noFollow = $_POST['chk_noFollow'];
update_post_meta( $post_id, '_noindex', $noIndex );
update_post_meta( $post_id, '_nofollow', $noFollow );
return $post_id;
}
Teraz wierzę, że wszystko, co zostało, to (1) przechwycenie wybranego szablonu i dodanie go do meta postu dla tego postu oraz (2) modyfikacja index.php i single.php, aby używał wybranego szablonu.
źródło
Odpowiedzi:
Nienawidzę być nosicielem złych wiadomości, ale WordPress zakoduje na stałe funkcjonalność szablonu strony na typ postu „stronicowego” , przynajmniej w wersji 3.0 (co może się zmienić w przyszłych wersjach, ale nie ma konkretnej inicjatywy, o której istnieniu wiem, aby to zmienić jeszcze. Więc to jeden z niewielu razy, kiedy próbuję wymyślić, jak obejść coś bez rąbania rdzenia.)
Rozwiązaniem, które wymyśliłem, jest w zasadzie skopiowanie odpowiedniego kodu z rdzenia WordPress i zmodyfikowanie go do naszych potrzeb. Oto kroki (numery linii pochodzą z wersji 3.0.1):
Skopiuj
page_attributes_meta_box()
funkcję z wiersza 535/wp-admin/includes/meta-boxes.php
i zmodyfikuj odpowiednio.Kod
add_meta_boxes
haka, aby dodać metaboks utworzony w # 1.Skopiuj
get_page_templates()
funkcję z wiersza 166/wp-admin/includes/theme.php
i zmodyfikuj w celu dopasowania.Skopiuj
page_template_dropdown()
funkcję z wiersza 2550/wp-admin/includes/template.php
i zmodyfikuj w celu dopasowania.Dodaj szablon posta do swojego motywu.
Kod
save_post
haka, aby umożliwić zapisywanie nazwy pliku szablonu postu po zapisaniu.Kod
single_template
haka, aby umożliwić ładowanie szablonu postu dla powiązanych postów.Teraz z tym!
1. Skopiuj
page_attributes_meta_box()
funkcjęNaszym pierwszym krokiem jest skopiowanie
page_attributes_meta_box()
funkcji z wiersza 535/wp-admin/includes/meta-boxes.php
i postanowiłem ją zmienićpost_template_meta_box()
. Ponieważ poprosiłeś tylko o szablony stron, pominąłem kod określający post nadrzędny i określający kolejność, co znacznie upraszcza kod. Zdecydowałem się również użyć do tego postmeta, niż próbować ponownie użyćpage_template
właściwości obiektu, aby uniknąć potencjalnych niezgodności spowodowanych przypadkowym sprzężeniem. Oto kod:2. Kod
add_meta_boxes
hakNastępnym krokiem jest dodanie metaboksu za pomocą
add_meta_boxes
haka:3. Skopiuj
get_page_templates()
funkcjęZakładałem, że sensowne byłoby jedynie rozróżnienie między szablonami strony a szablonem postu, dlatego potrzeba
get_post_templates()
funkcji opartej naget_page_templates()
linii 166 z/wp-admin/includes/theme.php
. Ale zamiast używaćTemplate Name:
znacznika, którego szablony stron używają, ta funkcja używaPost Template:
znacznika, który można zobaczyć poniżej.Odfiltrowałem też inspekcję
functions.php
(nie jestem pewien, jak toget_page_templates()
działało bez tego poprawnie, ale cokolwiek!). Pozostało mi tylko zmienić odniesienia do tego słowa wpage
celupost
zapewnienia czytelności konserwacji na drodze:4. Skopiuj
page_template_dropdown()
funkcjęPodobnie skopiuj
page_template_dropdown()
z linii 2550,/wp-admin/includes/template.php
aby utworzyćpost_template_dropdown()
i po prostu zmień go na wywołanieget_post_templates()
zamiast:5. Dodaj szablon posta
Następnym krokiem jest dodanie szablonu postu do testowania. Za pomocą
Post Template:
znacznika wymienionego w kroku 3 skopiujsingle.php
z motywusingle-test.php
i dodaj następujący nagłówek komentarza ( pamiętaj, aby coś zmodyfikować,single-test.php
aby można było powiedzieć, że ładuje się zamiastsingle.php
) :Po wykonaniu kroków od 1 do 5 na stronie edytora postów pojawi się metaboks „Szablony postów ” :
(źródło: mikeschinkel.com )
6. Kod
save_post
hakTeraz, gdy edytor jest wyrównany, musisz zapisać nazwę pliku szablonu strony na postmeta, gdy użytkownik kliknie „Publikuj”. Oto kod do tego:
7. Zakoduj
single_template
hakI wreszcie, musisz faktycznie przekonać WordPressa do korzystania z nowych szablonów postów. Robisz to, przechwytując
single_template
i zwracając żądaną nazwę szablonu dla tych postów, do których przypisano jeden:I o to chodzi!
UWAGA , że nie bierze pod uwagę niestandardowe typy post , tylko
post_type=='post'
. Moim zdaniem adresowanie niestandardowych typów postów wymagałoby rozróżnienia między różnymi typami postów i chociaż nie było to zbyt trudne, nie próbowałem tego tutaj.źródło
Wordpress pozwala dodawać Meta do kategorii za pomocą wtyczki:
Aby to zrobić, musisz dodać jedno z różnych rozszerzeń, które dodają meta do kategorii (naśladując, które strony wychodzą z pudełka), Simple Term Meta robi to dobrze.
Uwaga: WordPress 3.x jest potrzebny do rozszerzenia kategorii.
Następnie możesz użyć:
Użyj Functions.php, aby dodać metody do robienia tego, co chcesz, np
Wywoływanie nowych pól w motywach jest łatwe:
Więcej szczegółów i przykładów: http://www.wphub.com/adding-metadata-taxonomy-terms/
źródło