web-dev-qa-db-fra.com

Reslug un type de message personnalisé

J'ai construit un plugin pour wordpress avec des types de messages personnalisés et quelque part dans la même ligne, j'ai réalisé que je devais reconstruire la façon dont les slugs sont générés. À l'origine, j'avais le cpt qui fabriquait des slugs par défaut tels que new-post-1, new-post-2, etc. J'ai compris que c'était ridicule et j'ai réécrit la convention de dénomination pour créer un slug à partir du titre du message, comme il se doit. Le seul problème que je me pose maintenant est que je souhaite que tous les anciens messages que je suis entrés dans wordpress utilisent la nouvelle convention de dénomination. Existe-t-il une fonction ou un moyen de demander à wordpress de reconstruire/régénérer les slugs pour un type de publication personnalisé particulier?.

J'ai trouvé ce plugin: http://wordpress.org/plugins/re-slug/

Mais .. ça ne marche pas pour les cpts

Merci pour l'aide.

3
Rizzo

J'ai également créé une approche similaire à celle mentionnée par @sri, cependant, utiliser $ wpdb vs wp_update_post devrait être plus performant et configurable.

/**
 * Reset the slugs on a particular post type to use the default sanatized slugs
 * @param  string  $post_type         filter by post type
 * @param  int $offset                set the paginated post to start
 * @param  boolean $force_guid_update * WARNING * never enable this
 *
 * @example add the following code into your theme's functions.php file, ensure
 * that the desired post type is set when calling wp20140226_reset_slugs('post');
 * Then navigate to wp-admin/options-permalink.php to activate query to reset slugs.
 * Depending on how many posts need to be updated this method may take quite 
 * some time, on a shared Host there may be a need to set the $offset argument
 * to limit the amount of time the script runs and use multiple calls by adjusting
 * the offset to progress through the entire record set.
 * 
 */
function wp20140226_reset_slugs( $post_type = null, $offset = 0, $force_guid_update = false ){
    global $pagenow, $wpdb;

    if ( $pagenow != 'options-permalink.php' || empty($post_type) )
        return;

    $get_post_args = array(
        'post_type' => $post_type, 
        'post_status' => 'any'
        );

    if( $offset == 0 ){
        $get_post_args['posts_per_page'] = -1;
    } else {
        $get_post_args['offset'] = $offset;
    }

    $posts_to_fix = new WP_Query( $get_post_args );

    foreach( $posts_to_fix->posts as $post_to_fix ){
        $wpdb->update( 
            $wpdb->posts, 
            array( 'post_name' => sanitize_title( $post_to_fix->post_title ) ), 
            array( 'ID' => $post_to_fix->ID ), 
            array( '%s' ), 
            array( '%d' ) 
        );
    }

    // you should really leave this alone (do not set to true unless you need to)
    //http://codex.wordpress.org/Changing_The_Site_URL#Important_GUID_Note
    if( $force_guid_update ){
        $siteurl = trailingslashit( get_option('siteurl') );
        $wpdb->query( "UPDATE {$wpdb->posts} SET guid = CONCAT( '{$siteurl}?p=', ID ) WHERE post_type = {$post_type} OR post_type = 'revision';" );
    }

    add_action('admin_notices', 'wp20140226_reset_slugs_admin_notice');

}

/**
 * notify the user when the reset slug queries are run
 */
function wp20140226_reset_slugs_admin_notice(){
    ?>
    <div class="updated">
        <p><?php _e('You have successfully run the reset slugs function, please disable or suffer impact when in the admin.'); ?></p>
    </div>
    <?php
}

wp20140226_reset_slugs('post'); // change this to be your custom post type

source: https://Gist.github.com/codearachnid/9243595

0
codearachnid

Le plugin re-slug peut être corrigé pour fonctionner avec Wordpress 4 et versions ultérieures. Modifiez la ligne 13 de re-slug.php comme suit:

$return = str_replace('Edit</button>', 'Edit</button> <button type="button" id="re-slug" class="edit-slug button button-small hide-if-no-js" style="display:inherit;"><a href="#re-slug">Re-slug</a></button>', $return);

Ma solution n'est pas très propre, mais pour un premier passage, elle fonctionne assez bien, y compris pour les types de publication personnalisés. Le bouton est ajouté, ce qui permet de publier le message en cours avec tout ce qui se trouve dans le champ Titre.

C’est la seule solution que j’ai pu trouver pour un nouveau message pour un seul message.

0
Slam