I'm using the below code in my wordpress functions.php file to create a custom meta box inside my custom post type in order to allow me to attach PDF's to my pages. However the link takes me to the attachment page as opposed to the file URL and i can't for the life of me work out why! Any help would be much appreciated.

add_action("admin_init", "pdf_init");
add_action('save_post', 'save_pdf_link');
function pdf_init(){
        add_meta_box("my-pdf", "PDF Document", "pdf_link", "post", "normal", "low");
        }
function pdf_link(){
        global $post;
        $custom  = get_post_custom($post->ID);
        $link    = $custom["link"][0];
        $count   = 0;
        echo '<div class="link_header">';
        $query_pdf_args = array(
                'post_type' => 'attachment',
                'post_mime_type' =>'application/pdf',
                'post_status' => 'inherit',
                'posts_per_page' => -1,
                );
        $query_pdf = new WP_Query( $query_pdf_args );
        $pdf = array();
        echo '<select name="link">';
        echo '<option class="pdf_select">SELECT pdf FILE</option>';
        foreach ( $query_pdf->posts as $file) {
           if($link == $pdf[]= $file->guid){
              echo '<option value="'.$pdf[]= $file->guid.'" selected="true">'.$pdf[]= $file->guid.'</option>';
                 }else{
              echo '<option value="'.$pdf[]= $file->guid.'">'.$pdf[]= $file->guid.'</option>';
                 }
                $count++;
        }
        echo '</select><br /></div>';
        echo '<p>Selecting a pdf file from the above list to attach to this post.</p>';
        echo '<div class="pdf_count"><span>Files:</span> <b>'.$count.'</b></div>';
}
function save_pdf_link(){
        global $post;
        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE){ return $post->ID; }
        update_post_meta($post->ID, "link", $_POST["link"]);
}
add_action( 'admin_head', 'pdf_css' );
function pdf_css() {
        echo '<style type="text/css">
        .pdf_select{
                font-weight:bold;
                background:#e5e5e5;
                }
        .pdf_count{
                font-size:9px;
                color:#0066ff;
                text-transform:uppercase;
                background:#f3f3f3;
                border-top:solid 1px #e5e5e5;
                padding:6px 6px 6px 12px;
                margin:0px -6px -8px -6px;
                -moz-border-radius:0px 0px 6px 6px;
                -webkit-border-radius:0px 0px 6px 6px;
                border-radius:0px 0px 6px 6px;
                }
        .pdf_count span{color:#666;}
                </style>';
}
function pdf_file_url(){
        global $wp_query;
        $custom = get_post_custom($wp_query->post->ID);
        echo $custom['link'][0];
}

If anybody would like to know, i also sourced this code from WPSnipp

有帮助吗?

解决方案

You should use the wp_get_attachment_url( $id ); function to get the attachment's url.

So your code will look more like this:

foreach ( $query_pdf->posts as $file) {
           if($link == $pdf[]= wp_get_attachment_url($file->ID)){
              echo '<option value="'.$pdf[]= wp_get_attachment_url($file->ID).'" selected="true">'.$pdf[]= wp_get_attachment_url($file->ID).'</option>';
                 }else{
              echo '<option value="'.$pdf[]= wp_get_attachment_url($file->ID).'">'.$pdf[]= wp_get_attachment_url($file->ID).'</option>';
                 }
                $count++;
        }

The link should take you to the pdf instead on the single attachment template.

Note: I only sampled the foreach loop as that was the values that was being saved.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top