Change custom post type slug from plugin options

I’d like to give users the option to change a custom post type slug in my plugin. Using this answer, I’m able to hardcode it into a function:

Redeclare/Change Slug of a Plugin's Custom Post Type

So how can I rewrite this to update when the user updates the plugin option? I tried something like this:

function add_custom_rewrite_rule() {

$slug = get_option('change_rewrite_slug'); // my plugin option

// First, try to load up the rewrite rules. We do this just in case
// the default permalink structure is being used.
if( ($current_rules = get_option('rewrite_rules')) ) {

    // Next, iterate through each custom rule adding a new rule
    // that replaces 'movies' with 'films' and give it a higher
    // priority than the existing rule.
    foreach($current_rules as $key => $val) {
        if(strpos($key, 'my_post_type') !== false) {
            add_rewrite_rule(str_ireplace('my_post_type', $slug, $key), $val, 'top');   
        } // end if
    } // end foreach

} // end if/else

// ...and we flush the rules
flush_rewrite_rules();

} // end add_custom_rewrite_rule
add_action('init', 'add_custom_rewrite_rule');

This doesn’t work. I feel like I am missing a step: once the plugin option is saved it needs to tell this function to fire and get the new slug. Or maybe there is a better way to do it.

Also, once it is changed, I need the function to update that, get the current option and then change the slug based on any new input.

The reason I need this is that the plugin has a post type of one kind of event but I want people to be able to customize it so instead of ‘event’ the slug could be ‘show’ or ‘gig’ or whatever they want.

Update: I’m using this class: http://tareq.wedevs.com/2012/06/wordpress-settings-api-php-class/

Here is a section of the options page code:

 function flush_settings() {

    if( isset( $_REQUEST['settings-updated'] ) )
    flush_rewrite_rules();
}

/**
 * Returns all the settings fields
 *
 * @return array settings fields
 */
function get_settings_fields() {
    $settings_fields = array(

    // Other settings here
        'djgigs_basic_settings' => array(
            array(
                'name' => 'djgigs_rewrite_slug',
                'label' => __( 'Permalink Slug', 'wedevs' ),
                'desc' => __( 'Enter a custom permalink slug. The default is 'djgig' but you could change it to 'gigs' or 'events'. ', 'wedevs' ),
                'type' => 'text',
                'default' => 'djgig',
            ),
        )

    );

    return $settings_fields;
}

Not sure if that is the correct location to add the flush function or if there is something in the Class that is making this not work.

This article was republished from its original source.
Call Us: 1(800)730-2416

Pixeldust is a 20-year-old web development agency specializing in Drupal and WordPress and working with clients all over the country. With our best in class capabilities, we work with small businesses and fortune 500 companies alike. Give us a call at 1(800)730-2416 and let’s talk about your project.

FREE Drupal SEO Audit

Test your site below to see which issues need to be fixed. We will fix them and optimize your Drupal site 100% for Google and Bing. (Allow 30-60 seconds to gather data.)

Powered by

Change custom post type slug from plugin options

On-Site Drupal SEO Master Setup

We make sure your site is 100% optimized (and stays that way) for the best SEO results.

With Pixeldust On-site (or On-page) SEO we make changes to your site’s structure and performance to make it easier for search engines to see and understand your site’s content. Search engines use algorithms to rank sites by degrees of relevance. Our on-site optimization ensures your site is configured to provide information in a way that meets Google and Bing standards for optimal indexing.

This service includes:

  • Pathauto install and configuration for SEO-friendly URLs.
  • Meta Tags install and configuration with dynamic tokens for meta titles and descriptions for all content types.
  • Install and fix all issues on the SEO checklist module.
  • Install and configure XML sitemap module and submit sitemaps.
  • Install and configure Google Analytics Module.
  • Install and configure Yoast.
  • Install and configure the Advanced Aggregation module to improve performance by minifying and merging CSS and JS.
  • Install and configure Schema.org Metatag.
  • Configure robots.txt.
  • Google Search Console setup snd configuration.
  • Find & Fix H1 tags.
  • Find and fix duplicate/missing meta descriptions.
  • Find and fix duplicate title tags.
  • Improve title, meta tags, and site descriptions.
  • Optimize images for better search engine optimization. Automate where possible.
  • Find and fix the missing alt and title tag for all images. Automate where possible.
  • The project takes 1 week to complete.