Динамически изменять постоянную ссылку на сообщение через настраиваемое поле при сохранении / обновлении
Я хочу изменить постоянную ссылку поста WordPress (post_name
) динамически каждый раз, когда сообщение сохраняется / обновляется путем извлечения из настраиваемого поля, присутствующего в сообщении, и замены постоянной ссылки на это значение. У меня есть код внутри functions.php
который работает, кроме того, что он добавляет -2
на постоянную ссылку. Я предполагаю, что это происходит потому, что что-то происходит дважды: первый раз приводит к получению постоянной ссылки, а второй - к тому, что WordPress отвечает на "дубликат", добавляя -2
,
Это текущий код:
add_action('save_post', 'change_default_slug');
function change_default_slug($post_id) {
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return;
if ( !current_user_can('edit_post', $post_id) )
return;
remove_action('save_post', 'change_default_slug');
wp_update_post(array('ID' => $post_id, 'post_name' =>get_post_meta($post_id,'request_number',true)));;
add_action('save_post', 'change_default_slug');
}
1 ответ
Я разберусь с этим...
Теперь предполагается, что вы используете ACF для своего настраиваемого поля... Если нет, просто обновите код с помощью пользовательских мета-функций WP. О, не забудьте изменить field_5fed2cdbc1fd2 с ключом вашего поля ACF.
add_filter('save_post', 'change_post_name', 20, 1);
function change_post_name($post_id)
{
$post_type = get_post_type();
if ($post_type == "post"){
$acf_title_field = $_POST['acf']['field_5fed2cdbc1fd2']; // get the field data by $_POST
if (!empty($acf_title_field)) {
// update the title in database
$wpdb->update($wpdb->posts, array('post_title' => $acf_title_field, 'post_name' => sanitize_title($acf_title_field)), array('ID' => $post_id));
}
}
}
add_filter( 'wp_insert_post_data', 'update_post_name', 50, 2 );
function update_post_name( $data, $postarr ) {
$post_type = get_post_type();
if ($post_type == "post"){
//Check for the post statuses you want to avoid
if ( !in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) {
$acf_title_field = $_POST['acf']['field_5fed2cdbc1fd2']; // get the field data by $_POST
// $data['post_name'] = sanitize_title( $data['post_title'] );
$data['post_name'] = sanitize_title( $acf_title_field );
}
return $data;
}
}