Intereting Posts
Могу ли я настроить адрес электронной почты на контактную форму 7? Категория WordPress Разрывы строк </ br> меняются на <! – br -> при переходе между вкладками HTML и Visual! Переписать тип сообщения по умолчанию Запретить пользователя и завершить сеанс pre_get_posts с get_posts Недостатки, чтобы не использовать встроенный тип сообщений «Сообщения»? get_locale () ведет себя странно в том же файле functions.php Получить термины, содержащие сообщения, которые, в свою очередь, относятся к другим терминам? Как я могу проверить, есть ли на определенной странице сгенерированной плагином или дочернем Как получить настройки администратора для виджета при использовании the_widget () с пользовательским виджетами if выражение в запросе базы данных Как отрегулировать код, чтобы обновить раскрывающийся список с тегами, которые активны в отфильтрованном списке категорий Как разрешить доступ к одному файлу в корневом каталоге? Как правильно добавить таблицу в базу данных WordPress MySQL

Отображение информации из настраиваемого поля в настраиваемом типе сообщений

У меня есть видеоролики, созданные как пользовательский тип сообщения и музыка, коммерческие, промо-роли, созданные как категории в этом типе сообщений:

У меня есть функция, которая отображает пользовательский мета-поле на страницах типа публикации видео в конце WordPress. Пользователь может ввести идентификатор видео с YouTube или идентификатор видеоизображения vimeo – wordpress, а затем отображает видео для идентификатора на странице пользовательского типа сообщений. Когда пользователь добавляет новое сообщение в тип персонализированного видео и назначает его любой из категорий, которые я указываю, я хочу, чтобы wordpress отображал разные видео. Код, который у меня есть на данный момент, не выполняет то, что я хочу, потому что он отображает одно и то же видео в каждом сообщении, даже если идентификатор не указан на некоторых из них. Например, на странице музыкальной записи я присвоил ей музыку категории и поместил идентификатор видео Vimeo, который отображается на передней панели, но затем одно и то же видео отображается для промо и рекламы, и я не хочу, чтобы это произошло. В цикле у меня есть это (в single-videos.php):

<?php $args = array( 'post_type' => 'videos', 'posts_per_page' => 20, 'orderby' => 'date', 'order' => 'ASC' ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); //$args = array( 'post_type' => 'videos', 'posts_per_page' => 20, 'orderby' => 'date', 'order' => 'ASC' ); $ytubeID = get_post_meta($post->ID, '_youtubeID', true); $vimID = get_post_meta($post->ID, '_vimeoID', true); if ($ytubeID || $vimID){ if ($ytubeID){ echo '<iframe title="YouTube video player" class="youtube-player" type="text/html" src="http://www.youtube.com/embed/'.$ytubeID.'" allowfullscreen="true" frameborder="0" width="640" height="390">'; echo '</iframe>'; } elseif ($vimID){ echo '<br />'; echo '<iframe src="http://player.vimeo.com/video/'.$vimID.'" width="640" height="390" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>'; }//end if yutbeID or vimIDthe_excerpt(); //excerpt added for information } endwhile; wp_reset_query(); ?> 

Ниже приведена полная функция, которая создает мета-поле и сохраняет информацию:

 // Create the Video Information Meta Box by hooking into the admin menu for a post add_action('admin_menu', 'video_add_box'); //Function call by the "add_action" to tell it what to add, "video_information" and where "post" function video_add_box(){ add_meta_box('video_information', 'Video Information', 'video_information', 'videos', 'normal', 'high'); } //function to populate the meta box added above function video_information(){ global $post; // Noncename needed to verify where the data originated echo '<input type="hidden" name="video_noncename" id="video_noncename" value="' . wp_create_nonce( plugin_basename(__FILE__) ) . '" />'; //adds the custom field _youtubeID plus some other stuff $youtubeID = get_post_meta($post->ID, '_youtubeID', true); if ( empty($youtubeID) ) { $youtubeID = ''; } //adds the custom field _vimeoID $vimeoID = get_post_meta($post->ID, '_vimeoID', true); if ( empty($vimeoID) ) { $vimeoID = ''; } //add the box echo '<br />'; echo '<strong>Youtube ID:</strong> <input type="text" name="_youtubeID" value="' . $youtubeID . '" size="20" maxlength="30" />'; echo '<br />'; echo '<strong>Vimeo ID:</strong> <input type="text" name="_vimeoID" value="' . $vimeoID . '" size="20" maxlength="30" />'; echo '<br />'; } //end video_information function //save_video_meta is called below with the action "save_post" and saves your IDs to the post function save_video_meta($post_id, $post) { // verify this came from the our screen and with proper authorization, // because save_post can be triggered at other times if ( !wp_verify_nonce( $_POST['video_noncename'], plugin_basename(__FILE__) )) { return $post->ID; } // Is the user allowed to edit the post or page? if ( !current_user_can( 'edit_post', $post->ID )){ return $post->ID; } $video_meta['_youtubeID'] = $_POST['_youtubeID']; $video_meta['_vimeoID'] = $_POST['_vimeoID']; foreach ($video_meta as $key => $value) { // Cycle through the $video_meta array if( $post->post_type == 'revision' ) return; // Don't store custom data twice $value = implode(',', (array)$value); // If $value is an array, make it a CSV if(get_post_meta($post->ID, $key, FALSE)) { // If the custom field already has a value update_post_meta($post->ID, $key, $value); } else { // If the custom field doesn't have a value add_post_meta($post->ID, $key, $value); } if(!$value) delete_post_meta($post->ID, $key); // Delete if blank }//endforeach video meta } //end save_video_meta //save the video custom fields add_action('save_post', 'save_video_meta', 1, 2); 

Solutions Collecting From Web of "Отображение информации из настраиваемого поля в настраиваемом типе сообщений"

Я думаю, что вы передаете неправильное значение идентификатора сообщения функции get_post_meta() . Попробуй это:

 $ytubeID = get_post_meta(get_the_ID(), '_youtubeID', true); $vimID = get_post_meta(get_the_ID(), '_vimeoID', true); 

Примечание. Поскольку вы используете новый экземпляр WP_Query, вам не нужен wp_reset_query(); , используйте wp_reset_postdata(); вместо.

Пока вы не добавите полный код, который вы используете для хранения значения настраиваемых полей, я просто могу сказать, что вы передаете снова неправильное значение идентификатора сообщения для update_post_meta() и delete_post_meta() . Обычно, post ID передается в функцию возврата функции сохранения, а $ post-> ID ошибочен (также неверно проверка $ post-> post_type, которую вы делаете). Вы также передаете второй параметр для обратного вызова сохранения, но ответ на сохранение только принимает один параметр. Попробуйте что-нибудь вроде:

 add_action( 'save_post', 'my_save_postdata' ); function my_save_postdata($post_id){ $video_meta['_youtubeID'] = $_POST['_youtubeID']; $video_meta['_vimeoID'] = $_POST['_vimeoID']; foreach ($video_meta as $key => $value) { // Cycle through the $video_meta array if( $_POST['post_type'] == 'revision' ) return; // Don't store custom data twice $value = implode(',', (array)$value); // If $value is an array, make it a CSV if(get_post_meta($post_id, $key, FALSE)) { // If the custom field already has a value update_post_meta($post_id, $key, $value); } else { // If the custom field doesn't have a value add_post_meta($post_id, $key, $value); } if(!$value) delete_post_meta($post_id, $key); // Delete if blank }//endforeach video meta } 

Вы можете сделать дальнейшие улучшения, но они выходят за рамки ответа, я даю пример, этот код:

  if(get_post_meta($post_id, $key, FALSE)) { // If the custom field already has a value update_post_meta($post_id, $key, $value); } else { // If the custom field doesn't have a value add_post_meta($post_id, $key, $value); } if(!$value) delete_post_meta($post_id, $key); // Delete if blank 

Возможно:

 if($value) { update_post_meta($post_id, $key, $value); } else { delete_post_meta($post_id, $key); // Delete if blank } 

Поскольку update_post_meta() проверяет, имеет ли пользовательское поле уже значение, и оно обновит его, и если в пользовательском поле не указано значение (ключ не существует), функция вызовет add_post_meta() .

Все вышесказанное в вашем коде:

 // Create the Video Information Meta Box by hooking into the admin menu for a post // Add the meta boxes in the add_meta_boxes action hook, no in admin menu add_action('add_meta_boxes', 'video_add_box'); //Function call by the "add_action" to tell it what to add, "video_information" and where "post" function video_add_box(){ add_meta_box('video_information', 'Video Information', 'video_information', 'videos', 'normal', 'high'); } //function to populate the meta box added above function video_information(){ global $post; // Noncename needed to verify where the data originated echo '<input type="hidden" name="video_noncename" id="video_noncename" value="' . wp_create_nonce( plugin_basename(__FILE__) ) . '" />'; //adds the custom field _youtubeID plus some other stuff $youtubeID = get_post_meta($post->ID, '_youtubeID', true); if ( empty($youtubeID) ) { $youtubeID = ''; } //adds the custom field _vimeoID $vimeoID = get_post_meta($post->ID, '_vimeoID', true); if ( empty($vimeoID) ) { $vimeoID = ''; } //add the box echo '<br />'; echo '<strong>Youtube ID:</strong> <input type="text" name="_youtubeID" value="' . $youtubeID . '" size="20" maxlength="30" />'; echo '<br />'; echo '<strong>Vimeo ID:</strong> <input type="text" name="_vimeoID" value="' . $vimeoID . '" size="20" maxlength="30" />'; echo '<br />'; } //end video_information function //save_video_meta is called below with the action "save_post" and saves your IDs to the post function save_video_meta($post_id) { // the $post parameter you wass passing has any effect, the save // action only accept one parameter. If you need all the post data beeing saved // you can access to the global $post_data; or to the superglobal $_POST // verify this came from the our screen and with proper authorization, // because save_post can be triggered at other times if ( !wp_verify_nonce( $_POST['video_noncename'], plugin_basename(__FILE__) )) { return $post->ID; } // Is the user allowed to edit the post or page? if ( !current_user_can( 'edit_post', $post->ID )){ return $post->ID; } $video_meta['_youtubeID'] = $_POST['_youtubeID']; $video_meta['_vimeoID'] = $_POST['_vimeoID']; foreach ($video_meta as $key => $value) { // Cycle through the $video_meta array if( $_POST['post_type'] == 'revision' ) return; // Don't store custom data twice $value = implode(',', (array)$value); // If $value is an array, make it a CSV if($value) { update_post_meta($post_id, $key, $value); } else { delete_post_meta($post_id, $key); // Delete if blank } }//endforeach video meta } //end save_video_meta //save the video custom fields add_action('save_post', 'save_video_meta', 1, 2); 

Просто напоминание : WordPress может обрабатывать большое количество внешних поставщиков видео, таких как youtube и vimeo. Просто вставьте URL-адрес видео в поле редактора, и он будет автоматически отображаться в интерфейсе. Кроме того, существует встроенная таксономия «post format», которая позволяет фильтровать сообщения по «видеоформату». Короче говоря, я считаю, что регистрация нового типа сообщений с пользовательскими мета-ящиками с единственной целью отображения сообщения «тип видео» вообще не требуется; вы можете добиться такой же функциональности, используя небольшой дополнительный код, используя встроенные функции.