Wie kann ich den Namen eines benutzerdefinierten Beitragstyps sicher ändern?

19

Ich habe einen benutzerdefinierten Beitragstyp mit dem Namen "Portfolio" erstellt, möchte ihn jedoch in "Projekte" ändern. Was wären die genauen Schritte, die ich ausführen muss, um den Namen sicher zu ändern und zu verhindern, dass benutzerdefinierte Posts vom Typ "Posts" im Dashboard verschwinden?

Hinweis: Es gibt bereits Beiträge in portfolioso kann ich nicht nur das Gerät , portfoliomit projects.

/* Register Portfolio Post Type */
add_action('init', 'create_portfolio');

function create_portfolio() {

    $labels = array(
        'name' => __('Portfolio', 'post type general name'),
        'singular_name' => __('Project', 'post type singular name'),
        'add_new' => __('Add New', 'portfolio item'),
        'add_new_item' => __('Add New Project'),
        'edit_item' => __('Edit Project'),
        'new_item' => __('New Project'),
        'view_item' => __('View Project'),
        'search_items' => __('Search Projects'),
        '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,
        'rewrite' => true,
        'capability_type' => 'post',
        'hierarchical' => false,
        'menu_position' => null,
        'supports' => array('title','editor','thumbnail')
      ); 

    register_post_type( 'portfolio' , $args );
}

/* Register Skills Taxonomy */
register_taxonomy("Skills", array("portfolio"), array("hierarchical" => true, "label" => "Skills", "singular_label" => "Skill", "rewrite" => true));

/* Add Fields */
add_action("admin_init", "add_portfolio_fields");

function add_portfolio_fields(){
    add_meta_box("website_url", "Website URL", "website_url", "portfolio", "side", "low");
    add_meta_box("view_more", "View More", "view_more", "portfolio", "side", "low");
    add_meta_box("screenshot_name", "Screenshot Name", "screenshot_name", "portfolio", "side", "low");
    add_meta_box("thumbnail_name", "Thumbnail Name", "thumbnail_name", "portfolio", "side", "low");
    add_meta_box("thumbnail_alt", "Thumbnail Alt", "thumbnail_alt", "portfolio", "side", "low");
}

function website_url(){
    global $post;
    $custom = get_post_custom($post->ID);
    $website_url = $custom["website_url"][0];
    ?>
    <label>Website URL:</label>
    <input size="50" name="website_url" value="<?php echo $website_url; ?>" />
    <?php
}

function view_more() {
    global $post;
    $custom = get_post_custom($post->ID);
    $view_more = $custom["view_more"][0];
    ?>
    <label>View More:</label>
    <input size="50" name="view_more" value="<?php echo $view_more; ?>" />
    <?php
}

function screenshot_name() {
    global $post;
    $custom = get_post_custom($post->ID);
    $screenshot_name = $custom["screenshot_name"][0];
    ?>
    <label>Screenshot Name:</label>
    <input name="screenshot_name" value="<?php echo $screenshot_name; ?>" />
    <?php
}

function thumbnail_name() {
    global $post;
    $custom = get_post_custom($post->ID);
    $thumbnail_name = $custom["thumbnail_name"][0];
    ?>
    <label>Thumbnail Name:</label>
    <input name="thumbnail_name" value="<?php echo $thumbnail_name; ?>" />
    <?php
}

function thumbnail_alt() {
    global $post;
    $custom = get_post_custom($post->ID);
    $thumbnail_alt = $custom["thumbnail_alt"][0];
    ?>
    <label>Thumbnail Alt:</label>
    <input name="thumbnail_alt" value="<?php echo $thumbnail_alt; ?>" />
    <?php
}

add_action('save_post', 'save_portfolio_details');

function save_portfolio_details(){
    global $post;

    update_post_meta($post->ID, "website_url", $_POST["website_url"]);
    update_post_meta($post->ID, "view_more", $_POST["view_more"]);
    update_post_meta($post->ID, "screenshot_name", $_POST["screenshot_name"]);
    update_post_meta($post->ID, "thumbnail_name", $_POST["thumbnail_name"]);
    update_post_meta($post->ID, "thumbnail_alt", $_POST["thumbnail_alt"]);
}

