WordPress как на ладони

Производительность и получение метаданных файла

Для постоянного отображения требуется выводить длительность включенного в пост видеоролика.
Используется И РАБОТАЕТ! следующая конструкция:

$key = "Somekey";
$contents = get_post_meta( $post->ID, $key, true );
$path = getcwd() . $contents;
//if ( file_exists( $path ) ) {
$meta = wp_read_video_metadata( $path );
echo $meta[ 'length_formatted' ];
//}

На закомменченую проверку внимание не обращайте.
То есть через кастомфилд получаем урл видео, скармливаем его wp_read_video_metadata и из полученного массива берем и выводим length_formatted

Логично? Да
Работает? Да!

ПРОБЛЕМА: на страницах с циклами постов это приводит к неприемлемым задержкам: 80 постов выводить почти минуту - неприемлемо.

Да, можно заморочиться и руками перелопатить 3000 постов, забив длительности в кастомфилд.

НО, не могли бы ув. специалисты посоветовать более простой путь?
Есть ли иной способ получить/вывести искомое, который не тормозил бы так немилосердно?

ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ из Query Monitor:
Page Generation Time
83.2411
2.3% of 3,600s limit

Peak Memory Usage
533,424 kB
12.8% of 4,182,016 kB limit

Database Query Time
0.1440

Database Queries
Total: 249

Object Cache
92.2% hit rate (8,027 hits, 682 misses)
External object cache not in use

0
pervect
5.2 года назад 13
  • 1
    campusboy4752 www.youtube.com/c/wpplus

    Добрый день. Такие данные сразу уже хранятся в метаданных вложения:

    $attachment = wp_get_attachment_metadata( 95 );
    print_r( $attachment );
    
    /*
    Выведет:
    Array
    (
    	[filesize] => 61429114
    	[mime_type] => video/mp4
    	[length] => 1375
    	[length_formatted] => 22:55
    	[width] => 1280
    	[height] => 720
    	[fileformat] => mp4
    	[dataformat] => quicktime
    	[audio] => Array
    		(
    			[dataformat] => mp4
    			[codec] => ISO/IEC 14496-3 AAC
    			[sample_rate] => 44100
    			[channels] => 2
    			[bits_per_sample] => 16
    			[lossless] => 
    			[channelmode] => stereo
    		)
    
    	[created_timestamp] => 1538981268
    )
    */

    Может такой способ подойдёт?

    pervect 5.2 года назад

    ПРАКТИЧЕСКИ РЕШЕНО!
    Остались некоторые доработки.

    Итак, с благодарностью взяв за основу Ваше предложение, столкнулся с необходимостью получать ИД вложения. Нашел решение в виде вот такой функции:

    // retrieves the attachment ID from the file URL
    function pippin_get_image_id($image_url) {
    	global $wpdb;
    	$attachment = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $image_url )); 
    		return $attachment[0]; 
    }

    Добавляется в functions.php . К сожалению, она работает от УРЛ, а не от пути.
    Окончательно код вывода длительности видео получился вот такой:

                $key = "MyKey";
    			$contents = get_post_meta( $post->ID, $key, true );
    			$image_url = 'https://example.com' . $contents;
    				$image_id = pippin_get_image_id($image_url);
    				$attachment = wp_get_attachment_metadata( $image_id );
    
    				echo $attachment [ 'length_formatted' ];
    

    Проблема с производительностью решилась.
    Огромное спасибо!

    К несчастью, УРЛ парсится не всегда, в отличие от пути. Если парсить путь, то без разницы какими китайскими знаками обозвали файл. Если парсить урл, то наличие служебных (нестандартных) символов блокирует парсинг.
    Если бы кто-то посоветовал как вместо УРЛ использовать путь, я был бы очень признателен.

    campusboy 5.2 года назад

    Ну у вас в коде какой ID используется? Код вообще в целом непонятный smile

    pervect 5.2 года назад

    Извините smile
    Попробую пояснить.

    Исторически сокращенный урл ролика отдается через кастомфилд и собственно в контенте поста видео нет.

    Первые две строки - получаем значение кастомфилда и третьей строкой преобразуем в урл. В исходном коде - преобразовывали в серверный путь к ролику.

    Далее - УРЛ передается в пипинг-гет-имидж (функцию, приведенную выше, которая по полученному урлу отдает ИД ролика).

    Далее, полученный ИД скармливаем гет аттачмент метадата и получаем искомое: отформатированную длительность,

    которую и выводим.

    Отсюда, используется ИД видеофайла, который получается парсингом УРЛ оного.
    Это работает почти идеально (пока в имени файла нет иероглифов).
    Суть доделки в том, чтобы парсить не УРЛ, а серверный путь.
    Думаю, это как-то можно сделать, доработав функцию. В моем понимании, что парсить урл, что парсить путь - равнобедренно, не так ли?..

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация