Intereting Posts
Можно ли использовать WordPress в качестве онлайн-портфолио для текстового контента? Какую тему я бы искал? Как исключить события (пользовательские сообщения) из поиска, если дата начала уже прошла? как получить значения db без использования цикла с помощью wpdb-> get_results () методы do_action и hook Как я могу использовать пользовательские таксономии в этом сценарии? Использование короткого кода для отображения содержимого пользовательского мета-окна Удаление сайтов и пользователей автоматически в многопользовательском режиме Какова функция wp () в wp-blog-header.php Скрипт Enqueue: ссылка не работает в источнике страницы Многоуровневые сообщения в категориях в сети Переписать категорию результаты пользовательского поиска, затронутые набором _REQUEST Отображать пользовательскую таксономию типа сообщения и месяц Панель администратора ниже нижнего колонтитула в виде незакрепленного списка ссылок Нужны ли опции виджета, чтобы избежать экранов ()?

Пользовательские данные о забытых типах сообщений

Я просто настроил настраиваемый тип сообщения, в основном следуя этому руководству .

Сейчас я настраиваю вещи на своем сайте, выполняя множество модификаций CSS и т. Д., И каждые несколько минут сообщение просто забывает все, что находится в пользовательских мета-боксах.

Я уверен, что я сделал что-то не так в разделе add_action / update_post_meta, но я не знаю, что это такое, потому что я не совсем понимаю, что делает код.

В любом случае, вот что:

add_action('init', 'portfolio_register'); function portfolio_register() { $labels = array( 'name' => _x('My Portfolio', 'post type general name'), 'singular_name' => _x('Portfolio Item', 'post type singular name'), 'add_new' => _x('Add New', 'portfolio item'), 'add_new_item' => __('Add New Portfolio Item'), 'edit_item' => __('Edit Portfolio Item'), 'new_item' => __('New Portfolio Item'), 'view_item' => __('View Portfolio Item'), 'search_items' => __('Search Portfolio'), 'not_found' => __('Nothing found'), 'not_found_in_trash' => __('Nothing found in Trash'), 'parent_item_colon' => '' ); $args = array( 'labels' => $labels, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'query_var' => true, 'menu_icon' => get_stylesheet_directory_uri() . '/article16.png', 'rewrite' => true, 'capability_type' => 'post', 'hierarchical' => false, 'menu_position' => null, 'supports' => array('title','editor','thumbnail') ); register_post_type( 'portfolio' , $args ); } register_taxonomy("portfolio_cat", array("portfolio"), array("hierarchical" => true, "label" => "Categories", "singular_label" => "Category", "rewrite" => true)); add_action("admin_init", "admin_init"); function admin_init(){ add_meta_box("media_meta", "Media", "media_meta", "portfolio", "normal", "low"); add_meta_box("highlights_meta", "Highlights", "highlights_meta", "portfolio", "normal", "low"); add_meta_box("main_meta", "Main", "main_meta", "portfolio", "normal", "low"); add_meta_box("tabbed_meta", "Tabbed", "tabbed_meta", "portfolio", "normal", "low"); } function media_meta(){ global $post; $custom = get_post_custom($post->ID); $media_meta = $custom["media_meta"][0]; ?> <p><label>Media:</label><br /> <textarea cols="110" rows="5" name="media_meta"><?php echo $media_meta; ?></textarea></p> <?php } function highlights_meta(){ global $post; $custom = get_post_custom($post->ID); $highlights_meta = $custom["highlights_meta"][0]; ?> <p><label>Highlights:</label><br /> <textarea cols="110" rows="5" name="highlights_meta"><?php echo $highlights_meta; ?></textarea></p> <?php } function main_meta(){ global $post; $custom = get_post_custom($post->ID); $main_meta = $custom["main_meta"][0]; ?> <p><label>Main:</label><br /> <textarea cols="110" rows="5" name="main_meta"><?php echo $main_meta; ?></textarea></p> <?php } function tabbed_meta(){ global $post; $custom = get_post_custom($post->ID); $tabbed_meta = $custom["tabbed_meta"][0]; ?> <p><label>Tabbed:</label><br /> <textarea cols="110" rows="5" name="tabbed_meta"><?php echo $tabbed_meta; ?></textarea></p> <?php } add_action('save_post', 'save_details'); function save_details(){ global $post; update_post_meta($post->ID, "media_meta", $_POST["media_meta"]); update_post_meta($post->ID, "highlights_meta", $_POST["highlights_meta"]); update_post_meta($post->ID, "main_meta", $_POST["main_meta"]); update_post_meta($post->ID, "tabbed_meta", $_POST["tabbed_meta"]); } add_action("manage_posts_custom_column", "portfolio_custom_columns"); add_filter("manage_edit-portfolio_columns", "portfolio_edit_columns"); function portfolio_edit_columns($columns){ $columns = array( "cb" => "<input type=\"checkbox\" />", "title" => "Portfolio Title", "description" => "Description", "media_meta" => "Media", "highlights_meta" => "Highlights", "main_meta" => "Main", "tabbed_meta" => "Tabbed", "portfolio_cat" => "Portfolio Categories" ); return $columns; } function portfolio_custom_columns($column){ global $post; switch ($column) { case "description": the_excerpt(); break; case "media_meta": $custom = get_post_custom(); echo $custom["media_meta"][0]; break; case "highlights_meta": $custom = get_post_custom(); echo $custom["highlights_meta"][0]; break; case "main_meta": $custom = get_post_custom(); echo $custom["main_meta"][0]; break; case "tabbed_meta": $custom = get_post_custom(); echo $custom["tabbed_meta"][0]; break; case "portfolio_cat": echo get_the_term_list($post->ID, 'portfolio_cat', '', ', ',''); break; } } 

