投稿のタイトルを変更した後、プログラムでナメクジを再生成することは可能ですか?多数の投稿タイトルが更新され、スラッグはタイトルで更新されなかったため、これらすべてのスラッグを再生成する必要があります。
投稿のタイトルを変更した後、プログラムでナメクジを再生成することは可能ですか?多数の投稿タイトルが更新され、スラッグはタイトルで更新されなかったため、これらすべてのスラッグを再生成する必要があります。
回答:
はい、可能です。
サンプルコードは、テストおよび改良する必要があります。
// 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
)
);
}
}
私はちょうどこれを作り上げました、おそらくいくつかのエラーとエグゼのケースがありますが、それはあなたにアイデアを与えるはずです。また、これにはしばらく時間がかかる場合があるため、更新を小さなチャンクに分割すると便利です。
post_name
引数によって無視されwp_update_post
、少なくともコアの3.9バージョンで
post_name
内では無視されwp_update_post()
ますが、更新投稿がwp_insert_post()
関数を呼び出すときに考慮されます:これは、更新に新しいスラッグを渡すと、更新される投稿に対して効果的に変更されることを意味します。
このプラグインは次の役割も果たします:http : //www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs
ただし、まだスラッグを持たない投稿に対してのみ行うため、スラッグを再生成する必要がある場合は、プラグインの次の行を編集します。
if ($post->post_name == "") {
たとえば、次のように変更できます。
if (true) {
Toschoが提案する「本能的な方法」を試してみましたが、多くの場合は機能しません(コアコードを参照して「多くの場合」の意味を理解してください)。
コードを見ると、データベースにポストを挿入する直前に関数wp_insert_post_data
によって呼び出されるフィルターフックが見つかりましたwp_update_post
。
このフィルターを呼び出し、の値を変更することで$data['post_name']
、これを適切に機能させることができました。Wordpressはクールですが、文書化が不十分です...
必要に応じてより多くの人がこの回避策を見つけることができるように、ドキュメントを編集しました。
必要に応じて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製品のみへの更新を保持します。このクエリに保持する制限を把握する必要があります。