web-dev-qa-db-ja.com

保存時にタイトルからスラッグを自動生成するよう強制的にします

私はアパートの区画で多くの不動産が売られている不動産サイトを運営しています。

このため、コンテンツ編集者が行うことは、すべての詳細を含む投稿/プロパティを作成してから、他のものを作成するために重複した投稿プラグインを使用することです。

投稿/プロパティを複製するたびに、プロパティ番号を反映するようにタイトルを変更し、メタデータE.Gの価格を数ビット変更する可能性があります。

彼らが忘れているのは、ナメクジを一掃して、タイトルから新しいものを生成させることです。これは、最初に入力したプロパティのスラッグの例です。

merle-court-plot-50-182-carlton-vale-nw6-5hh

しかしそれらが複製されるとナメクジは次のようになります。

merle-court-plot-50-182-carlton-vale-nw6-5hh-2
merle-court-plot-50-182-carlton-vale-nw6-5hh-2-2
merle-court-plot-50-182-carlton-vale-nw6-5hh-2-2-2
merle-court-plot-50-182-carlton-vale-nw6-5hh-2-2-2-2
etc

しかし、彼らがタイトルを変えるとき、ナメクジはより良いようになるでしょう:

merle-court-plot-51-182-carlton-vale-nw6-5hh
merle-court-plot-52-182-carlton-vale-nw6-5hh
merle-court-plot-53-182-carlton-vale-nw6-5hh
merle-court-plot-54-182-carlton-vale-nw6-5hh
etc

だから私の質問:

プロパティのタイトルを更新した後に、保存後にスラッグを強制的に再生成するにはどうすればよいですか。

このCPTのスラッグは常に自動生成されるはずです。手動で設定する必要はありません。

7
Brady

最も簡単な回避策は次のとおりです。

function myplugin_update_slug( $data, $postarr ) {
    if ( ! in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) {
        $data['post_name'] = sanitize_title( $data['post_title'] );
    }

    return $data;
}
add_filter( 'wp_insert_post_data', 'myplugin_update_slug', 99, 2 );
16
Eugene Manuilov

また、スラッグをsanitize_title_with_dashes()から wp_unique_post_slug() まで実行して、一意であることを確認します。必要に応じて、自動的に「-2」、「-3」などが追加されます。

8
Pete Nelson

スペースを置き換える代わりに、組み込み関数 sanitize_title() を使うべきです。

このような:

sanitize_title( $post_title, $post->ID );

また、あなたはユニークなスラグを使うべきです。これは関数 wp_unique_post_slug() で得られます。

それで解決策をまとめると:

function myplugin_update_slug( $data, $postarr ) {
    if ( ! in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) {
        $data['post_name'] = wp_unique_post_slug( sanitize_title( $data['post_title'] ), $postarr['ID'], $data['post_status'], $data['post_type'], $data['post_parent'] );
    }

    return $data;
}
add_filter( 'wp_insert_post_data', 'myplugin_update_slug', 99, 2 );
4
jintux

私がしばらくの間予約していたのは、次のようなものです(まだテストされていません)。

ソースリンク

//add our action
add_action( 'save_post', 'my_save_post', 11, 2 );

function my_save_post($post_id, $post){

   //if it is just a revision don't worry about it
   if (wp_is_post_revision($post_id))
      return false;

   //if the post is an auto-draft we don't want to do anything either
   if($post->post_status != 'auto-draft' ){

       // unhook this function so it doesn't loop infinitely
       remove_action('save_post', 'my_save_post' );

      //this is where it happens -- update the post and change the post_name/slug to the post_title
      wp_update_post(array('ID' => $post_id, 'post_name' => str_replace(' ', '-', $_POST['post_title'])));

      //re-hook this function
      add_action('save_post', 'my_save_post' );
   }
}
3
userabuser