web-dev-qa-db-ja.com

カスタム投稿メタ値を使用して投稿コンテンツを一括更新する方法

WPAlchemy を使ったカスタムメタボックスがあります。ただし、特定のカスタムメタ値が設定されているすべての投稿を取得し、投稿コンテンツの先頭に挿入してから、そのメタ値を削除します。

この投稿 投稿の先頭にコンテンツを追加することはできましたが、アクセスして追加したカスタムメタ値を追加することができたため、親密になりました。私はまた、WordPressに接続して自分のアクションを実行するタイミングが少し不確かです。

これに取り組むための最良の方法について何か提案がありますか?私は単純なプラグインを作成し、それをアクティブにし、それが仕事をさせ、そしてそれを削除するだろうと考えました。

2
Luke

起動時にこのようなものはどうですか?

function wpa47153_run_once(){

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

    foreach($posts as $p) :  

        $meta = get_post_meta($p->ID, 'meta_key',true);

        if($meta) :

            $my_post = array();
            $my_post['ID'] = $p->ID;
            $my_post['post_content'] = $meta . "<br/>"  . $p->post_content ;

            // Update the post into the database
            wp_update_post( $my_post );
        unset($my_post);

            //remove the meta key
            delete_post_meta($p->ID, 'meta_key');

        endif;

    endforeach; 


}

get_postsとget_post_metaはあなたの状況に合わせて調整されます。

3
helgatheviking

私はむしろhelgathevikingの投稿へのコメントとしてこれを投稿したほうがよいですが、私はこのSEサイトで評判がないので、私は新しい投稿をしています。管理者が役に立たないと思った場合は、削除してください。

Helgaの例は素晴らしく動作しますが、カスタム保存ハンドラが設定されている場合、投稿画面でメタボックスをチェックして更新を保存し、空の値で削除すると、helgaのスクリプトは消去されますカスタム保存ハンドラを一時停止しない場合は、他のすべてのメタデータ。例えば:

add_action('save_post', 'etm\save_custom_fields');
function save_custom_fields( $postId ) {

    //avoid accidental duplication
    return; //remove this when not using helga's function anylonger

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

    //add your custom meta fields here
    $fields = array( 'meta-key-1', 'meta-key-2', '...' );

    foreach( $fields as $metaName ):

        //keep a flag if it's been updated
        $new = false;
        //get the existing value
        $old = get_post_meta( $postId, $metaName, true );

        //update the flag with the new value
        if ( isset( $_POST[ $metaName ] ) ) {
            $new = $_POST[ $metaName ];
        }

        //add/update or delete the meta
        if( $new && $new != $old ) {
            update_post_meta( $postId, $metaName, $new, $old ); //also acts to add

        } elseif( !$new )  {
            delete_post_meta( $postId, $metaName, $old );
        }

    endforeach;     
}

私は今、開発サイトでこの間違いを犯しました。ありがたいことに、Helgaのスクリプトを実行する前にデータベースをバックアップしました(これは完璧に動作します)。しかし、カスタムメタスクリプトやカスタム保存処理を使用しているのは私だけではないため、これは重要な注意点であると思いました。

1
Elliott Post