Сделать создание постоянных ссылок в посте динамическим с нужными именами
Сейчас wordpress создаёт постоянную ссылку в посте на основании заголовка поста, которое на русском. Я же хочу на английском. У меня есть произвольное поле english-movie-title, которое я добавляю к URL сайта. Я написал хук. Проблема: При публикации ссылка создаётся на русском. А в админ панели после публикации при редактировании хук срабатывает, и я вижу ссылку уже на английском языке, но при переходе пост пустой. Как мне изменить хук, чтобы решить свою задачу?
function movieapp_filter_post_link( $permalink, $post, $leavename ){
$site_url = get_site_url();
$field = get_field( 'english-movie-title', $post->ID );
$eng_mov_tit = mb_strtolower(str_replace(' ','-',$field));
$permalink = $site_url . '/' . $eng_mov_tit . '/';
return $permalink;
}
add_filter( 'post_link', 'movieapp_filter_post_link', 10, 3 );
Ответы (1 шт):
Если я правильно понимаю вашу задачу, вы хотите менять урл поста при сохранении. А меняете урл поста при выводе. Ожидаемо получаете 404 страницу на выходе, т. к. Wordpress ничего не знает о том адресе, по которому вы пытаетесь что-то получить.
Вам необходимо сохранять slug поста при его создании, а не вешать фильтры на получение его адреса. То есть действие на save_post, а не на post_link
Что-то вроде этого:
<?php
function change_post_slug_callback($post_id, $post, $update) {
// проверяем, что тип поста "post" и это не автосохранение, иначе выходим
if ($post->post_type != 'post' || $post->post_status == 'auto-draft')
return;
// меняем адрес только если пост содаётся, а не редактируется (проверка на совпадение даты создания и даты редактирования)
// удалите эту часть, если вам нужна возможность менять урл при редактировании
if ($post->post_date_gmt != $post->post_modified_gmt)
return;
// здесь получение нового слэга по вашему алгоритму, что бы он ни значил
$field = get_field( 'english-movie-title', $post->ID);
$new_slug = mb_strtolower(str_replace(' ','-',$field))
// проверяем, что новый слэг не совпадает с предыдущим, иначе выходим
if ($new_slug == $post->post_name)
return;
// отключаем наш экшн чтобы избежать зацикливания при сохранении (это важная часть, не исключайте её)
remove_action('save_post', 'change_post_slug_callback', 10, 3 );
// устанавливаем новый слэг и сохраняем пост
wp_update_post( array(
'ID' => $post_id,
'post_name' => $new_slug
));
// возвращаем экшн
add_action('save_post', 'change_post_slug_callback', 10, 3);
}
add_action('save_post', 'change_post_slug_callback', 10, 3);