Это потому, что content
еще не был записан на диск, когда вы выполняете копирование. Это происходит потому, что записи буферизуются и не всегда происходят сразу после вашего звонка file.write
. Чтобы убедиться, что содержимое записано на диск в данный момент, вы можете использовать file.flush
.
В вашем случае достаточно изменить код на:
def write_file(file_destination: str, content: bytes):
with tempfile.NamedTemporaryFile() as fp:
fp.write(content)
fp.flush()
shutil.copy(fp.name, file_destination)
. Для получения дополнительной информации о том, когда содержимое фактически записывается на диск, вы можете увидеть документацию io.BufferedWriter
[ 116]. Соответствующая часть:
Буфер будет записан в базовый объект RawIOBase при различных условиях, включая:
blockquote>
- , когда буфер становится слишком маленьким для всех ожидающих данных ;
- при вызове flush ();
- при запросе seek () (для объектов BufferedRandom);
- при закрытии или уничтожении объекта BufferedWriter.
]Следовательно, в вашем первом примере возможно, что он работает только иногда, потому что в те моменты контент, который вы пишете, превышает буфер и поэтому должен быть немедленно записан.
Ваш второй пример, напротив, работает, потому что, когда вы выходите из блока
with
, файл закрывается, и, следовательно, буфер должен быть очищен и записан на диск.
Присвоиться
select wp_posts.*, max(comment_date) as max_comment_date
from $wpdb->posts wp_posts
right join $wpdb->comments
on id = comment_post_id
group by ID
order by max_comment_date desc
limit 10
к некоторому переменному $query. Можно возиться с 10 или самим запросом. (Я не ниндзя оптимизации SQL.) Затем Ваш код посмотрит что-то как
<?php
$results = $wpdb->get_results($query) or die('!');
foreach ($results as $result):
?>
[insert template here]
<?php endforeach ?>
Этот шаблон покрыт большей глубиной Кодексом.
в качестве дополнения к ответу Хао Ляня, если вы используете следующий запрос:
select wp_posts.*,
coalesce(
(
select max(comment_date)
from $wpdb->comments wpc
where wpc.comment_post_id = wp_posts.id
),
wp_posts.post_date
) as mcomment_date
from $wpdb->posts wp_posts
order by mcomment_date desc
limit 10
Это смешивает в сообщениях, у которых еще нет комментариев, и сортирует их по post_date и max (comment_date).
Я думаю, что добавление функции max испортит ваши результаты. MySQL не собирается извлекать максимум из каждого. Он собирает максимум от полного набора. Вот запрос, который даст вам результаты:
select wp_posts.*, comment_date
from $wpdb->posts wp_posts
right join $wpdb->comments
on id = comment_post_id
group by ID
order by comment_date desc
limit 10
После этого, если вы хотите следовать соглашению WP, используйте это, а затем вы можете использовать функции, которые использует большинство ваших шаблонов (на основе цикла):
$results = $wpdb->get_results($query) or die('!');
foreach ($results as $post):
setup_postdata($post);
Код, предложенный Hao Lian, работает идеально, за исключением того, что мы должны добавить следующее предложение WHERE, чтобы избежать вытягивания POST с comment_count = 0
, эта ситуация вызвана спам-комментариями.
Предложение WHERE нужно добавить следующим образом:
WHERE comment_approved = '1' AND comment_type = '' AND post_password = ''
Полный код после добавления предложения where должен выглядеть следующим образом:
select wp_posts.*, max(comment_date) as comment_date
from wp_posts
right join wp_comments on id = comment_post_id
WHERE comment_approved = '1' AND comment_type = '' AND post_password = ''
group by ID
order by comment_date desc
limit 6