Intereting Posts
Как использовать переходный процесс внутри WP_User_Query Условная кнопка Получить идентификатор категории из почтового идентификатора настраиваемого типа сообщения Пользовательская конечная точка WooCommerce для моей учетной записи Пользовательские сортируемые мета-ящики Какие пакеты jQuery включены в WordPress 3.1.2? WordPress Query orderby title с строкой UTF8 в заголовке Проверьте, имеет ли почта определенный тип сообщения Что такое множественное число WordPress? Упорядочить темы BBpress Иерархия пользовательских сообщений? (Государство / Город / ресторан) Плагин WordPress Multisite «MU Domain Mapping» – автоматическое сопоставление – cPanel – Inmotion WordPress Hosting Смогу ли я потерять страницы, которые я создал в теме WordPress по умолчанию при добавлении новой темы? WP4.8.3: PHP Неустранимая ошибка: Макс. Время выполнения в 2 разных файлах (графический редактор) Разрешить роль удалять сообщения, но заблокировать его wp-admin

Перенести самодельные настраиваемые поля functions.php в расширенные пользовательские поля

Недавно я взял сайт WordPress, который нуждается в серьезном ремонте. Предыдущий разработчик сам создал собственные поля в functions.php. Я серьезно выступаю за расширенные пользовательские поля, мощность этого плагина намного превосходит мощь настраиваемых пользовательских полей.

Мой план состоит в том, чтобы попытаться найти выход из передачи данных из текущих пользовательских полей в поля acf. Это будет очень утомительная работа, если я не смогу найти способ автоматизации процесса, моя первая мысль – редактировать таблицы SQL, но хотелось бы знать, сталкивался ли кто-либо с аналогичной проблемой раньше?

Ниже вы можете увидеть пример того, как настраиваемые поля закодированы в функции functions.php (очень уродливый метод imo)