Solutions Collecting From Web of "Пользовательские данные о забытых типах сообщений"

В функции, подключенной к save_posts вы должны убедиться, что вы проверяете, что действие не было инициировано с помощью процедуры автоматического сохранения. Я подозреваю, что причина, по которой сообщение «забывает» данные, заключается в том, что почта автоматически сохраняет и обновляет пост-мета с пустыми данными.

Сделать это:

 function save_details($post_id){ //Make sure you check this isn't an autosave. if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; update_post_meta($post_id, "media_meta", $_POST["media_meta"]); update_post_meta($post_id, "highlights_meta", $_POST["highlights_meta"]); update_post_meta($post_id, "main_meta", $_POST["main_meta"]); update_post_meta($post_id, "tabbed_meta", $_POST["tabbed_meta"]); } 

Я быстро взглянул на учебник. Кажется, что он игнорирует передовую практику и проверки безопасности, такие как:

  1. Функция, привязанная к save_posts , получает аргумент $post_id (идентификатор сообщения). Вы должны использовать эту, а не global $post .
  2. Префикс ваших функций . save_details очень общий, и если ядро ​​WordPress или другое плагин использует это имя функции, это приведет к сбою вашего блога. Это особенно важно для разработчиков плагинов. Префикс с чем-то уникальным: my_name_save_details . То же самое касается других функций.
  3. Проверьте права пользователей. Используйте current_user_can чтобы проверить, разрешено ли пользователю редактировать сообщение.
  4. Использует nonces. В вашем метабоксе добавьте nonce и проверьте его в my_name_save_details . Это проверяет, что данные, которые вы добавляете в свою базу данных, действительно пришли из вашего метаболизма ( см. Codex )
  5. Выполните другие проверки. save_posts срабатывает каждый раз, когда сообщение или страница сохраняется или обновляется, но вы действительно хотите изменять записи своего настраиваемого типа сообщений. Это не важно, но устраняет возможность сбоев дальше по линии. Вы можете использовать get_post_type чтобы помочь с этим.

Ответ от Стивена Харриса превосходный, но показывает, что катание ваших собственных дружественных пользовательских полей может быть настоящей болью. Чтобы сделать вещи надежно и надежно, вам нужно держать руку WordPress совсем немного. Я сохраню свой рассказ о том, как WordPress должен делать многие из этих вещей по умолчанию. Вместо этого я укажу вам на плагин Advanced Custom Fields, который поможет вам в этом вопросе.

Плагин имеет хорошую документацию для каждого из различных типов предоставленных полей и удобные фрагменты кода для получения данных и их шаблонов .

Лучше всего, это бесплатно для всего, на что вы пытаетесь его использовать.

Этот плагин не идеален для каждого сайта, но это здорово, когда вы просто хотите добавить несколько дополнительных полей к настраиваемому типу сообщений.

Если вы заинтересованы в том, чтобы продолжить свои собственные дружественные пользовательские поля, я настоятельно рекомендую эту статью из журнала .net . Он просматривает проблемы, которые вы испытываете, и помог мне в прошлом.