web-dev-qa-db-fra.com

Requête pour modifier le type de publication personnalisé avec une catégorie spécifique

Je dois modifier plusieurs centaines de messages avec des types de message personnalisés en type de message normal, mais uniquement dans une catégorie de ce type de message personnalisé.

J'ai donc un type de message personnalisé 'films' et au sein de ce type de message, j'ai une douzaine de catégories. Ce que je voudrais faire est de changer tous les messages du type de message personnalisé "films" qui ont également la catégorie "réalisateurs" au type de message standard sans affecter les autres "films" messages qui n'ont pas la catégorie "réalisateurs".

J'ai effectué des recherches et trouvé un moyen de modifier avec succès toutes les publications d'un type d'article à l'aide de la requête ci-dessous, mais je dois être plus spécifique.

UPDATE  `wp_posts` 
SET  `post_type` =  '<new post type name>' 
WHERE  `post_type` = '<old post type name>';

J'ai également essayé d'utiliser des plugins tels que ' Convertir les types de publication ', mais malheureusement, ils ne font pas apparaître de catégories dans les types de publication personnalisés.

J'ai lu beaucoup de documentation sur ce sujet, mais je suis totalement novice dans ce type de travail et j'ai donc du mal à comprendre la syntaxe.

2
Kristopher

Je le ferais en php en deux parties plutôt qu'en une seule déclaration brute sql, pour des raisons de sécurité, par exemple dans votre "functions.php", mettez:

function wpse160706() {
    $old_post_type = 'films';
    $new_post_type = 'post';
    $category_slug = 'directors';
    $taxonomy = 'category';

    global $wpdb;
    $sql = $wpdb->prepare( 'SELECT p.ID FROM ' . $wpdb->posts . ' AS p'
        . ' JOIN ' . $wpdb->term_relationships . ' AS tr ON p.ID = tr.object_id'
        . ' JOIN ' . $wpdb->term_taxonomy . ' AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id'
        . ' JOIN ' . $wpdb->terms . ' AS t ON tt.term_id = t.term_id'
        . ' WHERE p.post_type = %s AND t.slug = %s AND tt.taxonomy = %s'
        , $old_post_type, $category_slug, $taxonomy );
    $post_ids = $wpdb->get_col( $sql );
    print("post_ids=" . implode( ',', $post_ids));
    foreach ( $post_ids as $post_id ) {
        $sql = $wpdb->prepare( 'UPDATE ' . $wpdb->posts
            . ' SET post_type = %s WHERE ID = %d AND post_type = %s'
            , $new_post_type, $post_id, $old_post_type );
        // Uncomment the following if happy that $post_ids correct.
        //$wpdb->query( $sql );
    }
}

puis appelez-le et assurez-vous de ne recevoir que les publications que vous souhaitez, sauvegardez votre base de données, etc., supprimez la mise en commentaire de la requête de mise à jour, exécutez-le une fois, puis supprimez l'appel wpse160706().

1
bonger