it-swarm.com.de

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

Ich habe einen benutzerdefinierten Beitragstyp mit dem Namen "Portfolio" erstellt, möchte ihn jedoch in "Projekte" ändern. Was sind 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 portfolio, daher kann ich portfolio nicht einfach mit projects austauschen.

/* 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;
    }
}
18
Desi

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

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

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 Lade das Plugin herunter und verwende es: http://wordpress.org/extend/plugins/ptypeconverter/

2 Kopieren Sie Ihre benutzerdefinierte Post-Typ "Portfolio" -Datei irgendwo speichern. 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 Ändere " Portfolio " in " Projekte "

5 Importiere die Posts mit dem Plugin und der Bratsche!

Hoffe das klappt.

2
Wesley Cheung

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 in wp_postmeta in 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.
18
Will

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!

6
Nirav Mehta

Verwenden Sie eine WordPress-Datenbankabfrage, ohne die serialisierten Optionsdaten zu vergessen

Die Methode, die für mich funktioniert hat, war das Suchen und Ersetzen in der WordPress-Datenbank, wobei jedoch darauf geachtet wurde, die serialisierten Optionsdaten nicht zu verfälschen. Der beste Weg, den ich gefunden habe, ist die Verwendung des Dienstprogramms Safe Search and Replace Database von Interconnect/it . Führen Sie niemals einfach eine Abfrage vom Typ SETpost_type= REPLACE(post_type,'old_post_type','new_post_type') durch, ohne zu wissen, was Sie tun. Andernfalls werden die serialisierten Daten beschädigt, da sie eine Prüfsumme enthalten und nicht ordnungsgemäß unserialisiert werden können.

Lies den Abschnitt über mögliche Probleme, bevor du blindlings folgst

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 Sichere Suche und Ersetzung 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. Beispielsweise musste ich single-project-portfolio.php in single-before-after.php ändern, als ich meinen Beitragstyp von project-portfolio in before-after änderte.

Schritt 5 - Beliebigen Code aktualisieren

Führen Sie eine Dateisuche durch und ersetzen Sie sie für Ihren alten benutzerdefinierten Beitragstypnamen im Ordner "Theme" 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)

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%';
2
AndrewD

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 beide zeigen auf WHERE post_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.

0
Bullyen

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
0
Dagobert Renouf