function process_post($post_id) { global $wpdb, $wp_rewrite, $sitepress; if (!isset($wp_rewrite)) { require_once ABSPATH . WPINC . '/rewrite.php'; $wp_rewrite = new WP_Rewrite(); } $rewrite = $wp_rewrite->wp_rewrite_rules(); delete_post_meta($post_id, '_alp_broken_links'); $post = $wpdb->get_row("SELECT * FROM {$wpdb->posts} WHERE ID={$post_id}"); $home_url = $sitepress->language_url($_POST['icl_post_language']); $int1 = preg_match_all('@<a([^>]*)href="((' . rtrim($home_url, '/') . ')?/([^"^>^#]+))"([^>]*)>@i', $post->post_content, $alp_matches1); $int2 = preg_match_all('@<a([^>]*)href=\'((' . rtrim($home_url, '/') . ')?/([^\'^>^#]+))\'([^>]*)>@i', $post->post_content, $alp_matches2); for ($i = 0; $i < 6; $i++) { $alp_matches[$i] = array_merge((array) $alp_matches1[$i], (array) $alp_matches2[$i]); } $sitepress_settings = $sitepress->get_settings(); if ($int1 || $int2) { $url_parts = parse_url(rtrim(get_option('home'), '/') . '/'); foreach ($alp_matches[4] as $k => $m) { if (0 === strpos($m, 'wp-content')) { continue; } if ($sitepress_settings['language_negotiation_type'] == 1) { $m_orig = $m; $exp = explode('/', $m, 2); $lang = $exp[0]; if ($wpdb->get_var("SELECT code FROM {$wpdb->prefix}icl_languages WHERE code='{$lang}'")) { $m = $exp[1]; } else { $m = $m_orig; unset($m_orig); $lang = false; } } elseif ($sitepress_settings['language_negotiation_type'] == 2) { // } $pathinfo = ''; $req_uri = '/' . $m; $req_uri_array = explode('?', $req_uri); $req_uri = $req_uri_array[0]; // separate anchor $req_uri_array = explode('#', $req_uri); $req_uri = $req_uri_array[0]; $anchor = $req_uri_array[1]; $self = '/index.php'; $home_path = parse_url(get_option('home')); if (isset($home_path['path'])) { $home_path = $home_path['path']; } else { $home_path = ''; } $home_path = trim($home_path, '/'); $req_uri = str_replace($pathinfo, '', rawurldecode($req_uri)); $req_uri = trim($req_uri, '/'); $req_uri = preg_replace("|^{$home_path}|", '', $req_uri); $req_uri = trim($req_uri, '/'); $pathinfo = trim($pathinfo, '/'); $pathinfo = preg_replace("|^{$home_path}|", '', $pathinfo); $pathinfo = trim($pathinfo, '/'); $self = trim($self, '/'); $self = preg_replace("|^{$home_path}|", '', $self); $self = trim($self, '/'); if (!empty($pathinfo) && !preg_match('|^.*' . $wp_rewrite->index . '$|', $pathinfo)) { $request = $pathinfo; } else { // If the request uri is the index, blank it out so that we don't try to match it against a rule. if ($req_uri == $wp_rewrite->index) { $req_uri = ''; } $request = $req_uri; } $this_request = $request; $request_match = $request; foreach ((array) $rewrite as $match => $query) { // If the requesting file is the anchor of the match, prepend it // to the path info. if (!empty($req_uri) && strpos($match, $req_uri) === 0 && $req_uri != $request) { $request_match = $req_uri . '/' . $request; } if (preg_match("!^{$match}!", $request_match, $matches) || preg_match("!^{$match}!", urldecode($request_match), $matches)) { // Got a match. $matched_rule = $match; // Trim the query of everything up to the '?'. $query = preg_replace("!^.+\\?!", '', $query); // Substitute the substring matches into the query. eval("@\$query = \"" . addslashes($query) . "\";"); $matched_query = $query; // Parse the query. parse_str($query, $perma_query_vars); break; } } $post_name = $category_name = $tax_name = false; if (isset($perma_query_vars['pagename'])) { $post_name = preg_replace('#((.*)/)#', '', $perma_query_vars['pagename']); $post_type = 'page'; } elseif (isset($perma_query_vars['name'])) { $post_name = $perma_query_vars['name']; $post_type = 'post'; } elseif (isset($perma_query_vars['category_name'])) { $category_name = $perma_query_vars['category_name']; } else { foreach ($this->custom_post_query_vars as $k => $v) { if (isset($perma_query_vars[$v])) { $post_name = $perma_query_vars[$v]; $post_type = $k; $post_qv = $v; break; } } foreach ($this->taxonomies_query_vars as $k => $v) { if (isset($perma_query_vars[$v])) { $tax_name = $perma_query_vars[$v]; $tax_type = $v; break; } } } if ($post_name) { $name = $wpdb->escape($post_name); //$post_type = isset($perma_query_vars['pagename']) ? 'page' : 'post'; $p = $wpdb->get_row("SELECT ID, post_type FROM {$wpdb->posts} WHERE post_name='{$name}' AND post_type ='{$post_type}'"); if ($p) { if ($post_type == 'page') { $qvid = 'page_id'; } else { $qvid = 'p'; } if ($sitepress_settings['language_negotiation_type'] == 1 && $lang) { $langprefix = '/' . $lang; } else { $langprefix = ''; } $perm_url = '(' . rtrim($home_url, '/') . ')?' . $langprefix . '/' . $m; $regk = '@href=["\'](' . $perm_url . ')["\']@i'; if ($anchor) { $anchor = "#" . $anchor; } else { $anchor = ""; } // check if this is an offsite url if ($p->post_type == 'page' && ($offsite_url = get_post_meta($p->ID, '_cms_nav_offsite_url', true))) { $regv = 'href="' . $offsite_url . $anchor . '"'; } else { $regv = 'href="' . '/' . ltrim($url_parts['path'], '/') . '?' . $qvid . '=' . $p->ID . $anchor . '"'; } $def_url[$regk] = $regv; } else { $alp_broken_links[$alp_matches[2][$k]] = array(); $p = $wpdb->get_results("SELECT ID, post_type FROM {$wpdb->posts} WHERE post_name LIKE '{$name}%' AND post_type IN('post','page')"); if ($p) { foreach ($p as $post_suggestion) { if ($post_suggestion->post_type == 'page') { $qvid = 'page_id'; } else { $qvid = 'p'; } $alp_broken_links[$alp_matches[2][$k]]['suggestions'][] = array('absolute' => '/' . ltrim($url_parts['path'], '/') . '?' . $qvid . '=' . $post_suggestion->ID, 'perma' => '/' . ltrim(str_replace(get_option('home'), '', get_permalink($post_suggestion->ID)), '/')); } } } } elseif ($category_name) { $name = $wpdb->escape($category_name); $c = $wpdb->get_row("SELECT term_id FROM {$wpdb->terms} WHERE slug='{$name}'"); if ($c) { /* not used ?? */ if ($sitepress_settings['language_negotiation_type'] == 1 && $lang) { $langprefix = '/' . $lang; } else { $langprefix = ''; } /* not used ?? */ $perm_url = '(' . rtrim($home_url, '/') . ')?' . $langprefix . '/' . $m; $regk = '@href=[\'"](' . $perm_url . ')[\'"]@i'; $url_parts = parse_url(rtrim(get_option('home'), '/') . '/'); $regv = 'href="' . '/' . ltrim($url_parts['path'], '/') . '?cat_ID=' . $c->term_id . '"'; $def_url[$regk] = $regv; } else { $alp_broken_links[$alp_matches[2][$k]] = array(); $c = $wpdb->get_results("SELECT term_id FROM {$wpdb->terms} WHERE slug LIKE '{$name}%'"); if ($c) { foreach ($c as $cat_suggestion) { $alp_broken_links[$alp_matches[2][$k]]['suggestions'][] = array('absolute' => '?cat_ID=' . $cat_suggestion->term_id, 'perma' => '/' . ltrim(str_replace(get_option('home'), '', get_category_link($cat_suggestion->term_id)), '/')); } } } } elseif ($tax_name) { if ($sitepress_settings['language_negotiation_type'] == 1 && $lang) { $langprefix = '/' . $lang; } else { $langprefix = ''; } $perm_url = '(' . rtrim($home_url, '/') . ')?' . $langprefix . '/' . $m; $regk = '@href=["\'](' . $perm_url . ')["\']@i'; if ($anchor) { $anchor = "#" . $anchor; } else { $anchor = ""; } $regv = 'href="' . '/' . ltrim($url_parts['path'], '/') . '?' . $tax_type . '=' . $tax_name . $anchor . '"'; $def_url[$regk] = $regv; } } $post_content = $post->post_content; if ($def_url) { $post_content = preg_replace(array_keys($def_url), array_values($def_url), $post_content); } $tx_qvs = is_array($this->taxonomies_query_vars) && !empty($this->taxonomies_query_vars) ? '|' . join('|', $this->taxonomies_query_vars) : ''; $post_qvs = is_array($this->custom_posts_query_vars) && !empty($this->custom_posts_query_vars) ? '|' . join('|', $this->custom_posts_query_vars) : ''; $int = preg_match_all('@href=[\'"](' . rtrim(get_option('home'), '/') . '/?\\?(p|page_id' . $tx_qvs . $post_qvs . ')=([0-9a-z-]+)(#.+)?)[\'"]@i', $post_content, $matches2); if ($int) { $url_parts = parse_url(rtrim(get_option('home'), '/') . '/'); $post_content = preg_replace('@href=[\'"](' . rtrim(get_option('home'), '/') . '/?\\?(p|page_id' . $tx_qvs . $post_qvs . ')=([0-9a-z-]+)(#.+)?)[\'"]@i', 'href="' . '/' . ltrim($url_parts['path'], '/') . '?$2=$3$4"', $post_content); } if ($post_content) { $wpdb->update($wpdb->posts, array('post_content' => $post_content), array('ID' => $post_id)); } } update_post_meta($post_id, '_alp_processed', time()); if ($alp_broken_links) { update_post_meta($post_id, '_alp_broken_links', $alp_broken_links); } }
function _process_generic_text($source_text, &$alp_broken_links) { global $wpdb, $wp_rewrite, $sitepress, $sitepress_settings; $sitepress_settings = $sitepress->get_settings(); $default_language = $sitepress->get_default_language(); $current_language = $sitepress->get_current_language(); $cache_key_args = array($default_language, $current_language, md5($source_text), md5(implode('', $alp_broken_links))); $cache_key = md5(json_encode($cache_key_args)); $cache_group = '_process_generic_text'; $found = false; $text = wp_cache_get($cache_key, $cache_group, false, $found); if ($found) { return $text; } $text = $source_text; if (!isset($wp_rewrite)) { require_once ABSPATH . WPINC . '/rewrite.php'; $wp_rewrite = new WP_Rewrite(); } if ($current_language == $default_language) { $rewrite = $wp_rewrite->wp_rewrite_rules(); } else { remove_filter('option_rewrite_rules', array($sitepress, 'rewrite_rules_filter')); if (class_exists('WPML_Slug_Translation')) { remove_filter('option_rewrite_rules', array('WPML_Slug_Translation', 'rewrite_rules_filter'), 1); } $rewrite = $wp_rewrite->wp_rewrite_rules(); add_filter('option_rewrite_rules', array($sitepress, 'rewrite_rules_filter')); if (class_exists('WPML_Slug_Translation')) { add_filter('option_rewrite_rules', array('WPML_Slug_Translation', 'rewrite_rules_filter'), 1, 1); } } $rewrite = $this->all_rewrite_rules($rewrite); $home_url = $sitepress->language_url(empty($_POST['icl_post_language']) ? false : $_POST['icl_post_language']); if ($sitepress_settings['language_negotiation_type'] == 3) { $home_url = preg_replace("#\\?lang=([a-z-]+)#i", '', $home_url); } $home_url = str_replace("?", "\\?", $home_url); if ($sitepress_settings['urls']['directory_for_default_language']) { $default_language = $sitepress->get_default_language(); $home_url = str_replace($default_language . "/", "", $home_url); } $int1 = preg_match_all('@<a([^>]*)href="((' . rtrim($home_url, '/') . ')?/([^"^>^\\[^\\]]+))"([^>]*)>@i', $text, $alp_matches1); $int2 = preg_match_all('@<a([^>]*)href=\'((' . rtrim($home_url, '/') . ')?/([^\'^>^\\[^\\]]+))\'([^>]*)>@i', $text, $alp_matches2); $alp_matches = array(); for ($i = 0; $i < 6; $i++) { $alp_matches[$i] = array_merge((array) $alp_matches1[$i], (array) $alp_matches2[$i]); } if ($int1 || $int2) { $url_parts = parse_url(rtrim(get_home_url(), '/') . '/'); foreach ($alp_matches[4] as $k => $m) { if (0 === strpos($m, 'wp-content')) { continue; } $lang = false; if ($sitepress_settings['language_negotiation_type'] == 1 && $sitepress_settings['urls']['directory_for_default_language'] != 1) { $m_orig = $m; $exp = explode('/', $m, 2); $lang = $exp[0]; if ($wpdb->get_var("SELECT code FROM {$wpdb->prefix}icl_languages WHERE code='{$lang}'")) { $m = $exp[1]; } else { $m = $m_orig; unset($m_orig); $lang = false; } } $pathinfo = ''; $req_uri = '/' . $m; $req_uri_array = explode('?', $req_uri); $req_uri = $req_uri_array[0]; $req_uri_params = ''; if (isset($req_uri_array[1])) { $req_uri_params = $req_uri_array[1]; } // separate anchor $req_uri_array = explode('#', $req_uri); $req_uri = $req_uri_array[0]; $anchor = isset($req_uri_array[1]) ? $req_uri_array[1] : false; $home_path = parse_url(get_home_url()); if (isset($home_path['path'])) { $home_path = $home_path['path']; } else { $home_path = ''; } $home_path = trim($home_path, '/'); $req_uri = str_replace($pathinfo, '', rawurldecode($req_uri)); $req_uri = trim($req_uri, '/'); $req_uri = preg_replace("|^{$home_path}|", '', $req_uri); $req_uri = trim($req_uri, '/'); $pathinfo = trim($pathinfo, '/'); $pathinfo = preg_replace("|^{$home_path}|", '', $pathinfo); $pathinfo = trim($pathinfo, '/'); if (!empty($pathinfo) && !preg_match('|^.*' . $wp_rewrite->index . '$|', $pathinfo)) { $request = $pathinfo; } else { // If the request uri is the index, blank it out so that we don't try to match it against a rule. if ($req_uri == $wp_rewrite->index) { $req_uri = ''; } $request = $req_uri; } $request_match = $request; $permalink_query_vars = array(); foreach ((array) $rewrite as $match => $query) { // If the requesting file is the anchor of the match, prepend it // to the path info. if (!empty($req_uri) && strpos($match, $req_uri) === 0 && $req_uri != $request) { $request_match = $req_uri . '/' . $request; } if (preg_match("!^{$match}!", $request_match, $matches) || preg_match("!^{$match}!", urldecode($request_match), $matches)) { // Got a match. // Trim the query of everything up to the '?'. $query = preg_replace("!^.+\\?!", '', $query); // Substitute the substring matches into the query. $query = addslashes(WP_MatchesMapRegex::apply($query, $matches)); // Parse the query. parse_str($query, $permalink_query_vars); break; } } $post_name = $category_name = $tax_name = false; if (isset($permalink_query_vars['pagename'])) { $icl_post_lang = isset($_POST['icl_post_language']) ? $_POST['icl_post_language'] : $current_language; $sitepress->switch_lang($icl_post_lang); $page_by_path = get_page_by_path($permalink_query_vars['pagename']); $sitepress->switch_lang($current_language); if (!empty($page_by_path->post_type)) { $post_name = $permalink_query_vars['pagename']; $post_type = 'page'; } else { $post_name = $permalink_query_vars['pagename']; $post_type = 'post'; } } elseif (isset($permalink_query_vars['name'])) { $post_name = $permalink_query_vars['name']; $post_type = 'post'; } elseif (isset($permalink_query_vars['category_name'])) { $category_name = $permalink_query_vars['category_name']; } elseif (isset($permalink_query_vars['p'])) { // case or /archives/%post_id $post_data_prepared = $wpdb->prepare("SELECT post_type, post_name FROM {$wpdb->posts} WHERE id=%d", $permalink_query_vars['p']); list($post_type, $post_name) = $wpdb->get_row($post_data_prepared, ARRAY_N); } else { if (empty($this->custom_post_query_vars) or empty($this->taxonomies_query_vars)) { $this->init_query_vars(); } foreach ($this->custom_post_query_vars as $query_vars_key => $query_vars_value) { if (isset($permalink_query_vars[$query_vars_value])) { $post_name = $permalink_query_vars[$query_vars_value]; $post_type = $query_vars_key; break; } } foreach ($this->taxonomies_query_vars as $query_vars_value) { if (isset($permalink_query_vars[$query_vars_value])) { $tax_name = $permalink_query_vars[$query_vars_value]; $tax_type = $query_vars_value; break; } } } if ($post_name && isset($post_type)) { $icl_post_lang = isset($_POST['icl_post_language']) ? $_POST['icl_post_language'] : $current_language; $sitepress->switch_lang($icl_post_lang); $p = get_page_by_path($post_name, OBJECT, $post_type); $sitepress->switch_lang($current_language); if (empty($p)) { // fail safe if ($post_id = url_to_postid($home_path . '/' . $post_name)) { $p = get_post($post_id); } } if ($p) { if ($post_type == 'page') { $qvid = 'page_id'; } else { $qvid = 'p'; } if ($sitepress_settings['language_negotiation_type'] == 1 && $lang) { $langprefix = '/' . $lang; } else { $langprefix = ''; } $perm_url = '(' . rtrim($home_url, '/') . ')?' . $langprefix . '/' . str_replace('?', '\\?', $m); $regk = '@href=["\'](' . $perm_url . ')["\']@i'; if ($anchor) { $anchor = "#" . $anchor; } else { $anchor = ""; } // check if this is an offsite url if ($p->post_type == 'page' && ($offsite_url = get_post_meta($p->ID, '_cms_nav_offsite_url', true))) { $regv = 'href="' . $offsite_url . $anchor . '"'; } else { $regv = 'href="' . '/' . ltrim($url_parts['path'], '/') . '?' . $qvid . '=' . $p->ID; if ($req_uri_params != '') { $regv .= '&' . $req_uri_params; } $regv .= $anchor . '"'; } $def_url[$regk] = $regv; } else { $alp_broken_links[$alp_matches[2][$k]] = array(); $name = esc_sql($post_name); $p = $wpdb->get_results("SELECT ID, post_type FROM {$wpdb->posts} WHERE post_name LIKE '{$name}%' AND post_type IN('post','page')"); if ($p) { foreach ($p as $post_suggestion) { if ($post_suggestion->post_type == 'page') { $qvid = 'page_id'; } else { $qvid = 'p'; } $alp_broken_links[$alp_matches[2][$k]]['suggestions'][] = array('absolute' => '/' . ltrim($url_parts['path'], '/') . '?' . $qvid . '=' . $post_suggestion->ID, 'perma' => '/' . ltrim(str_replace(site_url(), '', get_permalink($post_suggestion->ID)), '/')); } } } } elseif ($category_name) { if (false !== strpos($category_name, '/')) { $splits = explode('/', $category_name); $category_name = array_pop($splits); $category_parent = array_pop($splits); $category_parent_id = $wpdb->get_var($wpdb->prepare("SELECT term_id FROM {$wpdb->terms} WHERE slug=%s", $category_parent)); $c = $wpdb->get_row($wpdb->prepare("SELECT t.term_id FROM {$wpdb->terms} t JOIN {$wpdb->term_taxonomy} x ON x.term_id=t.term_id AND x.taxonomy='category' AND x.parent=%d AND t.slug=%s", $category_parent_id, $category_name)); } else { $c = $wpdb->get_row($wpdb->prepare("SELECT term_id FROM {$wpdb->terms} WHERE slug=%s", $category_name)); } if ($c) { /* not used ?? */ if ($sitepress_settings['language_negotiation_type'] == 1 && $lang) { $langprefix = '/' . $lang; } else { $langprefix = ''; } /* not used ?? */ $perm_url = '(' . rtrim($home_url, '/') . ')?' . $langprefix . '/' . $m; $regk = '@href=[\'"](' . $perm_url . ')[\'"]@i'; $url_parts = parse_url(rtrim(get_home_url(), '/') . '/'); $regv = 'href="' . '/' . ltrim($url_parts['path'], '/') . '?cat_ID=' . $c->term_id . '"'; $def_url[$regk] = $regv; } elseif (isset($name)) { $alp_broken_links[$alp_matches[2][$k]] = array(); $c_prepared = $wpdb->prepare("SELECT term_id FROM {$wpdb->terms} WHERE slug LIKE %s", array($name . '%')); $c = $wpdb->get_results($c_prepared); if ($c) { foreach ($c as $cat_suggestion) { $perma = '/' . ltrim(str_replace(get_home_url(), '', get_category_link($cat_suggestion->term_id)), '/'); $alp_broken_links[$alp_matches[2][$k]]['suggestions'][] = array('absolute' => '?cat_ID=' . $cat_suggestion->term_id, 'perma' => $perma); } } } } elseif ($tax_name && isset($tax_type)) { if ($sitepress_settings['language_negotiation_type'] == 1 && $lang) { $langprefix = '/' . $lang; } else { $langprefix = ''; } $perm_url = '(' . rtrim($home_url, '/') . ')?' . $langprefix . '/' . $m; $regk = '@href=["\'](' . $perm_url . ')["\']@i'; if ($anchor) { $anchor = "#" . $anchor; } else { $anchor = ""; } $regv = 'href="' . '/' . ltrim($url_parts['path'], '/') . '?' . $tax_type . '=' . $tax_name . $anchor . '"'; $def_url[$regk] = $regv; } } if (!empty($def_url)) { $text = preg_replace(array_keys($def_url), array_values($def_url), $text); } $tx_qvs = !empty($this->taxonomies_query_vars) && is_array($this->taxonomies_query_vars) ? '|' . join('|', $this->taxonomies_query_vars) : ''; $post_qvs = !empty($this->custom_posts_query_vars) && is_array($this->custom_posts_query_vars) ? '|' . join('|', $this->custom_posts_query_vars) : ''; $int = preg_match_all('@href=[\'"](' . rtrim(get_home_url(), '/') . '/?\\?(p|page_id' . $tx_qvs . $post_qvs . ')=([0-9a-z-]+)(#.+)?)[\'"]@i', $text, $matches2); if ($int) { $url_parts = parse_url(rtrim(get_home_url(), '/') . '/'); $text = preg_replace('@href=[\'"](' . rtrim(get_home_url(), '/') . '/?\\?(p|page_id' . $tx_qvs . $post_qvs . ')=([0-9a-z-]+)(#.+)?)[\'"]@i', 'href="' . '/' . ltrim($url_parts['path'], '/') . '?$2=$3$4"', $text); } } wp_cache_set($cache_key, $text, $cache_group); return $text; }
private function initialize_rewrite($current_language, $default_language, $sitepress) { global $wp_rewrite; if (!isset($wp_rewrite)) { require_once ABSPATH . WPINC . '/rewrite.php'; $wp_rewrite = new WP_Rewrite(); } if ($current_language == $default_language) { $rewrite = $wp_rewrite->wp_rewrite_rules(); } else { remove_filter('option_rewrite_rules', array($sitepress, 'rewrite_rules_filter')); if (class_exists('WPML_Slug_Translation')) { remove_filter('option_rewrite_rules', array('WPML_Slug_Translation', 'rewrite_rules_filter'), 1); } $rewrite = $wp_rewrite->wp_rewrite_rules(); if (class_exists('WPML_Slug_Translation')) { add_filter('option_rewrite_rules', array('WPML_Slug_Translation', 'rewrite_rules_filter'), 1, 1); } } return $this->all_rewrite_rules($rewrite); }