Упорядочивание Wordpress отправляет новым комментарием

Это потому, что 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 при различных условиях, включая:

  • , когда буфер становится слишком маленьким для всех ожидающих данных ;
  • при вызове flush ();
  • при запросе seek () (для объектов BufferedRandom);
  • при закрытии или уничтожении объекта BufferedWriter.
  • ]
blockquote>

Следовательно, в вашем первом примере возможно, что он работает только иногда, потому что в те моменты контент, который вы пишете, превышает буфер и поэтому должен быть немедленно записан.

Ваш второй пример, напротив, работает, потому что, когда вы выходите из блока with, файл закрывается, и, следовательно, буфер должен быть очищен и записан на диск.

5
задан sepehr 12 April 2010 в 11:42
поделиться

4 ответа

Присвоиться

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 ?>

Этот шаблон покрыт большей глубиной Кодексом.

7
ответ дан 18 December 2019 в 09:10
поделиться

в качестве дополнения к ответу Хао Ляня, если вы используете следующий запрос:

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).

2
ответ дан 18 December 2019 в 09:10
поделиться

Я думаю, что добавление функции 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);
0
ответ дан 18 December 2019 в 09:10
поделиться

Код, предложенный 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
1
ответ дан 18 December 2019 в 09:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: