Przez ostatnie kilka godzin szukałem sposobu na stworzenie niestandardowego szablonu strony z poziomu wtyczki, ale nie miałem jeszcze szczęścia.
To, co konkretnie próbuję zrobić, to dodać opcję do listy dostępnych szablonów stron podczas edytowania strony, a nie używając innej metody, takiej jakif( is_page( 'page-slug' ) ) { /* etc */ }
Czy istnieje zmienna globalna, którą mogę zmodyfikować, aby to zrobić?
Edytować:
Obecnie używam tego kodu, na podstawie linku @ m0r7if3r podanego w komentarzu, problem polega na tym, że uruchomi tę funkcję podczas przeglądania strony, ale nie podczas edycji strony (aby wypełnić listę rozwijaną szablonami stron) :
class JW_SiteGrader {
private static $instance;
private function __construct() {
add_action( 'template_redirect', array( &$this, 'sitegrader_template_redirect' ), 20 );
}
public static function getInstance() {
// Return the class data in a Singleton fashion
if (self::$instance == null)
self::$instance = new JW_SiteGrader();
return self::$instance;
}
public function sitegrader_template_redirect() {
add_filter( 'page_template', array( &$this, 'sitegrader_page_template' ), 10, 1 );
}
public function locate_plugin_template( $template_names, $load = false, $require_once = true ) {
if ( !is_array( $template_names ) )
return '';
$located = '';
$this_plugin_dir = WP_PLUGIN_DIR . '/' . str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );
foreach ( $template_names as $template_name ) {
if ( !$template_name )
continue;
if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) {
$located = STYLESHEETPATH . '/' . $template_name;
break;
} else if ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) {
$located = TEMPLATEPATH . '/' . $template_name;
break;
} else if ( file_exists( $this_plugin_dir . $template_name ) ) {
$located = $this_plugin_dir . $template_name;
break;
}
}
if ( $load && '' != $located )
load_template( $located, $require_once );
return $located;
}
public function sitegrader_page_template( $template ) {
$object = get_queried_object();
if ( 'page' == $object->post_type ) {
// New
$templates[] = "page-sitegrader.php";
// Like in core
$templates[] = "page-{$object->post_type}.php";
$templates[] = "page.php";
return locate_template( $templates );
}
// return apply_filters('page_template', $template);
return $template;
}
}
Edycja 2:
Wygląda na to, że ta funkcja zostanie wydana w przyszłej aktualizacji. Przeczytałem sporo biletów na ten temat i pojawiła się dyskusja, ale nie ma prawdziwej odpowiedzi (mam nadzieję na 3.4). Za chwilę wyświetli tutaj adresy URL biletów losowych.
Edycja 3:
Powyższy kod działa, ALE jedyny problem, jaki mam w tym momencie, to brak dodawania szablonu do listy rozwijanej podczas edycji / dodawania nowej strony. Próbuję kilku rzeczy i wkrótce zaktualizuję moje pytanie.
page_template
haka, powyższy kod w mojej edycji jest aktualnie używany. Czy muszę użyćtemplate_redirect
haka, a następnie dodać tampage_template
filtr?Odpowiedzi:
Filtry? Ktoś?
Nie ma tam żadnego filtra, który mógłby pomóc:
page_template_dropdown($template);
służy do budowania menu rozwijanego i nie można go filtrować.Skradanie się do tablicy szablonów?
Do budowania rozwijanej zawartości wykorzystuje główny meta-box
get_page_templates()
. Od wewnątrz funkcja wygląda następująco:Ale patrząc na
get_themes();
to, nie ma możliwości przechwycenia listy szablonów. Co więcej, mamy problem, że nie ma szans na uzyskanie szablonu spoza katalogu motywów…... Udawanie motywu!
Teoria i jej wady…
Możesz użyć,
register_theme_directory()
aby dodać dodatkowy katalog motywów, w którym możesz umieścić szablony. Najprościej byłoby więc zarejestrować swoją wtyczkę jako folder motywów:Uwaga: w tym miejscu nie jestem pewien, czy to zadziała .
Podczas aktywacji wtyczki: Następnie należy umieścić
style.css.php
plik wtemplates
folderze. Umożliwiłoby to dodanie zmiennych do pliku. Ta zmienna byłaby wówczas motywem nadrzędnym. Temat nadrzędny powinien być po prostu aktualnie aktywnym motywem. Następnie zaktualizuj aktywny motyw do wtyczki.Wada # 2: Informacje o interfejsie „Wygląd”… Może dodać notatkę, że ten „Motyw” nie jest przeznaczony do użycia jako rzeczywisty Motyw. Resztę »Unikaj aktywowania tego tematu« pozostawiam twojej wyobraźni. W każdym razie: Powinno działać.
Wada nr 2: ta sztuczka z powodzeniem pozwoli uniknąć tematów potomnych. Możesz mieć jeden motyw nadrzędny. Nic więcej.
źródło
Jako sugestię dotyczącą potencjalnego obejścia problemu, czy zastanawiałeś się nad użyciem systemu plików WordPress do napisania pliku szablonu strony z wtyczki do bieżącego aktywnego katalogu motywów? W zależności od tego, ile chcesz kontrolować tego procesu, wtyczka może zapisać plik podczas aktywacji i usunąć go podczas odinstalowywania. Alternatywnie można dynamicznie tworzyć pliki szablonów stron z poziomu interfejsu użytkownika wtyczki, używając formularza do przekazywania określonych wartości, takich jak nazwa szablonu strony, która ma się pojawiać w polu rozwijanym ekranu edycji postu. Teoretycznie możesz również usunąć szablon strony z interfejsu wtyczki jednym kliknięciem i podobnie dodać wiele szablonów do różnych celów. Na blogu Otto jest dobry post na temat korzystania z systemu plików. Nie mam teraz linku do mnie, ale możesz go wyszukać.
Mam nadzieję, że wydadzą to, co zamierzaliście zrobić, zahaczając o kolejne główne wydanie.
źródło
Przeszukałem źródło i dość szokująco nie ma na to sposobu! Sugerowałem, aby włamać się do dodania drugiego pola meta z rozwijanym nadpisaniem / drugim motywem. Następnie podłącz do tego filtra:
zwrócić plik motywu, jeśli został zastąpiony. Oczywiście, jeśli chcesz dodać post, chcesz dodać filtr.
Jeśli chcesz być fantazyjny, możesz zeskrobać oryginalne pudełko i ponownie je utworzyć (oczywiście za pomocą filtrów, nie modyfikując kodu podstawowego).
Sugeruję również dodanie biletu trac z prośbą o tę funkcjonalność (jeśli nie ma jeszcze takiego).
źródło
Udało mi się to w przeszłości, usuwając domyślny metaboks szablonu strony, a następnie dodając własny metaboks. Miałem nowy metaboks z wbudowanymi get_page_templates, a następnie dodałem inne, których potrzebowałem programowo. Po zapisaniu może zaktualizować szablon strony, podobnie jak Wordpress.
źródło
Sprawdź zaczep
theme_page_templates
używany przezget_page_templates
funkcję, filtr dodany od wersji 3.9 zaktualizowanej w 4.4:źródło
Wynik wyszukiwania z DuckDuckGo, dodając szablon strony wordpress, znalazł dla mnie odpowiedź na stronie wpmu.org zatytułowanej Samouczek szablonów niestandardowych szablonów WordPress .
Zasadniczo w katalogu motywów wp-content / themes / your-theme skopiuj istniejący szablon strony do nowej wybranej nazwy pliku php. Edytuj nowy plik, zwracając uwagę na zmianę magicznej wartości właściwości „Nazwa szablonu:” w komentarzu u góry pliku.
To było wszystko. Możliwe, że jest to funkcja, która zawiera pytanie po terminie. Używam WP 3.5 z motywem twenty_eleven.
Możliwe jest również, że istnieją czystsze sposoby rozszerzenia motywu. Takie zmiany mogą zostać zastąpione aktualizacjami motywu. Mea culpa.
źródło