/* Custom Columns */
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" => "Project Title",
        "description" => "Description",
    );

    return $columns;
}

function portfolio_custom_columns($column){
    global $post;

    switch ($column) {
        case "description":
        the_excerpt();
        break;
    }
}
Desi
quelle
Wie wäre es, nur die Etiketten zu ersetzen?
Bainternet
Nur die Etiketten? Ich weiß nicht genau, was du meinst, aber ich würde es vorziehen, es durchgehend gründlich zu ändern.
Desi

Antworten:

2

Wenn Sie noch keine Beiträge in Ihrem Portfolio haben.

Es wäre wirklich einfach. Benennen Sie alles mit "Portfolio" in "Projekte" um. Sie werden nichts verlieren und den Namen ändern.

Bearbeiten:

Verwenden Sie dieses Plugin http://wordpress.org/extend/plugins/ptypeconverter/ , um die aktuellen Beiträge sicher zu exportieren und in Ihren neuen benutzerdefinierten Beitragstyp zu importieren.

Die Schritte sind also:

1 Laden Sie das Plugin herunter und verwenden Sie es: http://wordpress.org/extend/plugins/ptypeconverter/

2 Kopieren Sie die "Portfolio" -Datei Ihres benutzerdefinierten Beitragstyps an einen sicheren Ort. Nennen Sie es zum Beispiel portfolio_post_typeBACKUP.php

3 Jetzt sind Sie sicher, wann diese Methode fehlschlägt. Sie können es wiederherstellen.

4 " Portfolio " in " Projekte " ändern

5 Importiere die Beiträge mit dem Plugin und der Bratsche!

Hoffe das klappt.

Wesley Cheung
quelle
Ah, sorry hätte es erwähnen sollen. Es gibt bereits viele Beiträge portfolio.
Desi
Ich habe die Antwort bearbeitet. Viel Glück!
Wesley Cheung
Dies ist ein fantastisches Plugin!
Realph
1
Dieses Plugin funktioniert nicht mehr richtig. Ich habe es versucht und es hat nicht alle 'alten' Beitragstypen geändert. Aber die MySQL-Lösung (Antwort von Will) funktioniert gut.
Honk31
Das Plugin wurde seit zwei Jahren nicht mehr aktualisiert.
rhand
18

Sie können dies auch direkt mit MySQL tun.

UPDATE `wp_posts`
SET 
    # Update the post_type column
    `post_type` = REPLACE(`post_type`,'name_of_old_post_type','name_of_new_post_type'),
    # Update the urls
    `guid` = REPLACE(`guid`,'name_of_old_post_type','name_of_new_post_type')
WHERE `post_type` = 'name_of_old_post_type'

Zwei Dinge zu beachten:

  1. Sie müssen alle Verweise auf diesen Beitragstyp in Ihrem Code aktualisieren (z. B. Vorlagen, CMB2-Definitionen oder Taxonomiedefinitionen).
  2. Wenn Sie Verweise auf diesen Beitragstyp wp_postmetain serialisierten Arrays gespeichert haben, möchten Sie kein einfaches UPDATE / REPLACE durchführen, da es diese in die Luft sprengt! Nun, es sei denn, die neue und die alte Zeichenfolge haben genau dieselbe Länge.
Wille
quelle
6

Erweitere Wills Antwort ein bisschen weiter ... und vor allem, wenn du es von deinem Plugin aus machst:

global $wpdb;
$old_post_types = array('old_type' => 'new_type');
foreach ($old_post_types as $old_type=>$type) {
    $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET post_type = REPLACE(post_type, %s, %s) 
                         WHERE post_type LIKE %s", $old_type, $type, $old_type ) );
    $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET guid = REPLACE(guid, %s, %s) 
                         WHERE guid LIKE %s", "post_type={$old_type}", "post_type={$type}", "%post_type={$type}%" ) );
    $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET guid = REPLACE(guid, %s, %s) 
                         WHERE guid LIKE %s", "/{$old_type}/", "/{$type}/", "%/{$old_type}/%" ) );
}

