0

ワードプレスのマルチサイトを使用しています。あるサイトに投稿すると、必要に応じて別のブログに同じ投稿を投稿する機能を作成しています。

私は現在 switch_to_blog() を使用しています。ここに私のコードがあります:

switch_to_blog(2);

$my_post = array(
  'post_title'    => $post_title,
  'post_content'  => $post_content,
  'post_status'   => 'publish',
  'post_author'   => $post_author,
  //'post_category' => array(8,39)
);

// Insert the post into the database
wp_insert_post( $my_post );

restore_current_blog();

上記は save_post アクションで実行されます。それは正常に動作し、両方のブログに投稿します。唯一の問題は、私が wp_insert_post に切り替えたブログがループに陥り、何千もの投稿が追加されていることです!

上記のコードからそれが起こる理由は何ですか?

4

1 に答える 1

0

これwp_insert_postは、 actionsave_postを呼び出すためです。つまり、ループです。アクションを削除し、投稿を挿入して、アクションを再度追加する必要があります。

最初の保存を制御する方法のアイデアは、save_post アクションの更新と新しい投稿の確認からです。また、新しい投稿を作成するときに save_post アクションが起動するのはなぜですか?も参照してください。. auto-draftとの投稿ステータスのチェックを追加しましたinherit

<?php
/* Plugin Name: Publish to Network */

add_action( 'save_post', 'cross_publish_so_17611289', 10, 2 );

function cross_publish_so_17611289( $post_id, $post_object )
{
    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return;

    if( defined( 'DOING_AJAX' ) && DOING_AJAX )
        return;

    # Block auto-drafts and revisions
    if( in_array( $post_object->post_status, array( 'auto-draft', 'inherit' ) ) )
        return;

    $termid = get_post_meta( $post_id, '_termid', true );

    # It's a new post
    if( empty( $termid ) )
    {
        update_post_meta( $post_id, '_termid', 'update' );
        remove_action( 'save_post', 'cross_publish_so_17611289' );
        switch_to_blog(2);
        $my_post = array(
          'post_title'    => $post_object->post_title,
          'post_content'  => $post_object->post_content,
          'post_status'   => 'publish',
          'post_author'   => $post_object->post_author,
        );
        wp_insert_post( $my_post );
        restore_current_blog();
        add_action( 'save_post', 'cross_publish_so_17611289', 10, 2 );
    }
}
于 2013-09-09T02:31:58.040 に答える