web-dev-qa-db-ja.com

投稿タイトルと投稿スラッグフィールドを自動インクリメントする方法

私はカスタム投稿タイプprjを持っており、投稿の保存時にpost_title(title)とpost_name(slug)を自動インクリメントする必要があります。投稿のステータスに関係なく更新します。問題 ..

SQLのAutoIncrementフィールドのように振る舞う必要があります。いったんIDが割り当てられると、それは決して複製されるべきではありません。

これまでのところ、私は下記のコードに到達しました。しかし問題はそれが投稿タイトルを設定するだけでスラッグではなくインクリメント機能も同様に機能していないということです..

add_filter( 'wp_insert_post_data' , 'odin_prj_title' , '99', 2 );
function odin_prj_title( $data , $postarr )
{
    if( $data['post_type'] == 'prj' ) {
        $last_post = wp_get_recent_posts( '1');
        $last_post_ID = (int)$last_post['0']['ID'];
        $data['post_title'] = 'P0' . ($last_post_ID + 1);
    }
    return $data;
}
1
Hassan Alvi

私はwp_count_posts関数を使って考え出しました、私は最後の総投稿数を得て、実行時にタイトルを保存することができます!条件を少し追加しました。

add_filter( 'wp_insert_post_data' , 'odin_prj_title' , 10, 2 );
function odin_prj_title( $data , $postarr )
{
    if( $data['post_type'] == 'prj' && $data['post_status'] != 'publish' ) {
        $count_posts = wp_count_posts('prj');
        $published_posts = $count_posts->publish;
        $data['post_title'] = 'P0' . ($published_posts + 1);
    }
    return $data;
}
1
Hassan Alvi

私はsave_postや他のsave-filterを使ってそれを解決しませんでした、それで私はタイトルのために同じことをするだけでよいので、私はdefault_titleフィルタを使いました。これはドラフトにも同様に機能することを意味します。

add_filter( 'default_title', 'change_title', 10, 2 );
function change_title( $title, $post ) {
    return 'PO' . $post->ID;
}

ここでは、新しく作成した投稿のIDを使用しているので、$ last_post_idを取得するときに取得する必要はありません。このようにしている場合は、必ずしも実行する必要はありません。ただし、タイトルを変更する前に投稿の種類を確認してください。

スラッグについても同じことをするようにはテストしていませんが、スラッグ用にwp_unique_post_slugという類似のフィルターがあることに気付きました。うまくいけば、これはあなたを助けるでしょう。 :)

編集:これはWPコアコードからのフィルタです、 https://developer.wordpress.org/reference/functions/wp_unique_post_slug/

1
Magnetize