web-dev-qa-db-ja.com

カスタムフィールドに基づくタイトルと投稿のURL

カスタム投稿タイプにカスタムフィールドがあります。それらはタイトルとして機能し、URLのスラグを投稿します。基本的に、カスタムフィールドの内容を変更するたびに、タイトルフィールドはそれに応じて反応するはずです。例えば。フィールドNAMEに 'John'とSURNAME 'Smith'が含まれている場合、タイトルは 'John Smith'に変換されます。

このサイトのユーザーは経験が浅いので、NAMEとSURNAME、それに別のタイトルを付ける必要性を理解できないでしょう。それが私がそれを必要とする理由です。

テンプレートでタイトルの代わりにカスタムフィールドコンテンツを表示できることはわかっていますが、同じではありません。それに応じてパーマリンクも修正する必要があります。

だから私の入力を要約すると:カスタムフィールドNAME = JohnカスタムフィールドSURNAME = Smithどうすればいいのか:投稿タイトル= John Smithパーマリンク= john-smith

私はそれが今明らかになっていると思います。何か提案を本当にありがとう。

2
polish bastard

あなたが望むことをする良い方法は wp_insert_post_data フィルタをフックすることです。ここで、投稿がデータベースに保存される前に、投稿のタイトルとスラッグを変更することができます。

add_filter( 'wp_insert_post_data', 'wpse_update_post_title_and_slug' );
function wpse_update_post_title_and_slug( $data ) {

    //You can make some checks here before modify the post data.
    //For example, limit the changes to standard post type
    if( 'post' == $data['post_type'] ) {

        //Add post meta to post title
        $data['post_title'] = $_POST['the-name-field'] . ' ' . $_POST['the-surname-field'];

        //Update the slug of the post for the URL
        $data['post_name'] = sanitize_title( $data['post_title'] );

    }

    return $data;

}
1
cybmeta

代替案があります、タイトルを設定しないでください。代わりに、それをフィルタリングしてください。

Codexで示されているように、これはthe_titleフィルタです。

function suppress_if_blurb($title, $id) {
    if (in_category('blurb', $id)) {
        return '';
    }
    return $title;
}
add_filter('the_title', 'suppress_if_blurb', 10, 2);

代わりに次のようにしたとします。

function wpse144041_modify_title($title, $id) {
    if ( get_post_type( $id ) == 'yourposttype' ) {
        $first = get_post_meta( $id, 'first', true );
        $last = get_post_meta( $id, 'last', true );
        $title = $first.' '.$last;
    }
    return $title;
}
add_filter('the_title', 'wpse144041_modify_title', 10, 2);

それからタイトルフィールドは今は無関係であり、あなたの投稿タイプのフロントエンドのタイトルとして姓と名を表示します。関連するフィールドと投稿タイプの名前が一致するように調整してください

0
Tom J Nowell