wp_insert_post() で新規投稿した時のスラッグ

Simplicityの特徴 フォーラム 要望・機能追加など wp_insert_post() で新規投稿した時のスラッグ

  • このトピックには5件の返信、2人の参加者があり、最後にroidにより7年前に更新されました。
5件の返信スレッドを表示中
  • 投稿者
    投稿
    • #39603 返信
      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公式フォーラムに書きましたのでマルチポストになってしまいました。申し訳ありませんがよろしくお願いいたします。

    • #39611 返信
      gblsm
      ゲスト

      原因がほぼ特定できたので追記します。
      「日本語のスラッグを有効にする」のチェックが外れているとき、フィルター wp_unique_post_slug でスラッグを自動生成します。そこで 投稿タイプ-投稿ID をスラッグにしているのですが、wp_insert_post() で新規投稿を作るときは投稿IDがゼロです。そのためいつでも post-0 になります。
      Simplicity2 がフックしている関数は以下の記事のコードが元になっていると思います。
      WordPress の投稿スラッグを自動的に生成する | Simple Colors
      フォーラム » 記事のスラッグ名を自動的に記事IDにしたい — WordPress

      function 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  );
      
    • #39629 返信
      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;
      }
      
    • #39730 返信
      アバター画像わいひら
      キーマスター

      それだと、記事を編集中に公開もしくは、下書きを保存などでポストしないとスラッグ入力欄が表示されなくなります。
      そうなってしまうと、僕的には、使い勝手が悪くなってしまいます。
      なので、更なる回避策として以下のように書いてみたのですが、これでどうでしょうか。

      //最新記事の投稿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;
    • #51780 返信
      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’) );

    • #51781 返信
      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’) );
5件の返信スレッドを表示中
返信先: wp_insert_post() で新規投稿した時のスラッグで#51781に返信
あなたの情報:




スポンサーリンク
アドセンス(大)
アドセンス(大)