Древесина предназначена для расширения и настройки в соответствии с вашим вариантом использования.
Вы можете создать собственный класс, расширяющий Timber\Post
, и написать свои собственные методы для извлечения данных из API по мере необходимости.
<?php
class CustomPost extends \Timber\Post {
/* not necessary, this just caches it */
private $myCustomContent;
/* override Timber\Post::content */
public function content(){
/* if we've fetched it from the API this request, return the result */
if ( $this->myCustomContent ) return $myCustomContent;
/* otherwise fetch it, then return the result */
return $this->fetchCustomContent();
}
/* function to fetch from external API */
private function fetchCustomContent(){
/* whatever the API call is here.. */
$result = wp_remote_post....
/* maybe some error handling or defaults */
/* cache it on the object's property we setup earlier */
$this->myCustomContent = $result->content;
return $this->myCustomContent;
}
}
Теперь для использования нашего пользовательского класса у нас есть два варианта. Мы можем вручную решить, когда использовать его, указав его в качестве второго аргумента в нашем PostQuery()
<?php
/* Note: Passing in 'null' as the first argument timber uses the global / main WP_Query */
$items = new PostQuery( null, CustomPost::class );
/* This examples is a custom query (not the global / main query ) */
$args = [
'post-type' => 'my-custom-post-type',
// etc etc
];
$items = new PostQuery( $args, CustomPost::class );
/* Each Post in $items will be the class CustomPost instead of Timber\Post */
Если ваши пользовательские классы сообщений соответствуют определенному типу сообщений, вы можете использовать Карту классов древесины, чтобы всегда возвращать соответствующий пользовательский класс сообщений.
<?php
/* functions.php or similar */
add_filter( 'Timber\PostClassMap', 'my_func_modify_class_map' );
function( $classMap ){
$classMap['my-custom-post-type'] = CustomPost::class;
return $classMap;
}
/* index.php or xxx.php template file... */
$args = [
'post-type' => 'my-custom-post-type',
// etc etc
];
/* No second argument needed */
$items = new PostQuery( $args );
/* Each Post in $items will be the class CustomPost instead of Timber\Post */
Надеюсь, это поможет!