コード例 #1
0
function sfput_extra_permastructs($rules)
{
    global $wp_rewrite, $polylang;
    if (empty($rules)) {
        // Uh? oO
        return $rules;
    }
    $languages = $polylang->model->get_languages_list(array('fields' => 'slug'));
    // If Polylang doesn't add the /{default_lang}/ in the URL, no need to modify the rules for this lang, sfput_registered_post_type() took care of it earlier.
    if ($polylang->options['hide_default']) {
        $languages = array_diff($languages, array($polylang->options['default_lang']));
    }
    if (empty($languages)) {
        return $rules;
    }
    // The way Polylang built its regex.
    $imploded_langs = '(' . implode('|', $languages) . ')/';
    $poly_slug = $wp_rewrite->root . ($polylang->options['rewrite'] ? '' : 'language/') . $imploded_langs;
    // So, why are we here?
    $filter = str_replace('_rewrite_rules', '', current_filter());
    $post_types = sfput_get_post_types();
    $taxonomies = sfput_get_taxonomies();
    // Post type, single
    if (!empty($post_types[$filter])) {
        $slugs = sfput_get_option('post_types.single');
        $slug = sfput_get_post_type_singular_slug($filter);
        if (empty($slugs[$filter]) || empty($slug)) {
            // Uh? oO
            return $rules;
        }
    } elseif (!empty($taxonomies[$filter])) {
        $slugs = sfput_get_option('taxonomies');
        $slug = sfput_get_taxonomy_slug($filter);
        if (empty($slugs[$filter]) || empty($slug)) {
            // Uh? oO
            return $rules;
        }
    } else {
        // Uh? oO
        return $rules;
    }
    // Replacements
    $new_rules = array();
    $slugs = $slugs[$filter];
    foreach ($rules as $regex => $rule) {
        if (strpos($regex, $poly_slug) !== 0) {
            $new_rules[$regex] = $rule;
            continue;
        }
        foreach ($languages as $language) {
            $new_regex = str_replace_once($imploded_langs, '(' . $language . ')/', $regex);
            $new_regex = str_replace_once('/' . $slug . '/', '/' . $slugs[$language] . '/', '/' . $new_regex);
            $new_regex = ltrim($new_regex, '/');
            $new_rules[$new_regex] = $rule;
        }
    }
    return $new_rules;
}
コード例 #2
0
function sfput_registered_taxonomy($taxonomy, $object_type, $args)
{
    global $wp_taxonomies, $wp_rewrite, $polylang;
    add_filter('sfput_options_clear_taxonomies_cache', '__return_true');
    $taxonomies = sfput_get_taxonomies();
    if (empty($taxonomies[$taxonomy])) {
        return;
    }
    $mode = sfput_get_polylang_mode();
    // Language
    if ($mode === 1) {
        $lang = $polylang->options['default_lang'];
    } else {
        $lang = pll_current_language();
    }
    // Save the original slug somewhere safe, it could be usefull later (like in the settings page).
    $original_slug = sfput_get_taxonomy_slug($taxonomy);
    if (!sf_cache_data('sfput_original_slugs-taxo-' . $taxonomy)) {
        sf_cache_data('sfput_original_slugs-taxo-' . $taxonomy, $original_slug);
    }
    // Settings
    $slugs = sfput_get_option('taxonomies');
    $slug = !empty($slugs[$taxonomy][$lang]) ? $slugs[$taxonomy][$lang] : $original_slug;
    if (!$slug) {
        return;
    }
    // Change the slug
    if ($original_slug && $original_slug !== $slug) {
        // This is me being paranoïd: I want to make sure to replace "/my-slug/", and not "FOOmy-slugBAR".
        $has_slash = strpos($wp_rewrite->extra_permastructs[$taxonomy]['struct'], '/') === 0;
        $wp_rewrite->extra_permastructs[$taxonomy]['struct'] = str_replace('/' . $original_slug . '/', '/' . $slug . '/', '/' . $wp_rewrite->extra_permastructs[$taxonomy]['struct']);
        $wp_rewrite->extra_permastructs[$taxonomy]['struct'] = ($has_slash ? '/' : '') . ltrim($wp_rewrite->extra_permastructs[$taxonomy]['struct'], '/');
        $wp_taxonomies[$taxonomy]->rewrite['slug'] = $slug;
    }
    if (is_admin() && !(defined('DOING_AJAX') && DOING_AJAX) && $mode === 1) {
        remove_filter($taxonomy . '_rewrite_rules', 'sfput_extra_permastructs', 1000);
        add_filter($taxonomy . '_rewrite_rules', 'sfput_extra_permastructs', 1000);
    }
}