2014-10-06 2 views
2

미디어 편집 화면에 페이지 첨부 기능을 추가하는 방법이 있습니까? 따라서 미디어 항목을 추가/편집하면 페이지에 첨부/다시 첨부 할 수 있습니다.WordPress - 용지 편집 화면에 페이지/첨부 파일 첨부 기능 추가

function my_post_submitbox_misc_actions($id){ 
    $post = get_post($id); 
    if($post->post_parent > 0) { 
     if(get_post($post->post_parent)) { 
      $title = _draft_or_post_title($post->post_parent); 
     } 
    ?> 
    <div class="misc-pub-section misc-pub-attachment"> 
     Attached to: <strong><a href="<?php echo get_edit_post_link($post->post_parent); ?>"><?php     echo $title ?></a></strong> 
    (<a class="hide-if-no-js" onclick="findPosts.open(''media[]'', '<?php echo $post->ID ?>' );return false;" href="#the-list"><?php _e('Re-Attach'); ?></a>) 
    </div> 
    <?php 
    } else { ?> 
     <?php _e('(Unattached)'); ?><br /> 
     <a class="hide-if-no-js" onclick="findPosts.open('media[]', '<?php echo $post->ID ?>' );return false;" href="#the-list"><?php _e('Attach'); ?></a> 
    <?php 
    } 
} 
add_action('attachment_submitbox_misc_actions', 'my_post_submitbox_misc_actions'); 

을 그리고 여기에 데이터베이스에 내 전화입니다 : 여기

내가 지금까지 가지고있는 코드의

global $wpdb; 

$wpdb->query($wpdb->prepare("UPDATE $wpdb->posts SET post_parent = %d WHERE post_type = 'attachment'", $parent_id)); 

    if (isset($attached)) { 
    $location = 'upload.php'; 
    if ($referer = wp_get_referer()) { 
     if (false !== strpos($referer, 'upload.php')) 
     $location = $referer; 
    } 

    $location = add_query_arg(array('attached' => $attached) , $location); 
    wp_redirect($location); 
    } 

enter image description here

답변

0

그래서 다니엘과 약간의 연구에서 약간의 도움을 받아 마침내 효과를 낼 수있었습니다! 여기 내 코드는 지금 보이는 방법은 다음과 같습니다

function spd_submitbox_misc_actions($id) { 
    global $pagenow, $typenow; 
    // We only want to run the code on a specific page 
    if($pagenow != 'post.php' || $typenow != 'attachment') { 
     return; 
    } 
    $post = get_post($id); 

    if($post->post_parent > 0) { 
     if(get_post($post->post_parent)) { 
      $title = _draft_or_post_title($post->post_parent); 
     } 

     ?> 
     <div class="misc-pub-section misc-pub-attachment"> 
      Attached to: <strong><a href="<?php echo get_edit_post_link($post->post_parent); ?>"><?php echo $title ?></a></strong> 
      <a class="hide-if-no-js" onclick="findPosts.open('action','find_posts');return false;" href="#"><?php _e(' (Re-Attach) '); ?></a> 
     </div> 
    <?php 
    } else { ?> 
     <div class="misc-pub-section misc-pub-attachment"> 
      Attached to: (Unattached) <a class="hide-if-no-js" onclick="findPosts.open('action','find_posts');return false;" href="#"><?php _e('Attach'); ?></a> 
     </div> 
    <?php 
    } 
} 
add_action('attachment_submitbox_misc_actions', 'spd_submitbox_misc_actions'); 
// Function to call the find_posts_div pop up OUTSIDE the post form 
function spd_post_submitbox_misc_form() { 
    global $pagenow, $typenow; 

    // We only want to run on edit media page 
    if($pagenow != 'post.php' || $typenow != 'attachment') 
     return; 

    // Enqueue our scripts 
    wp_enqueue_style('thickbox'); 
    wp_enqueue_script('thickbox'); // needed for find posts div 
    wp_enqueue_script('media'); 
    wp_enqueue_script('wp-ajax-response'); 
    $send_to = get_template_directory_uri() . '/inc/spdfunctions/spd_post_actions.php'; 

    ?> 
    <form name="attach-to-post" method="post" action="<?php echo $send_to; ?>"> 
     <?php find_posts_div(); ?> 
     <input type="hidden" name="attach-to-post" value="attach" /> 
     <input type="hidden" name="attachment-id" value="<?php the_ID(); ?>" /> 
    </form> 
<?php 
} 
add_filter('admin_footer','spd_post_submitbox_misc_form'); 

그런 다음 제출을 처리하기 위해 :