if ( !class_exists('myCustomFieldsgeneral') ) { class myCustomFieldsgeneral { /** * @var string $prefix The prefix for storing custom fields in the postmeta table */ var $prefix = '_mcf_'; /** * @var array $customFields Defines the custom fields available */ var $customFields = array( array( "name" => "seoblock", "title" => "Block This Page From Search Engines", "description" => "If this page is purely for PPC or serves no purpose on the organic site, please select yes.", "options" => array("Yes","No"), "type" => "select", "scope" => array( "post", "page" ), "capability" => "edit_posts" ), ); /** * PHP 4 Compatible Constructor */ function myCustomFieldsgeneral() { $this->__construct(); } /** * PHP 5 Constructor */ function __construct() { add_action( 'admin_menu', array( &$this, 'createCustomFieldsgeneral' ) ); add_action( 'save_post', array( &$this, 'saveCustomFieldsgeneral' ), 1, 2 ); } /** * Remove the default Custom Fields meta box */ function removeDefaultCustomFields( $type, $context, $post ) { foreach ( array( 'normal', 'advanced', 'side' ) as $context ) { remove_meta_box( 'postcustom', 'post', $context ); remove_meta_box( 'postcustom', 'page', $context ); //Use the line below instead of the line above for WP versions older than 2.9.1 //remove_meta_box( 'pagecustomdiv', 'page', $context ); } } /** * Create the new Custom Fields meta box */ function createCustomFieldsgeneral() { if ( function_exists( 'add_meta_box' ) ) { add_meta_box( 'my-custom-fields-general', 'General Information', array( &$this, 'displayCustomFieldsgeneral' ), 'page', 'normal', 'high' ); add_meta_box( 'my-custom-fields-general', 'General Information', array( &$this, 'displayCustomFieldsgeneral' ), 'post', 'normal', 'high' ); } } /* --------- Display the new Custom Fields meta box --------- */ function displayCustomFieldsgeneral() { global $post; ?> <div class="form-wrap"> <?php wp_nonce_field( 'my-custom-fields-general', 'my-custom-fields-general_wpnonce', false, true ); foreach ( $this->customFields as $customField ) { // Check scope $scope = $customField[ 'scope' ]; $output = false; foreach ( $scope as $scopeItem ) { switch ( $scopeItem ) { case "post": { // Output on any post screen if ( /*basename( $_SERVER['SCRIPT_FILENAME'] )=="post-new.php" ||*/ $post->post_type=="post" ) $output = true; break; } case "page": { // Output on any page screen if ( /*basename( $_SERVER['SCRIPT_FILENAME'] )=="page-new.php" ||*/ $post->post_type=="page" ) $output = true; break; } case "go page": { // Output on any page screen if ( /*basename( $_SERVER['SCRIPT_FILENAME'] )=="post.php" &&*/ $post->post_title=="go" ) $output = true; break; } case "go2 page": { // Output on any page screen if ( /*basename( $_SERVER['SCRIPT_FILENAME'] )=="post.php" &&*/ $post->post_title=="go2" ) $output = true; break; } case "goc page": { // Output on any page screen if ( /*basename( $_SERVER['SCRIPT_FILENAME'] )=="post.php" &&*/ $post->post_title=="goc" ) $output = true; break; } case "gored page": { // Output on any page screen if ( /*basename( $_SERVER['SCRIPT_FILENAME'] )=="post.php" &&*/ $post->post_title=="gored" ) $output = true; break; } case "landing page": { // Output on any page screen if ( /*basename( $_SERVER['SCRIPT_FILENAME'] )=="post.php" &&*/ $post->post_type=="Landing Page" ) $output = true; break; } case "confirmation page": { // Output on any page screen if ( /*basename( $_SERVER['SCRIPT_FILENAME'] )=="post.php" &&*/ $post->post_type=="Confirmation Page" ) $output = true; break; } } if ( $output ) break; } // Check capability if ( !current_user_can( $customField['capability'], $post->ID ) ) $output = false; // Output if allowed if ( $output ) { ?> <div class="form-field form-required <?php echo '' . $customField[ 'name' ] .'"';?> > <?php switch ( $customField[ 'type' ] ) { case "checkbox": { // Checkbox echo '<label for="' . $this->prefix . $customField[ 'name' ] .'"><strong>' . $customField[ 'title' ] . '</strong></label>&nbsp;&nbsp;'; foreach ( $customField['options'] as $option) { $preselected = get_post_meta( $post->ID, $this->prefix . $customField['name']); $selection = unserialize($preselected[0]);if (is_array($selection) && in_array($option,$selection)) echo '&nbsp;&nbsp;'.$option.': <input type="checkbox" name="' . $this->prefix . $customField['name'] . '[]" id="' . $this->prefix . $customField['name'] . '" value="'.$option.'" checked="checked" style="width: auto;" />'; else echo '&nbsp;&nbsp;'.$option.': <input type="checkbox" name="' . $this->prefix . $customField['name'] . '[]" id="' . $this->prefix . $customField['name'] . '" value="'.$option.'" style="width: auto;" />'; } break; } case "textarea" : { // Text area echo '<label for="' . $this->prefix . $customField[ 'name' ] .'"><strong>' . $customField[ 'title' ] . '</strong></label>'; echo '<textarea name="' . $this->prefix . $customField[ 'name' ] . '" id="' . $this->prefix . $customField[ 'name' ] . '" columns="30" rows="3">' . htmlspecialchars( get_post_meta( $post->ID, $this->prefix . $customField[ 'name' ], true ) ) . '</textarea>'; break; } case "radio" : { // Radio buttons echo '<label for="' . $this->prefix . $customField[ 'name' ] .'"><strong>' . $customField[ 'title' ] . '</strong></label>'; foreach ( $customField['options'] as $option) { $preselected = get_post_meta( $post->ID, $this->prefix . $customField['name']); if ($preselected[0] == $option) echo ''.$option.'<input type="radio" name="'.$this->prefix.$customField['name'].'" id="'.$this->prefix.$customField['name'].'" checked="checked" value="'.$option.'" /><br />'; else echo ''.$option.'<input type="radio" name="'.$this->prefix.$customField['name'].'" id="'.$this->prefix.$customField['name'].'" value="'.$option.'" /><br />'; } break; } case "select" : { // Select dropdown echo '<label for="' . $this->prefix . $customField[ 'name' ] .'"><strong>' . $customField[ 'title' ] . '</strong></label>'; echo '<select name="' . $this->prefix . $customField[ 'name' ] .'" id="' . $this->prefix . $customField[ 'name' ] .'">'; echo '<option value="">&nbsp;</option>'; foreach ( $customField['options'] as $option) { $preselected = get_post_meta( $post->ID, $this->prefix . $customField['name']); if ($preselected[0] == $option) echo '<option selected="selected" value="'.$option.'">'.$option.'</option>'; else echo '<option value="'.$option.'">'.$option.'</option>'; } echo '</select>'; break; } default: { // Plain text field echo '<label for="' . $this->prefix . $customField[ 'name' ] .'"><strong>' . $customField[ 'title' ] . '</strong></label>'; echo '<input type="text" name="' . $this->prefix . $customField[ 'name' ] . '" id="' . $this->prefix . $customField[ 'name' ] . '" value="' . htmlspecialchars( get_post_meta( $post->ID, $this->prefix . $customField[ 'name' ], true ) ) . '" />'; break; } } ?> <?php if ( $customField[ 'description' ] ) echo '<p>' . $customField[ 'description' ] . '</p>'; ?> </div> <?php } } ?> </div> <?php } /** * Save the new Custom Fields values */ function saveCustomFieldsgeneral( $post_id, $post ) { if ( !wp_verify_nonce( $_POST[ 'my-custom-fields-general_wpnonce' ], 'my-custom-fields-general' ) ) return; if ( !current_user_can( 'edit_post', $post_id ) ) return; if ( $post->post_type != 'page' && $post->post_type != 'post' && $post->post_type != 'Landing Page' && $post->post_type != 'Confirmation Page' ) return; foreach ( $this->customFields as $customField ) { if ( current_user_can( $customField['capability'], $post_id ) ) { if ( isset( $_POST[ $this->prefix . $customField['name'] ] ) ) { if (!is_array($_POST[$this->prefix . $customField[ 'name' ]])) update_post_meta( $post_id, $this->prefix . $customField[ 'name' ], $_POST[ $this->prefix . $customField['name'] ] ); else { $_POST[$this->prefix . $customField[ 'name' ]] = serialize($_POST[$this->prefix . $customField[ 'name' ]]); update_post_meta( $post_id, $this->prefix . $customField[ 'name' ], $_POST[ $this->prefix . $customField['name'] ] ); } } else delete_post_meta( $post_id, $this->prefix . $customField[ 'name' ] ); } } } } // End Class } // End if class exists statement 

Я в конце проекта точно так же, и это немного сложно, но это можно сделать.

  1. Используя плагин экспорта / импорта CSV (я пробовал несколько, но в конечном итоге с WP Ultimate CSV Importer) экспортировал текущие данные в файл CSV.
  2. Создайте настраиваемые поля, которые вы хотите использовать, чтобы заменить существующие поля.
  3. Создайте образец сообщения с новыми полями ACF.
  4. Экспортируйте эти данные в файл CSV.

Оттуда все, что вам нужно сделать, это сопоставление заголовков столбцов с новым CSV-файлом и вставка их в соответствующие заголовки старых столбцов данных. Эта часть была немного сложной, так как у меня была комбинация ACF и стандартных полей, но если вы правильно используете заголовки столбцов, она прекрасно работает.

Я тестировал импорт в MAMP, прежде чем попробовать его на реальном сайте. Как только вы выясните, что такое новые заголовки, импорт будет работать (почти) отлично.

Единственная проблема, с которой я столкнулся, состоит в том, что некоторые из столбцов изначально не отображаются в таблицах администратора (я все еще изучаю это, потому что объемное редактирование не исправляет его и с 3000 записей, вручную сохраняя каждый … nightmare ), но как только будет сохранено каждое сообщение, оно будет отображаться – данные появляются на странице администрирования, а при запросе из шаблонов это небольшая проблема.