Die Änderung besteht hier darin, den alten Typ nicht direkt in der Guid zu ersetzen, sondern nur dann, wenn "post_type = old_type" oder "/ old_type /" vorhanden ist. Dadurch wird vermieden, dass aus Versehen gültige Butzen ersetzt werden. (z. B. ist Ihr benutzerdefinierter Beitragstyp Portfolio, und der Slug einer Seite enthält auch Portfolio.)

Eine andere Alternative ist, so etwas zu tun:

global $wpdb, $wp_rewrite;
foreach ($old_post_types as $old_type=>$type) {
    $q = 'numberposts=-1&post_status=any&post_type='.$old_type;
    $items = get_posts($q);
    foreach ($items as $item) {
        $update['ID'] = $item->ID;
        $update['post_type'] = $type;
        wp_update_post( $update );
    }
}
$wp_rewrite->flush_rules();

HTH!

Nirav Mehta
quelle
3

Verwenden Sie eine WordPress-Datenbankabfrage, aber vergessen Sie nicht die serialisierten Optionsdaten

Die Methode, die für mich funktioniert hat, war das Suchen und Ersetzen in der WordPress-Datenbank, wobei jedoch darauf geachtet wurde, dass dabei keine serialisierten Optionsdaten verloren gehen. Der beste Weg, den ich gefunden habe, ist die Verwendung des Dienstprogramms zum sicheren Suchen und Ersetzen von Datenbanken über Interconnect . SETFühren = REPLACE(Sie niemals eine Abfrage vom ,'old_post_type','new_post_type')Typ post_type durch, ohne zu wissen, was Sie tun. Andernfalls werden serialisierte Daten beschädigt , da sie eine Prüfsumme enthalten und nicht ordnungsgemäß deserialisiert werden können.

Lesen Sie den Abschnitt zu potenziellen Problemen, bevor Sie ihm blindlings folgen

Schritt 1 - Aktualisieren Sie Ihre Datenbank sicher mit neuem Namen

  1. Sichern Sie Ihre Datenbank, da die folgenden Änderungen das Potenzial haben, sie zu beschädigen.
  2. Laden Sie das Dienstprogramm zum sicheren Suchen und Ersetzen von Datenbanken von Interconnect / It herunter und entpacken Sie es
  3. füge das extrahierte Verzeichnis zu deiner Webroot hinzu (es funktioniert auch in Unterverzeichnissen)
  4. Navigieren Sie zum Verzeichnis, z. B .: /mywebsite.com/path/to/utility/directory/
  5. Angaben folgen. Klicken Sie auf "Trockenlauf", wenn Sie paronoid sind, um die Änderungen zu sehen (es gibt Hunderte, wenn Sie sogar ein paar Beiträge des geänderten Beitragstyps haben).
  6. Klicken Sie auf "Live Run", um die Änderungen zu übernehmen.
  7. Entfernen Sie das sichere Suchverzeichnis aus Ihrem WordPress-Verzeichnis, da es ein Sicherheitsproblem ist

Schritt 2 - Setzen Sie Ihre Permalinks zurück

Wenn Sie Permalinks verwenden, werden durch die Aktualisierungen Ihrer Datenbank die Weiterleitungen zu Ihren benutzerdefinierten Beitragstypen fehlerhaft. Es gibt jedoch eine einfache Lösung. Rufen Sie einfach die WordPress-Einstellungen / Permalinks auf und notieren Sie sich die aktuelle Einstellung (meine war "Postname"). Wechseln Sie dann wieder zur Standardeinstellung, klicken Sie auf "Speichern", kehren Sie zur vorherigen Einstellung zurück und speichern Sie erneut. Sie haben gerade Ihre Weiterleitungsprobleme behoben.

Schritt 3 - Benennen Sie die benutzerdefinierten Beitragstypvorlagen Ihres Themas um

