web-dev-qa-db-ja.com

投稿作成時にスラッグを変更する

私は現在、パーマリンク構造にPost nameを使用しています。パーマリンクの最後にあるフィールドからテキストを追加したいです。 Postが公開されたときにパーマリンクを作成するためのフックはありますか?

私の場合は、Advanced Custom Fieldsを使用し、すべての投稿にタイトルと字幕があります。現在、パーマリンクは/title/ですが、私は/title-subtitle/になりたかったのです。

編集: これと似ています 前の質問 、これはのための災害である記事のURLを変更するので、私は記事作成のためだけにし、将来の記事版ではしたくないSEO。

3
IvanRF

これを実装するために私がしたことは次のとおりです。

function slug_save_post_callback( $post_ID, $post, $update ) {
    // allow 'publish', 'draft', 'future'
    if ($post->post_type != 'post' || $post->post_status == 'auto-draft')
        return;

    // only change slug when the post is created (both dates are equal)
    if ($post->post_date_gmt != $post->post_modified_gmt)
        return;

    // use title, since $post->post_name might have unique numbers added
    $new_slug = sanitize_title( $post->post_title, $post_ID );
    $subtitle = sanitize_title( get_field( 'subtitle', $post_ID ), '' );
    if (empty( $subtitle ) || strpos( $new_slug, $subtitle ) !== false)
        return; // No subtitle or already in slug

    $new_slug .= '-' . $subtitle;
    if ($new_slug == $post->post_name)
        return; // already set

    // unhook this function to prevent infinite looping
    remove_action( 'save_post', 'slug_save_post_callback', 10, 3 );
    // update the post slug (WP handles unique post slug)
    wp_update_post( array(
        'ID' => $post_ID,
        'post_name' => $new_slug
    ));
    // re-hook this function
    add_action( 'save_post', 'slug_save_post_callback', 10, 3 );
}
add_action( 'save_post', 'slug_save_post_callback', 10, 3 );

slugを生成して更新します。 WPによって生成された以前のスラッグは、title/slugがすでに別の投稿で使用されている場合は一意の番号を持つことがあるため、再利用できません。だから、私はタイトルを消毒します。それから、wp_update_postは、wp_unique_post_slugを持つ新しいスラッグの重複がないことを確認します。

私が公開時にのみこれを行うことができる唯一の方法は、作成と変更された時間を比較することです。投稿が作成されたときにのみ等しくなります。 $updateパラメータは、公開用のtrueなので、役に立ちません。

4
IvanRF