2017-10-04 20 views
0

WordPressのserveral Custom Post Typesを使用しています。 すべてのユーザーは、会社プロファイルを「会社」という特定の投稿タイプとして追加できます。 ユーザーに会社のプロフィールがある場合、彼はジョブ、イベントなどのようなコンテンツを追加できます。すべて特定のカスタム投稿タイプとして定義されています。WordPress:1つの投稿が削除された後にすべての投稿を削除します。

ユーザーが自分の会社のプロフィールを削除することもできます。 そうすれば、ユーザーからの他のすべての投稿も削除する必要があります(通常の投稿は除きます)。URLをホームページにリダイレクトする必要があります(301)。

WPドキュメント(https://codex.wordpress.org/Plugin_API/Action_Reference/delete_post)で「delete_post」というアクションが見つかりました。しかし、私はどのようにそれを発射するか分からない。

ヒントはありますか?

EDITは:よう

答えて

1

解決策が見つかりました。問題は、アクション 'delete_post'でした。 私はPost Status Transitionsに基づいて 'trash_to_publish'に変更しました:https://codex.wordpress.org/Post_Status_Transitions

すべて正常です。私は会社のプロファイルをuntrash場合は、再度、ユーザーからのすべての投稿を公開の機能を使用することができますボーナスとして

/** * Deletes all posts from author of company profile. */ function delete_all_posts_from_author($post_id) { global $post; $id = $post->ID; // Only trigger if post type is "company" if (get_post_type($id) == "company") { $author_id = $post->post_author; $posts_from_author = get_posts( array( 'posts_per_page' => -1, 'post_status' => 'publish', 'post_type' => array('event','job'), 'author' => $author_id, 'fields' => 'ids', // Only get post ID's ) ); foreach ($posts_from_author as $post_from_author) { wp_trash_post($post_from_author, false); // Set to False if you want to send them to Trash. } } } add_action('publish_to_trash', 'delete_all_posts_from_author', 10, 1); 

/** 
* Untrash posts if company profile is untrashed 
*/ 
function untrash_all_posts_from_author($post_id) { 


    global $post; 
    $id = $post->ID; 

    if (get_post_type($id) == "company") { 

     $author_id = $post->post_author; 

     $posts_from_author = get_posts(
      array(
       'posts_per_page' => -1, 
       'post_status'  => 'trash', 
       'post_type'   => array('event','job'), 
       'author'   => $author_id, 
       'fields'   => 'ids', // Only get post ID's 
      ) 
     ); 

     foreach ($posts_from_author as $post_from_author) { 
      wp_untrash_post($post_from_author); // Set to False if you want to send them to Trash. 
     } 
    } 


} 

add_action('trash_to_publish', 'untrash_all_posts_from_author', 10, 1); 

私が間違いをした場合は、私に知らせてください。

EDIT:wp_delete_post()のみネイティブ投稿、ページ、および添付ファイルに適用されますので、私はwp_trash_post()に引数wp_delete_post()を変更しました。ここで@rarstからの素晴らしい答え:https://wordpress.stackexchange.com/questions/281877/error-after-deleting-custom-post-type-with-a-function-no-trash-used/281888#281888

+0

いいえ:)唯一のことwp_untrash_post()は1つのパラメータを取るだけですが、これは堅実です。 –

+0

ああ、ヒントありがとう。私はそれを変更します:) – Cray

+0

@ DanielH.Jと同じです。と言われましたが、 'wp_trash_post()'、@Crayについてはそうです。 1つのパラメータ、post_idだけが必要です。おそらく 'wp_delete_post()'と混同していると思いますか? –

1

何かの下に私の答えを参照してください:

// Add action trigger 
add_action('delete_post', 'delete_other_custom_posts', 10); 

function delete_other_custom_posts($post_id) { 
    global $wpdb; 
    $post = get_post($post_id); 

    // Only trigger if post type is "company" 
    if ($post->post_type == "company") { 
     $author_id = $post->post_author; 

     // Find other custom posts' ids by the same user 
     $posts_to_delete = $wpdb->get_col(
      $wpdb->prepare(
       "SELECT ID FROM {$wpdb->prefix}posts WHERE post_status = 'publish' AND post_author = %d AND post_type IN (<put your custom post types' slugs here>)", 
       $author_id 
      ), ARRAY_A 
     ); 

     if ($posts_to_delete) { 
      foreach ($posts_to_delete as $post_delete_id) { 
       // Delete the custom post 
       wp_delete_post($post_delete_id); 
      } 
     } 

     // Redirect 
     wp_redirect(<page you want to redirect to>); 
     exit; 
    } 
} 
+0

私はそれを試みます。ありがとう! – Cray

+0

こんにちは、私はこのようなポストタイプのスラッグを追加しました: "post_type IN( 'イベント'、 'ジョブ')"しかし、残念ながらそれは動作しません? – Cray

+0

おそらくwp_delete関数のポストはカスタムポスト型のために悪いことではないでしょうか? WPドキュメントには、「投稿、添付ファイル、またはページを削除または削除する」と書かれています。 – Cray

0

それが可能です。 会社は投稿タイプですので、残りのコンテンツはタクソノミーになりますので、投稿メタを削除すると分類が削除されません。

<?php 
add_action('admin_init', 'codex_init'); 
function codex_init() { 
    add_action('delete_post', 'codex_sync', 10); 
} 

function codex_sync($pid) { 
    global $wpdb; 
    if ($wpdb->get_var($wpdb->prepare('SELECT post_id FROM .'$wpdb->prefix.'postmeta WHERE post_id = %d', $pid))) { 
     $wpdb->query($wpdb->prepare('DELETE FROM '.$wpdb->prefix.'postmeta WHERE post_id = %d', $pid)); 
    } 
} 
?> 
+0

ありがとうでしたが、残りのコンテンツもタクソノミではない投稿タイプです – Cray

関連する問題