if ($_REQUEST['action'] && isset($_POST['attach-to-post'])) { 

    $location = $_SERVER['DOCUMENT_ROOT']; 
    include($location . '/wp-load.php'); 

    $parent_id = $_POST['found_post_id']; 
    $attach_id = (int) $_POST['attachment-id']; 

    $attached = $wpdb->query($wpdb->prepare("UPDATE $wpdb->posts SET post_parent = %d WHERE post_type = 'attachment' AND ID IN (%d)", $parent_id, $attach_id)); 

    //redirect back to edit media screen 
    if (isset($attached)) { 
     $referer = wp_get_referer(); 
     $location = add_query_arg(array('attached' => $attached) , $referer); 
     wp_redirect($location); 
    } 
} 

다시 한 번 감사드립니다, 다니엘, 모든 도움. 대단히 감사하게 생각합니다!

+0

문제 없음 ... 다행스럽게 생각합니다! 추신 솔루션에서 spd_submitbox_misc_actions 및 spd_post_submitbox_misc_form을 두 번 호출합니다. 다른 사람들이 혼란스럽지 않도록 중복 기능을 제거하도록 코드를 업데이트하십시오. –

1

I했습니다 내 기능에, 이러한 결합 기능을 사용 .php 파일을 사용하여 테이블의 각 미디어 항목에 대한 미디어 라이브러리 (admin 영역의 upload.php)에 링크를 추가하여 해당 항목을 어떤 항목에 첨부/다시 첨부 할 수 있습니다.

// Functions to allow one to re-attach an image to a post 
function upload_columns($columns) { 
    // Unset($columns['parent']); 
    $columns['better_parent'] = 'Re-Attach'; 
    return $columns; 
} 
add_filter('manage_upload_columns', 'upload_columns'); 
function media_custom_columns($column_name, $id) { 
    $post = get_post($id); 
    if($column_name != 'better_parent') 
     return; 
    if($post->post_parent > 0) { 
     if(get_post($post->post_parent)) { 
      $title = _draft_or_post_title($post->post_parent); 
     } 
     ?> 
     <strong><a href="<?php echo get_edit_post_link($post->post_parent); ?>"><?php echo $title ?></a></strong>, <?php echo get_the_time(__('Y/m/d')); ?> 
     <br /> 
     <a class="hide-if-no-js" onclick="findPosts.open('media[]', '<?php echo $post->ID ?>');return false;" href="#the-list"><?php _e('Re-Attach'); ?></a> 
     <?php 
    }else { 
     ?> 
     <?php _e('(Unattached)'); ?><br /> 
     <a class="hide-if-no-js" onclick="findPosts.open('media[]', '<?php echo $post->ID ?>');return false;" href="#the-list"><?php _e('Attach'); ?></a> 
     <?php 
    } 
} 
add_action('manage_media_custom_column', 'media_custom_columns', 10, 2); 

나는 이것이 당신이 묘사하고있는 곳에 옵션을 두지는 않지만, 올바른 방향으로 시작한다는 것을 알고있다.

업데이트 :이 경우 누군가에 위의 코드를 떠날거야

참고는 라이브러리 테이블에 다시 연결 옵션을 가지고 싶어. 귀하의 질문에 관해서는

가 ... 여기 코드, 설명은 다음과 같이하십시오

function my_post_submitbox_misc_actions($id) { 
    global $pagenow, $typenow; 
    // We only want to run the code on a specific page 
    if($pagenow != 'post.php' || $typenow != 'attachment') { 
     return; 
    } 
    $post = get_post($id); 

    if($post->post_parent > 0) { 
     if(get_post($post->post_parent)) { 
      $title = _draft_or_post_title($post->post_parent); 
     } 
     ?> 
     <div class="misc-pub-section misc-pub-attachment"> 
      Attached to: <strong><a href="<?php echo get_edit_post_link($post->post_parent); ?>"><?php echo $title ?></a></strong> 
      (<a class="hide-if-no-js" onclick="findPosts.open('action','find_posts');return false;" href="#"><?php _e('Re-Attach'); ?></a>) 
     </div> 
     <?php 
    } else { 
     _e('(Unattached)'); ?><br /> 
     <a class="hide-if-no-js" onclick="findPosts.open('action','find_posts');return false;" href="#"><?php _e('Attach'); ?></a> 
     <?php 
    } 
} 
add_action('attachment_submitbox_misc_actions', 'my_post_submitbox_misc_actions'); 
// Function to call the find_posts_div pop up OUTSIDE the post form 
function my_post_submitbox_misc_form() { 
    global $pagenow, $typenow; 
    // We only want to run the code on a specific page 
    if($pagenow != 'post.php' || $typenow != 'attachment') { 
     return; 
    } 
    // Enqueue our scripts 
    wp_enqueue_style('thickbox'); 
    wp_enqueue_script('thickbox'); // needed for find posts div 
    wp_enqueue_script('media'); 
    wp_enqueue_script('wp-ajax-response'); 
    ?> 
    <form name="plugin_form" id="plugin_form" method="post" action="/wp-content/themes/<?php echo get_template() . '/test.php'; ?>"> 
     <?php 
      wp_nonce_field('plugin_nonce'); 
      find_posts_div(); 
     ?> 
    </form> 
    <?php 
} 
add_filter('admin_footer','my_post_submitbox_misc_form'); 

