Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Wordpress backend (post-editor-panel) offers such an excellent tagging tool wherein we can choose from already existing tags. Is it possible to bring this functionality to the frontend without fancy ajax. Just with some good ol php. All I need is just a list of tags to choose from in the frontend and save it. I will need the functionality for both post types, default wp post type as well as for custom-post-type.

There is one similar question with an unaccepted answer. I tried to use the code in the suggested answer, but it is far from perfect and just returns empty radio-buttons. There is nothing on google on this topic, Please suggest the correction in the code. Thanks.

<?php
$taxonomies = array( 
    'wissen_tags'
);
$args = array(
    'orderby' => 'name',
    'order' => 'ASC',
    'hide_empty' => false
);

$terms = get_terms($taxonomies,$args);

if (count($terms) > 0):
$i = 0;
    foreach ($terms as $term): ?>
        <div class="wissen_tag_list">
            <input type="radio" value="<?php echo $term->term_id; ?>" name="wissen_tags" class="wissen_tag_list_ckb" <?php if ( $i == 0 ) { ?>checked<?php } ?>>
            <label class="wissen_tag_list_ckbl">
                <?php echo $term->name; ?>
            </label>
        </div>
<?php
    $i++; endforeach;
endif; ?>
share|improve this question
    
I've completely edited my answer after your question edit. –  G. M. Sep 3 '13 at 10:43
    
@G.M. I am now using the below code as a plugin and I guess the code is as precise and robust as it can be. In your honor, named it after you.. Heartfelt thanks man ! –  gurung Sep 3 '13 at 11:28
    
:) You are welcome. –  G. M. Sep 3 '13 at 11:40
    
@G.M. need help again, Your code works extremely well for normal-post-type but not for custom-post-type. On line 22, I changed the wp_set_post_terms to wp set object terms, this still allows me to save tags in normal-post-type but not in custom-post-type. Any inputs please. I have asked it as a new question here –  gurung Dec 7 '13 at 5:10
    
I've updated the code also changing wp_get_post_terms to wp_get_object_terms. Try now. –  G. M. Dec 7 '13 at 6:51
show 1 more comment

1 Answer

up vote 1 down vote accepted

Notice: completely update code after OP update answer.

Assuming you want to update in front-end the taxonomy 'post_tag' (the standard tags) fro standard post and a taxonomy called 'research-sections' for a custom post type called 'research'.

Probably you have to put the form in both single.php and single-research.php and in both you have to some stuff... because is always better having a DRY code, and related to WP is always better keep templates clean, I suggest you to put all the functional code in a plugin or in functions.php and modify as less as possible the templates.

You need essentially 2 functions: one that output the form, another that saves data.

For the first you can create your own action, in this way in template only thing you need is a do_action call.

For the function that saves data you can hook a standard WP action, like init.

The code:

add_action('init', 'frontend_term_assignment');
add_action('frontend_term_assignment_form', 'frontend_term_assignment_form');

function frontend_term_assignment() {
  if (
    ! isset($_POST['term_assignment_post_id']) ||
    ! intval($_POST['term_assignment_post_id']) ||
    ! current_user_can('edit_posts', $_POST['term_assignment_post_id']) ||
    ! isset( $_POST['term_assignment_nonce'] ) ||
    ! wp_verify_nonce($_POST['term_assignment_nonce'], 'frontend_term_assignment')
  ) return;
  $post = get_post( $_POST['term_assignment_post_id'] );
  $taxonomy = null;
  if ( $post->post_type == 'post' ) {
    $taxonomy = 'post_tag';
  } elseif ( $post->post_type == 'research' )  {
    $taxonomy = 'research-sections';
  }
  if ( empty($taxonomy) || ! isset($_POST[$taxonomy]) ) return;
  $terms = $_POST[$taxonomy];
  wp_set_object_terms( $post->ID, $terms, $taxonomy, false);
}

function frontend_term_assignment_form() {
  $post = get_queried_object();
  if ( empty($post) || ! isset($post->ID) || ! current_user_can('edit_posts', $post->ID) ) return;
  $taxonomy = null;
  if ( $post->post_type == 'post' ) {
    $taxonomy = 'post_tag';
  } elseif ( $post->post_type == 'research' )  {
    $taxonomy = 'research-sections';
  }
  if ( empty($taxonomy) ) return;
  $tax_obj = get_taxonomy($taxonomy);
  $args = array('orderby' => 'name', 'order' => 'ASC', 'hide_empty' => false );
  $terms = get_terms($taxonomy, $args);
  $post_terms = (array)wp_get_object_terms( $post->ID, $taxonomy, array("fields" => "ids") );
  if ( ! empty($terms) ) {
    echo '<form method="post" id="frontend_term_assignment_form">';
    echo '<input type="hidden" value="' . wp_create_nonce('frontend_term_assignment') . '" name="term_assignment_nonce">';
    echo '<input type="hidden" value="' . $post->ID . '" name="term_assignment_post_id">';
    echo '<div class="' . $taxonomy . '_term_list"><ul>';
    foreach ($terms as $term ) {
      $checked = in_array($term->term_id, $post_terms) ? checked(1, 1, 0) : '';
      printf('<li><label><input type="checkbox" value="%s" name="%s[]"%s> ' . $term->name . '</label></li>', $term->slug, $taxonomy, $checked);
    }
    echo '</ul><input type="submit" value="' . esc_attr( sprintf(__('Save %s'), $tax_obj->label) ) . '" />';
    echo '</div></form>';
  }
}

I've added security check like check the current user capabilities and a nonce check.

Almost all work are done.

Now in the templates (both single.php and single-research.php) just add the do_action after your loop:

<?php while ( have_posts() ) : the_post(); ?>
  ...Your loop code here ...
<?php endwhile; ?>

<?php
// Nothing else is required here!
do_action('frontend_term_assignment_form');
?>

That's all. Hope it helps.

share|improve this answer
    
thank you for the response. yes I am trying to assign tags to single posts. I intend to wrap the solution code in if (current_user_can('manage_options', $post->ID)) to deny access to others. Please allow me a few minutes to test your solution. –  gurung Sep 3 '13 at 6:06
    
Unfortunately, the code throws a Syntax error, unexpected T_VARIABLE on line 3, which is $post_id = isset($the_post->ID) $the_post->ID : 0; ? –  gurung Sep 3 '13 at 6:10
    
,now it throws Fatal error: Call to undefined function get_the_term() in /home2/site/public_html/wp-content/themes/theme/single.php on line 207. any ideas? –  gurung Sep 3 '13 at 7:01
    
Just so you know, eventually I aim to work with multiple tags. I was about to ask this later how to utilize this code for multiple tags. <input type="checkbox" value="<?php echo $term->term_id; ?>" name="wissen_tags[]" class="wissen_tag_list_ckb"> –  gurung Sep 3 '13 at 7:10
    
sorry, but it still throws a different error Fatal error: Cannot use object of type WP_Error as array in /home2/site/public_html/wp-includes/functions.php on line 2688 –  gurung Sep 3 '13 at 8:25
show 1 more comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.