Зарегистрировать полученные данные (не в базе данных) в Timber PostQuery - PullRequest
0 голосов
/ 19 апреля 2019

Я сейчас занимаюсь разработкой сайта, который использует Timber в Wordpress.Я использую API другого сайта для извлечения сообщений с другого сайта, чтобы они соответствовали текущему состоянию на этом сайте.Проблема в том, что я использую поле заголовка записи, чтобы получить правильный идентификатор из API.Это означает, что в базе данных не хранятся данные заголовка или содержимого.

Можно ли как-то зарегистрировать эти данные, чтобы объекты Timber PostQuery также правильно выбирали эти страницы?После этого я не могу получить доступ или изменить результат $result = new Timber\PostQuery(), так как эти поля защищены и являются частными.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

@ Стэн, это определенно случай края края края.Если вы можете получить то, что вам нужно, до идентификаторов WordPress, они могут быть отправлены прямо на PostQuery() ...

$result = new Timber\PostQuery(array(2342, 2661, 2344, 6345,));

Вы можете попробовать расширить класс PostQuery самостоятельно, чтобы проверить, является ли это пользовательской функциональностью.Вы можете обернуть его внутри, чтобы API, с которым вы в конечном итоге работали на верхнем уровне, был простым и понятным

0 голосов
/ 12 июня 2019

Древесина предназначена для расширения и настройки в соответствии с вашим вариантом использования.

Вы можете создать собственный класс, расширяющий 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 */

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...