投稿のタイトルからナメクジを再生成する


14

投稿のタイトルを変更した後、プログラムでナメクジを再生成することは可能ですか?多数の投稿タイトルが更新され、スラッグはタイトルで更新されなかったため、これらすべてのスラッグを再生成する必要があります。


私はこれを数回しなければならず、大きな配列を処理できないさまざまなサーバー環境間で(numberpostsがunlimitedに設定されている)、ページネーションと$ wpdbにより管理しやすく、パフォーマンスが向上します。同様の投稿でコードサンプルを提供しました
codearachnid

回答:


17

はい、可能です。

サンプルコードは、テストおよび改良する必要があります。

// get all posts
$posts = get_posts( array (  'numberposts' => -1 ) );

foreach ( $posts as $post )
{
    // check the slug and run an update if necessary 
    $new_slug = sanitize_title( $post->post_title );
    if ( $post->post_name != $new_slug )
    {
        wp_update_post(
            array (
                'ID'        => $post->ID,
                'post_name' => $new_slug
            )
        );
    }
}

私はちょうどこれを作り上げました、おそらくいくつかのエラーとエグゼのケースがありますが、それはあなたにアイデアを与えるはずです。また、これにはしばらく時間がかかる場合があるため、更新を小さなチャンクに分割すると便利です。


1
うーん...私の経験から、これは機能しません。post_name引数によって無視されwp_update_post、少なくともコアの3.9バージョンで
アレクサンドルBourlier

現在、関数post_name内では無視されwp_update_post()ますが、更新投稿がwp_insert_post()関数を呼び出すときに考慮されます:これは、更新に新しいスラッグを渡すと、更新される投稿に対して効果的に変更されることを意味します。
エレノールパス


1

Toschoが提案する「本能的な方法」を試してみましたが、多くの場合は機能しません(コアコードを参照して「多くの場合」の意味を理解してください)。

コードを見ると、データベースにポストを挿入する直前に関数wp_insert_post_dataによって呼び出されるフィルターフックが見つかりましたwp_update_post

このフィルターを呼び出し、の値を変更することで$data['post_name']、これを適切に機能させることができました。Wordpressはクールですが、文書化が不十分です...

必要に応じてより多くの人がこの回避策を見つけることができるように、ドキュメントを編集しました


wp_update_postがpost_nameを上書きする理由を指摘できますか?これが起こる唯一の理由は、post_nameを変更しようとしているユーザーが投稿者(または同じレベル)のみである場合です。 post_nameは上書きされますか?
jnhghy -アレクサンドルJantea

はい、これが適切な方法です。あなた@Alexandreをありがとう
user88731

-1

必要に応じてmysqlで直接これを行うことができます。(当社のwoocommerceサイトには何十万もの製品があります):

update wp_posts set post_name = concat(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(lower(post_title), '"', ''), "'", ''), ",", '-'), " ", '-'), "&", ''), ";", ''), "@", ''), ".", ''), ":", ''), "/", ''), "+", ''), "(", ''), ")", ''), "--", '-'), "---", '-'), "--", '-'), "--", '-'), '-', id) where post_type = 'product';

where post_type = 'product'-woocommerce製品のみへの更新を保持します。このクエリに保持する制限を把握する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.