고장

첫 번째 기능은 이미 위의 코드에있는 것과 매우 유사하다. 내가 만든 유일한 변경 사항은 첨부 파일 수정 페이지에서이 코드를 실행하는지 확인하기위한 검사를 추가하는 것입니다. 내가 테스트 한 것처럼 이것을 조정할 필요가 있지만 완전히 조정할 필요는 없습니다.

나는 또한 우리가 findPosts.open()이라고 부르는 방식을 바 꾸었습니다. 이제 우리는 'action'이라는 변수를 전달하고 'find_posts'에 값을 설정하여 나중에 확인할 수 있습니다 ...

첫 번째 함수는 첨부 파일이 이미 첨부 된 게시물을 표시하고 - 원하는 경우 지정하거나 ... 첨부 옵션 만 보여줍니다. 다시 부착하고 첨부하는 것은 링크 일 뿐이며 클릭 할 때 findPosts.open()을 실행하면 페이지의 숨겨진 div/입력을 찾습니다. 아직 작성하지 않았습니다.

두 번째 기능은 키입니다 ... 먼저 스크립트와 하나의 스타일을 대기열에 넣어야합니다. 여기서 코드 가져 오기 부분은 find_posts_div() 호출입니다. 이것이 마법을 발생시키는 것입니다. 그러나이 모든 것은 숨겨진 div와 양식 필드를 팝업으로 호출하는 것입니다 (첫 번째 함수에서 우리 앵커). 이것은 add_filter를 사용하여 포스트 폼의 OUTSIDE 함수를 호출 할 수 있도록 별도의 함수로되어 있어야합니다.

처음에는 모든 기능을 하나의 기능으로 통합하려고했습니다. 브라우저는 우리의 <form> 태그를 제거합니다. 왜냐하면 우리는 다른 양식 (게시 양식) 안에 양식을 놓으려고 시도하고 있기 때문입니다. 그래서 admin_footer에서 호출하여 폼 외부에 코드를로드합니다.

양식에 find_posts_div()을 입력하면 양식의 결과를 원하는 곳으로 제출하고 원하는 모든 작업을 수행 할 수 있습니다. 여기서는 새 페이지 (test.php)를 만들고 결과를 제출하므로 필요한 것을 처리 할 수 ​​있습니다.다음과 같이

지금까지 test.php 페이지입니다 :이 ... 당신에게 $ _POST의 모든 값을 보여 더 숨겨진 가치와 무엇을하지를 추가 부담 만됩니다

<?php 
    echo '<pre>';print_r($_POST);echo '</pre>'; 
    die(); 
?> 

' found_post_id '값은 팝업에서 선택한 값의 게시물 ID입니다. 그런 다음 upload.php의 103 - 141 행을 확인하여 실제 다시 첨부 할 코드를 찾을 수 있습니다. 후크 나 더 나은 것이 있을지 모르지만, 볼 시간이 없었습니다.

희망이 도움이됩니다.

+0

답장을 보내 주셔서 감사합니다. 지금까지는 '미디어 편집'화면의 올바른 위치에 배치했지만 첨부/다시 첨부를 클릭하면 게시 대화 상자가 열리지 않습니다. 스크립트를 대기열에 추가해야합니까? – Shapada

+0

아니 ...이 코드 외에는 아무 것도 필요하지 않습니다. 어딘가 다른 문제가있을 수 있습니까? 갈등이 있니? 확인하고 방화 광에서 JS 오류가 발생하는지 확인하십시오. "add_filter"및 "add_action"을 모두 호출하고 함수 이름이 올바른지 확인하십시오. –

+0

미디어 라이브러리에 사용자 정의 열을 만들지 않으면 왜 필터/액션 후크가 필요합니까? – Shapada

관련 문제