Wenn Sie wie ich sind und benutzerdefinierte Beitragstypvorlagen erstellt haben, müssen Sie diese umbenennen, da Ihre benutzerdefinierten Beiträge sonst nicht mehr richtig aussehen. Gehen Sie einfach in Ihr Thema und suchen Sie nach einer Datei, deren Dateiname Ihren alten Beitragstyp enthält, und benennen Sie die Datei unter Verwendung Ihres neuen Beitragsnamens um. Zum Beispiel musste ich zu wechseln single-project-portfolio.php, single-before-after.phpals ich meinen Beitragstyp von project-portfoliozu änderte before-after.

Schritt 5 - Beliebigen Code aktualisieren

Führen Sie eine Dateisuche durch und ersetzen Sie sie für Ihren alten benutzerdefinierten Beitragstypnamen im Ordner "Design" und "Plugins". Für mich gab es mehrere benutzerdefinierte Shortcodes, die darauf beruhten, eine Entscheidung zu treffen, ob ich einen meiner benutzerdefinierten Beitragstypen verwende.

Alles testen

Mögliche Probleme (vor dem Starten dieses Verfahrens lesen)

Syndication-Probleme

Wenn Ihre benutzerdefinierten Beitragstypen syndiziert wurden, beachten Sie, dass durch das anfängliche Suchen und Ersetzen auch die Guids Ihrer Beiträge geändert werden, wodurch alle Abonnenten gezwungen werden, die alten Beiträge als neue zu betrachten. Ich musste mich damit nicht befassen, aber wenn nötig, sollten Sie die Tabellen, die das Dienstprogramm safesearch verarbeitet, manuell auswählen und dann alle nicht serialisierten Daten mit der folgenden Abfrage manuell aktualisieren:

SET `post_type` = REPLACE(`post_type`,'old_post_type','new_post_type')
WHERE `post_type` LIKE '%old_post_type%';
AndrewD
quelle
sehr ordentlich, dies alles aufzulisten. mit der Ausnahme, dass die SQL-Abfrage am Ende nicht vollständig ist, da Sie die Guid vergessen haben, diese aber in der Antwort von Wills aufgelistet sind. Außerdem würde ich nicht mitgehen WHERE 'post_type' LIKE '%old_post_type%', ich würde verwenden WHERE 'post_type' = 'old_post_type', da Ihr Weg auch einige andere Post-Typen verursachen könnte, zu ändern ..
Honk31
0

Ich habe nicht den Ruf, Kommentare abzugeben, daher werde ich dies hier einfügen. Das Beispiel von Will erweitern. Ich habe die LIKEs in "=" geändert und habe beide auf WHERE zeigen lassenpost_type

UPDATE `wp_posts`
    SET `guid` = REPLACE(`guid`,'old_post_type','new_post_type')
    WHERE `post_type` = 'old_post_type'    

UPDATE `wp_posts`
    SET `post_type` = REPLACE(`post_type`,'old_post_type','new_post_type')
    WHERE `post_type` = 'old_post_type'

Denken Sie auch daran, unter Admin> Einstellungen> Permalinks auf "Änderungen speichern" zu klicken. Andernfalls werden Ihre Links wahrscheinlich beschädigt.

Sie müssen auch alle Vorlagennamen für einzelne Posts bearbeiten.

Dies sollte alles sein, was Sie tun müssen.

Bullyen
quelle
0

Hier ist ein sehr einfacher Weg:

  1. Führen Sie den Wordpress-Exporter aus (Extras> Exportieren) - exportieren Sie nur den Beitragstyp, dessen Namen Sie ändern möchten
  2. Öffnen Sie die generierte XML-Datei und ersetzen Sie alle Erwähnungen des alten Post-Typ-Namens durch den neuen Namen (sowohl im Meta "custom_post_type" als auch im Permalink-Feld).
  3. Erstellen Sie Ihren neuen Beitragstyp mit demselben Namen wie in der bearbeiteten XML-Datei (behalten Sie jedoch den alten bei, falls dies fehlschlägt).
  4. Importieren Sie die bearbeitete XML-Datei über den WordPress-Importer (Plug-In direkt über Extras> Importieren verfügbar).
  5. Überprüfen Sie, ob der Inhalt im neuen Beitragstyp vorhanden ist, und entfernen Sie dann den alten
Dagobert Renouf
quelle