Simplicityの特徴 › フォーラム › 要望・機能追加など › wp_insert_post() で新規投稿した時のスラッグ
- このトピックには5件の返信、2人の参加者があり、最後にroidにより7年前に更新されました。
-
投稿者投稿
-
-
gblsmゲスト
初めて投稿します。
Simplicity2 のバージョン 2.1.0 20160227p を使用中に、WordPress関数の wp_insert_post() で投稿を新規作成したときのスラッグについてです。
「日本語のスラッグを有効にする」にチェックが入れてあるときは大丈夫なのですが、チェックを外した状態で日本語タイトルの投稿を新規作成すると、作られた投稿のスラッグが必ず post-0 になってしまいます。
例えば3つ作ると、投稿IDは違うものが3つなのにスラッグだけが同じになります。管理画面から投稿したときは大丈夫なのですが、関数で投稿(プラグインなどから)を作る場合でも正しくスラッグがつく方が良いと思います。(FeedWordPress というプラグインで偶然発見しました。)
WordPress 4.4.2 と 4.5 の両方で確認しました。
以下のコードで再現します。for ( $i = 0; $i < 3; $i++ ) { $my_post = array( 'post_title' => 'あいう', 'post_content' => "かきく + " . date( 'r' ), 'post_status' => 'publish', 'post_author' => 1, 'post_category' => array( 1 ) ); $my_post2 = $my_post; $my_post2['post_title'] = 'ABCDEFG'; $my_id = wp_insert_post( $my_post ); $my_id2 = wp_insert_post( $my_post2 ); $my_slug = get_post( $my_id )->post_name; $my_slug2 = get_post( $my_id2 )->post_name; echo "<div>id: $my_id = slug: $my_slug</div>"; echo "<div>id2: $my_id2 = slug2: $my_slug2</div>"; }
なお、先にWordPress公式フォーラムに書きましたのでマルチポストになってしまいました。申し訳ありませんがよろしくお願いいたします。
-
gblsmゲスト
原因がほぼ特定できたので追記します。
「日本語のスラッグを有効にする」のチェックが外れているとき、フィルター wp_unique_post_slug でスラッグを自動生成します。そこで 投稿タイプ-投稿ID をスラッグにしているのですが、wp_insert_post() で新規投稿を作るときは投稿IDがゼロです。そのためいつでも post-0 になります。
Simplicity2 がフックしている関数は以下の記事のコードが元になっていると思います。
WordPress の投稿スラッグを自動的に生成する | Simple Colors
フォーラム » 記事のスラッグ名を自動的に記事IDにしたい — WordPressfunction auto_post_slug( $slug, $post_ID, $post_status, $post_type ) { if ( preg_match( '/(%[0-9a-f]{2})+/', $slug ) ) { $slug = utf8_uri_encode( $post_type ) . '-' . $post_ID; } return $slug; } add_filter( 'wp_unique_post_slug', 'auto_post_slug', 10, 4 );
-
gblsmゲスト
回避策の提案です。functions.php 内の auto_post_slug() を次のように変更。
function auto_post_slug( $slug, $post_ID, $post_status, $post_type ) { if ( empty( $post_ID ) ) return ‘’; // 新規投稿でIDがゼロの場合はスラッグを未定とし、IDがついた後にスラッグを決める if ( preg_match( '/(%[0-9a-f]{2})+/', $slug ) && ( $post_type == 'post' || $post_type == 'page') ) {//投稿もしくは固定ページのときのみ実行する $slug = utf8_uri_encode( $post_type ) . '-' . $post_ID; } return $slug; }
-
わいひらキーマスター
それだと、記事を編集中に公開もしくは、下書きを保存などでポストしないとスラッグ入力欄が表示されなくなります。
そうなってしまうと、僕的には、使い勝手が悪くなってしまいます。
なので、更なる回避策として以下のように書いてみたのですが、これでどうでしょうか。//最新記事の投稿IDを取得する if ( !function_exists( 'get_the_latest_ID' ) ): function get_the_latest_ID() { global $wpdb; $row = $wpdb->get_row("SELECT ID FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC"); return !empty( $row ) ? $row->ID : 0; } endif; //WordPress の投稿スラッグを自動的に生成する if ( !function_exists( 'auto_post_slug' ) ): function auto_post_slug( $slug, $post_ID, $post_status, $post_type ) { $type = utf8_uri_encode( $post_type ); if ( empty( $post_ID ) ){//IDがまだ指定されていないとき $slug = $type . '-' . strval(get_the_latest_ID() + 1); //最新記事のIDに+1 } elseif ( preg_match( '/(%[0-9a-f]{2})+/', $slug ) && ( $post_type == 'post' || $post_type == 'page') ) {//投稿もしくは固定ページのときのみ実行する $slug = $type . '-' . $post_ID; } return $slug; } endif;
-
roidゲスト
同じ現象に遭遇したので以下で解決できました!
// wp_insert_post後に以下を記述
global $wpdb;
$wpdb->flush();
$wpdb->update( $wpdb->posts, array(
‘post_name’ => sprintf(‘%s-%s’,ポストタイプ, $post_id),
), array(
‘ID’ => $post_id,
), array(‘%s’),
array(‘%d’) ); -
roidゲスト
// wp_insert_post後に以下を記述 global $wpdb; $wpdb->flush(); $wpdb->update( $wpdb->posts, array( ‘post_name’ => sprintf(‘%s-%s’,ポストタイプ, $post_id), ), array( ‘ID’ => $post_id, << wp_insert_postより取得する ), array(‘%s’), array(‘%d’) );
-
-
投稿者投稿